句柄释放问题都是说的直接kill进程,终于找到其他方法,记录一下。
系统告警磁盘空间不足,因为某个服务一直在刷错误日志,磁盘爆了。
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(文件描述符,应用程序通过文件描述符识别该文件。)
置空文件内容
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 |
然后查看磁盘使用发现空间恢复了