zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Solve Disk Space Occupancy Rate in Linux & Clear Docker logs

LinuxampDocker in space disk Clear Logs
2023-09-11 14:16:16 时间

  

首选要查找占用大量磁盘空间的文件,基本是长久不清理的日志文件

  1. du --exclude=/proc --total -sh /* | sort -hr

     

  2. find / ! -path '/proc*' -size +200M -print

       

通过上面两台命令可以快速找出大文件,但是不能贸然删除日志文件,否则很可能出现删除文件后,空间仍然得不到释放

删除文件后,空间不释放的情况,很可能是文件被进程锁住,或者是有进程一直往文件写数据.

 

文件在Linux系统中分两部分:

  • 指针部分:存在文件系统的meta-data中,执行rm删除后,指针就从meta-data中被清除了
  • 数据部分:数据就是文件本身,当指针被从文件系统meta-data中清除后,数据部分被标记为可用,就可以覆盖,写入新数据了

删除日志文件后,空间得不到释放,就是由于进程还在占用文件,指针并没有从文件系统meta-data中清理掉

 

我们可以重启进程,甚至重启系统,但对于生产环境是绝对不行的

生产环境最安全的方式是

> file
:> file
echo '' > file

通过上面的方式,会释放占用的磁盘空间,也不会影响进程的继续执行

 

Experiment:

  1. dd if=/dev/zero of=/root/uiop bs=1M count=2048

     

      产生了一个2G的文件,Inode为136198

  2. 模拟占用文件
    tail -F uiop

     

  3. 查看磁盘空间

     

    df & du 统计会有一定差异

  4. 删除文件再次统计

     

    du 统计的结果发生变化,但是df 仍然没变
    lsof查看

       inode号码是相同的

所以直接删除文件是危险的

 

下面是清空文件的方式结果

 

Docker

  1. docker logs -f --since 30s container
    docker logs -f --tail 20 container
    
    : > $(docker inspect --format '{{.LogPath}}' container)

     

  2. bash -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'

     

  3. logrorate
    /var/lib/docker/containers/*/*.log {
      rotate 7
      daily
      compress
      missingok
      delaycompress
      copytruncate
    }

    Once you have configured Logrotate for you Docker container you can test it with logrotate -fv /etc/logrotate.d/docker-container. You should get some output and a new log file with suffix [CONTAINER ID]-json.log.1 should be created. This file is compressed in next rotation cycle.