Solve Disk Space Occupancy Rate in Linux & Clear Docker logs
首选要查找占用大量磁盘空间的文件,基本是长久不清理的日志文件
-
du --exclude=/proc --total -sh /* | sort -hr
-
find / ! -path '/proc*' -size +200M -print
通过上面两台命令可以快速找出大文件,但是不能贸然删除日志文件,否则很可能出现删除文件后,空间仍然得不到释放
删除文件后,空间不释放的情况,很可能是文件被进程锁住,或者是有进程一直往文件写数据.
文件在Linux系统中分两部分:
- 指针部分:存在文件系统的meta-data中,执行rm删除后,指针就从meta-data中被清除了
- 数据部分:数据就是文件本身,当指针被从文件系统meta-data中清除后,数据部分被标记为可用,就可以覆盖,写入新数据了
删除日志文件后,空间得不到释放,就是由于进程还在占用文件,指针并没有从文件系统meta-data中清理掉
我们可以重启进程,甚至重启系统,但对于生产环境是绝对不行的
生产环境最安全的方式是
> file
:> file
echo '' > file
通过上面的方式,会释放占用的磁盘空间,也不会影响进程的继续执行
Experiment:
-
dd if=/dev/zero of=/root/uiop bs=1M count=2048
产生了一个2G的文件,Inode为136198
- 模拟占用文件
tail -F uiop
- 查看磁盘空间
df & du 统计会有一定差异
-
删除文件再次统计

du 统计的结果发生变化,但是df 仍然没变
lsof查看
inode号码是相同的
所以直接删除文件是危险的
下面是清空文件的方式结果

Docker
-
docker logs -f --since 30s container docker logs -f --tail 20 container : > $(docker inspect --format '{{.LogPath}}' container)
-
bash -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
- 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.1should be created. This file is compressed in next rotation cycle.

浙公网安备 33010602011771号