Linux文件句柄未释放
目录
事件起因
今天早晨系统告警磁盘空间不足,因为某个服务一直在刷错误日志,磁盘爆了,我把容器删除重新起了一个。
df -h
后磁盘空间没有释放
du -sh
统计没有占用那么多空间
通过指令:lsof | grep deleted
指令,查看当前系统句柄未释放情况
因为都是容器空间,所以只查看容器进程未释放的文件句柄。
lsof | grep deleted
lsof -p 3495 | grep deleted
lsof -p $(ps aux |grep dockerd |grep -v grep |awk '{print$2}') | grep deleted
发现有很多已经不存在的容器空间文件句柄未释放。
问题找到后怎么解决,有两种方法。
1、将当前线程进行重启,关闭线程,从而让句柄释放,释放空间。
2、找到指定的文件句柄,将当前文件句柄的大小设置为空。
第一种方法频繁重启不适合当前业务场景在生产环境不适用,采用第二种方法。
通过lsof | grep deleted
拿到 PID(进程标识符)和 FD(文件描述符,应用程序通过文件描述符识别该文件。)
置空文件内容
echo > /proc/${pid}/fd/${fd}
echo > /proc/3840/fd/124
或者
truncate -s 0 /proc/${pid}/fd/${fd}
truncate -s 0 /proc/3840/fd/124
然后查看磁盘使用发现空间恢复了