做压测时,磁盘突然满了,造成测试中断。
环境:
- 根目录只有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
发现磁盘空间大了很多