连载中 14/20

磁盘管理:df 满了 du 却找不到,灵异事件破案实录

2026-10-18 · 25 阅读 · 0 评论 · 0 赞

两个尺子: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 必修课——免密登录、多服务器别名,还有一条隧道访问内网数据库。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#磁盘管理#df#du#inode#lsof

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10114 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9877 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9307 阅读 · 21 评论 · 287 赞