磁盘告警经常发生在最不方便的时间。直接删除大文件虽然能暂时止血,却可能破坏数据库或让问题很快复发。我的排查顺序通常从文件系统开始,再逐层缩小范围。
确认是容量还是 inode
df -hT
df -ih
df -h 显示容量,df -i 显示 inode。大量零碎缓存文件可能没有占满容量,却耗尽 inode,表现同样是无法创建新文件。
寻找增长最快的目录
du -xhd1 / 2>/dev/null | sort -h
du -xhd1 /var 2>/dev/null | sort -h
find /var/log -type f -size +100M -printf '%s %p\n' | sort -n
-x 可以避免跨到其他挂载点。不要一开始就在根目录执行无限深度的扫描,这会带来明显 IO 压力。
别漏掉“已删除但仍被占用”的文件
lsof +L1
进程仍持有已经删除的日志文件时,du 看不到它,df 却不会释放空间。此时应让对应服务重新打开日志,通常是安全地 reload 或 restart,而不是强行处理文件描述符。
处理后建立限制
确认来源后,再检查 logrotate、systemd journal、容器日志或应用缓存策略。可以用 journalctl --vacuum-time=14d 控制历史日志,但执行前应确认日志保留要求。一次好的磁盘排查,最后应该留下限制策略和监控阈值,而不只是腾出几 GB 空间。