公司服务器的一些软件使用了容器技术,比如Podman、Docker,从架设到现在已经稳定运行了1年半了,半年前发现磁盘占用比较大,/var/lib/containers占用了260G的磁盘空间,重启了一下容器,磁盘空间降下来了不少,同时由于这个目录下存的都是容器的磁盘文件,不能乱动,所以也就没管它。

昨天处理了Jira所在服务器由于磁盘空间不足导致的问题,参见 JIRA维护记——使用原实例位置恢复数据,担心这个服务器在某个时间也出现磁盘空间不足导致问题,所以今天来仔细查一下。

/var/lib/containers/storage目录使用du -sh * | sort -hr | head -5命令查看此目录下的占用最多的前5个目录:

1$ du -sh * | sort -hr | head -5
2212G    overlay-containers
328G     overlay
42.4G    volumes
524M     overlay-layers
61020K   libpod

overlay-containers占用高达212G,该分区总共才295G。

du -sh *只能统计当前目录,不能统计子目录,为了更快定位目录,使用du -h -d 10命令列出10层子目录内的信息,子目录层数可以根据情况调整。完整命令du -h -d 10 | sort -hr | head -10

 1$ du -h -d 10 | sort -hr | head -10
 2243G    .
 3212G    ./overlay-containers/0836bd03d25f8080ef8dc28fc17326eec556ac936273f5933d92a32a09d65658/userdata
 4212G    ./overlay-containers/0836bd03d25f8080ef8dc28fc17326eec556ac936273f5933d92a32a09d65658
 5212G    ./overlay-containers
 628G     ./overlay
 76.8G    ./overlay/983650496b3437c000dc399af5b842638b6feec7d1bf6f6a662e11c542ca1800
 83.8G    ./overlay/983650496b3437c000dc399af5b842638b6feec7d1bf6f6a662e11c542ca1800/merged
 93.1G    ./overlay/983650496b3437c000dc399af5b842638b6feec7d1bf6f6a662e11c542ca1800/diff
102.6G    ./overlay/58f71749e43e3f55e6665e8bed8f97763110b52e8bb67dc97557310e1314d4cf/merged
112.6G    ./overlay/58f71749e43e3f55e6665e8bed8f97763110b52e8bb67dc97557310e1314d4cf

可以看到是某个容器的数据占用了212G,直接进入/var/lib/containers/storage/overlay-containers/0836bd03d25f8080ef8dc28fc17326eec556ac936273f5933d92a32a09d65658/userdata,使用ll -h查看:

 1$ ll -h
 2total 212G
 3drwx------ 6 root root 4.0K Jun  8 10:12 ./
 4drwx------ 3 root root 4.0K Dec  2  2021 ../
 5drwxr-xr-x 2 root root 4.0K Dec  2  2021 artifacts/
 6srwx------ 1 root root    0 Apr  5 15:35 attach=
 7-rw------- 1 root root  24K Dec  2  2021 buildah.json
 8-rw-r--r-- 1 root root  32K Apr  5 15:35 config.json
 9prw-r--r-- 1 root root    0 Apr  5 15:35 ctl|
10-rw------- 1 root root 212G Jun  8 10:13 ctr.log
11drwxr-xr-x 3 root root 4.0K Dec  8  2021 d811302d8e3f1e272b8213e07b4e2a7da260fba273216e75eafcc44dff3aab2e/
12drw-r--r-- 2 root root 4.0K Dec  2  2021 secrets/
13drwxrwxrwt 3 root root   80 Apr  5 15:35 shm/
14prw-r--r-- 1 root root    0 Apr  5 15:35 winsz|

发现是一个日志文件ctr.log,占用高达212G。其实可以使用du -ah -d 10直接列出10层子目录内的所有文件和目录的大小,完整命令:du -ah -d 10 | sort -hr | head -30 ,可以直接找出最大的30个文件和目录。

网上查了一些资料: Podman log file max size limit not working [Question] Is there a way to limit the size of the logs? 这些基本上都是在创建容器时添加参数--log-opt max-size=限制大小,但是我的是容器已经运行很久了,不能使用这种方法。

笔者使用了一种简单粗暴的方法echo "" > ctr.log来解决,立马降下来了,经查是Gitlab所在容器,经过测试Gitlab,没发现异常。

参考: 记一次 Docker overlay 占用磁盘 100% 的问题