记一次 Linux 服务器容量不够一直无法释放空间的问题
关键词:ncdu linux df 服务器空间释放
排查
线上服务器因为一直无法停机的原因,容量有些时候不太够用了,总是使用 ncdu
工具去查询容量占用然后清理一些日志或者缓存,日子也就这么勉强过来了。
但后期越发觉得不对劲,磁盘总容量为 200G,但 ncdu
查询永远只能扫描出 55G 的占用,而 df -h
则显示我磁盘已使用了 165G。我一开始以为是做了外部磁盘的挂载软连接,导致 df -h
或因软连接失效或因其他原因统计出占用。
不过线上服务器已经好几年没有停服了,我猜测是否和某些程序一直运行写入日志或者缓存导致空间无法释放。
在Linux系统中,如果文件被删除后,还有进程保持对该文件的打开句柄,那么这些文件虽然在文件系统中已经“消失”,但它们仍然占用着磁盘空间、df
命令会显示这些被删除文件占用的空间,而 ncdu
(或 du
)则不会统计这些文件
df
命令报告的是整个文件系统的空间使用情况,包括文件数据和元数据(如inode
)。而 ncdu
(或 du
)命令仅计算文件和目录的实际数据大小,不包括元数据
为了排查和解决这个问题可以执行这个命令
lsof | grep deleted
可以看见非常多的 delete 被标记删除的文件。
处理
处理有很多种方式
你可以
kill
掉这些使用,空间即可被释放重启服务器(重启解决 90% 问题
清空被持有的文件
前两种方案就不演示了,第三种可以这样做。
# 使用该命令找到对应的文件句柄
ls -l /proc/{PID}/fd/*
# 清空对应的文件
echo > /proc/{PID}/fd/{FD_NUM}
再去使用 df -lh
查看一下自己的磁盘空间吧,应该释放了。