两个尺子:df 管分区,du 管目录
$ df -h # 各分区使用率(磁盘告警先看这里)
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 36G 4.2G 90% /
/dev/vdb1 200G 12G 188G 6% /data
$ du -sh /var/log # 某个目录总大小(-s 汇总 -h 人类可读)
$ du -sh /* 2>/dev/null | sort -rh | head # 根下谁最占,排行榜排查套路是先 df 锁定分区,再 du 逐层往下钻:du -sh /* → 大的进 → 再 du -sh * → 两三轮就挖到埋藏点。后端 90% 的磁盘满都是日志、临时文件、上传文件三兄弟。
灵异事件一:文件删了,空间不还
症状:df 显示 95%,du 全盘加起来却只有 50%,怎么翻都找不到大文件。真相:文件被进程打开着时删除,磁盘空间不会立刻释放——数据还挂在那个进程的句柄上,直到进程关闭文件或重启。
$ lsof +L1 | head -5 # 列出「已删除但仍被打开」的文件
java 1234 app 3w REG 253,1 18G 0 284812 /var/log/app/app.log (deleted)
↑该文件已删,但 java 还握着 18G
# 处置:重启对应进程(发布会),或对持有句柄的文件清零
$ echo > /proc/1234/fd/3 # 不重启释放空间的重招(慎用,先备份)预防姿势:清日志用 > app.log(截断)代替 rm app.log,或交给日志篇的 logrotate 管理。
灵异事件二:磁盘没满,却报 No space left
另一个隐形杀手:inode 耗尽。每个文件占一个 inode,海量小文件(缓存碎片、session 文件、邮件队列)能把 inode 吃光,而 df 看空间还剩一大半。
$ df -i # inode 使用率
/dev/vda1 2621440 2621440 0 100% /
$ find /data -type f | wc -l # 文件总数
$ find /data -type d -exec ls -l {} ; | awk '$2>10000' # 哪个目录文件数爆炸解法只有一条:找到小文件大户批量清理(find + rm 组合,第 3 篇讲过防呆姿势)。
10 分钟处置清单
1. df -h → 锁定爆掉的分区
2. df -i → 排除 inode 耗尽
3. du -sh /* | sort -rh | head → 逐层钻到具体目录
4. find 目录 -size +500M → 直接挖大文件
5. lsof +L1 → 排查已删未释放
6. 清理动作一律先 ls 预览再删,日志类用 > 截断挂载与数据盘迁移的 mount/fstab 姿势第 2 篇已经铺垫过,配合本篇的排查流程就闭环了。下一篇回到日常高频动作:SSH 必修课——免密登录、多服务器别名,还有一条隧道访问内网数据库。
评论 (0)