网站突然写不进数据,上传图片报失败,数据库开始拒绝写入。登上机器 df 一看,使用率 100%。这种故障不复杂,但它有个特别坑的地方:你按常规思路用 du 去找大文件,把所有目录的大小加起来,发现远远小于磁盘用量。两个数对不上。
对不上通常有三个原因。第一个最常见:文件被删了,但还被某个进程占着。Linux 下删文件只是删了目录项,只要还有进程打开着它,inode 就不会释放,空间也不会还给你。日志轮转最容易撞上这个——你 rm 掉了一个几个 G 的日志,df 一点没变,就是因为写日志的进程还攥着那个文件句柄。
第二个原因是挂载点被覆盖。你在 /data 上挂了块新盘,可 /data 目录里本来就有文件,挂载之后那些老文件被遮住了,df 算的是新盘,du 算的是新盘上的内容,老文件占的空间哪边都看不见。umount 之后才能看见真身。
第三个是 inode 耗尽,这个单独拎出来说。磁盘还剩一半空间,但就是写不进去,报 No space left on device。df -i 一看,inode 用完了。小文件特别多的场景容易中招——邮件队列、session 目录、碎文件缓存,每个文件吃掉一个 inode,数量攒起来比体积涨得快。
#!/bin/bash
# 磁盘满排查:df/du 对不上时的三板斧
echo "=== 1. 空间与 inode 双看 ==="
df -h / | tail -n 1
df -i / | tail -n 1
echo "=== 2. 已删除但仍被占用的文件(空间没释放的元凶)==="
lsof +L1 2>/dev/null | head -n 20
# 等价写法:lsof | grep -i deleted
echo "=== 3. 当前目录下各子目录体积 TOP 10 ==="
du -h --max-depth=1 / 2>/dev/null | sort -rh | head -n 10
echo "=== 4. 全盘找大于 500MB 的文件 ==="
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null \
| awk "{print \$5, \$9}" | sort -rh | head -n 20
echo "=== 5. systemd 日志占用 ==="
journalctl --disk-usage 2>/dev/null
找到占着已删除文件的进程之后,正确做法不是杀进程,是给它发信号让它重新打开日志文件。对 Nginx 来说就是 nginx -s reopen,或者 kill -USR1 加主进程号。服务会新建一个日志文件继续写,老文件的句柄就放开了,空间立刻回来。直接重启服务也能达到同样效果,代价是中断一下。
根治办法是把日志轮转配好。logrotate 是干这个的标准工具,按天切、保留几份、压缩归档都能设。关键的一点是切完之后要通知服务重新打开文件,logrotate 的 postrotate 段就是干这个的。配了轮转却忘了通知,等于每天生成一个空的新日志,老日志继续被进程占着涨,跟没配一样。
# /etc/logrotate.d/nginx
# 按天轮转,保留14份,压缩,切完通知 Nginx 重开日志
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
# 关键:不通知重开的话,空间不会释放
if [ -f /run/nginx.pid ]; then
kill -USR1 $(cat /run/nginx.pid)
fi
endscript
}
# systemd journal 瘦身:限制总占用不超过 500MB
# 写入 /etc/systemd/journald.conf
# SystemMaxUse=500M
# 然后:systemctl restart systemd-journald
# 或立即清理:journalctl --vacuum-size=500M
还有个容易被忽略的角落:/tmp 和 /var/tmp。很多程序往那儿扔临时文件,出异常时不会清理。装了面板的机器尤其明显,面板自己的备份、临时包、更新缓存,几个月攒下来能吃掉十几个 G。定期看一眼这两个目录,成本极低。
说完排查,说预防。磁盘使用率超过 80% 就该有告警,别等到 100% 才动手——满了之后数据库可能已经写坏表了,那时候不仅要清空间,还得修数据,麻烦翻倍。监控上加一条磁盘水位告警,比任何排查技巧都值钱。
相关阅读:磁盘满是五层定位法里系统层的高发故障。《服务器故障排查总纲:按现象反查的五层定位法》把它归在系统层,配套的 inode 耗尽、binlog 膨胀在总纲里都有对应单篇,先定层再排查,不绕路。
A5创业网 版权所有