0%

Linux文件句柄未释放

事件起因

今天早晨系统告警磁盘空间不足,因为某个服务一直在刷错误日志,磁盘爆了,我把容器删除重新起了一个。

df -h后磁盘空间没有释放

du -sh统计没有占用那么多空间

通过指令:lsof | grep deleted 指令,查看当前系统句柄未释放情况

因为都是容器空间,所以只查看容器进程未释放的文件句柄。

1
2
3
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(文件描述符,应用程序通过文件描述符识别该文件。)

置空文件内容

1
2
3
4
5
echo > /proc/${pid}/fd/${fd}
echo > /proc/3840/fd/124
或者
truncate -s 0 /proc/${pid}/fd/${fd}
truncate -s 0 /proc/3840/fd/124

然后查看磁盘使用发现空间恢复了

-------------    本文结束  感谢您的阅读    -------------
请作者一杯咖啡。