王芳的技术写作 —— 文档与分享

Linux 磁盘空间告警:一次 df -h 引发的排查

半夜两点,监控告警:磁盘使用率 95%。SSH 上去 df -h 一看,根分区用了 60%,还有 40% 空着。但应用日志里全是 No space left on device。有空间却写不进——这是经典的 inode 耗尽。

inode 是什么

简单说:磁盘空间分两部分,block 存文件内容,inode 存文件元数据(每个文件占一个 inode)。df -h 看的是 block,df -i 看的是 inode。block 有剩余但 inode 用完了,照样写不进文件。

验证:

$ df -i /
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/vda1     1310720 1310715     5  100% /

果然,inode 100%,只剩 5 个。

找元凶:谁创建了 130 万个文件

# 按目录统计文件数,揪出大户
for d in /*; do echo "$d: $(find $d -xdev 2>/dev/null | wc -l)"; done | sort -t: -k2 -nr | head -5

查出来是 /var/spool/postfix/maildrop/ —— 300 多万个小文件。原因是这台机器的 cron 任务有输出,但没装 MTA,邮件投递不出去,全堆在 maildrop 里了。每个邮件一个文件,几年下来把 inode 吃光了。

清理 + 根治

# 清理(文件太多,rm 会卡,用 find 分批删)
find /var/spool/postfix/maildrop/ -type f -delete

# 根治一:cron 输出重定向到 /dev/null
# crontab 里:
* * * * * /path/to/job >/dev/null 2>&1

# 根治二:或者装个 MTA 让邮件能发出去
# 根治三:监控加 df -i,别只看 df -h

删了 20 分钟,inode 降到 3%,应用恢复。虚惊一场。

其他常见的 inode 杀手

监控磁盘只看 df -h 是不够的,df -i 也加上。两个都告警,才算完整。

这次最大的收获:No space left on device 不一定是空间满了,先 df -i 看一眼,30 秒就能定位方向。

← 返回首页