记一次磁盘不足的排查过程

做压测时,磁盘突然满了,造成测试中断。
环境:

  • 根目录只有50G,其他磁盘都分home(很大)
  • docker容器都映射日志到统一的日志目录
  • docker未修改默认镜像容器目录

1.通过df -h查看,确实提示使用100%

2.把容器的应用日志移到home分区

通过建立home分区的软链接ln -s /home/log /data/log

3.把数据库的日志也建立软链接到home分区

ln -s /home/db/log /opt/db/log
具体可见:https://blog.csdn.net/atzqtzq/article/details/122754717

4.通过docker system df -v,查看镜像和容器大小

  • 不需要的镜像删除
  • 删除容器内的日志,发现个别容器占用磁盘很大,经找原因是nacos有两部分日志,一部分日志还在容器里未映射出来,造成容器很大,修改日志等级解决,根本还是需要都映射出单独的日志分区

5.再次通过df -h查看,发现空闲了部分磁盘空间

但好像隐隐不对,释放的空间应该更多啊

6.通过在根目录执行du -sh *,显示实际文件占用大小 远小于df -h显示的实际磁盘占用大小。

查询当前文件夹的大小排序
du -h * | sort -nr

7.通过df -i,显示inode未满

不过通过查看inode,发现gis应用的瓦片图层很多4k小文件,可以在这方面优化

#当前根目录下执行
for i in /*; do echo $i ; find $i | wc -l; done
#再执行上述命令,就这样层层深入最终确定是那个目录文件最多
for i in /user/*; do echo $i ; find $i | wc -l; done

#查看block大小
dumpe2fs  /dev/sda1|grep -i "block size"(block默认大小1k(boot分区)或4K(非系统分区默认为4K))

#查看Inode大小
dumpe2fs  /dev/sda1|grep -i "Inode size"  linux的centos5.8是128字节,6.4是256字节

8.到这,基本确实是删除的文件,未及时回收,造成空间没有被释放

  • 安装lsof
#下载lsof
https://dl.packetstormsecurity.net/UNIX/IDS/lsof/lsof_4.76.tar.gz

#解压
tar -zxvf lsof_4.76.tar.gz

#再解压
cd lsof_4.76
tar -xvf lsof_4.76_src.tar

# 编译,有确认,都按"y"确认
cd lsof_4.76_src
./Configure linux

#生成
make

#创建软链接
ln -s /root/songzehao/lsof_4.76/lsof_4.76_src/lsof /usr/bin
  • 使用lsof |grep deleted,查询到大量未释放的空间应用
    lsof 参数说明,参考:
    https://cloud.tencent.com/developer/article/1591481?from=15425
  • 使用ps -aux|grep {pid},查询到都是僵尸进程
    进程状态说明,参考:
    https://blog.csdn.net/qq_21989927/article/details/109299176
  • 使用kill -9 {pid},结束进程
  • 使用df -h发现磁盘空间大了很多

9.未确定docker挂载的方式会不会存在空闲挂载未使用却依然占用空间的问题

上一篇:docker学习笔记


下一篇:DDD—Repository仓储&工厂模式