Linux 磁盘空间异常排查:从 df 到 lsof 的完整路径

举报
yd_245145476 发表于 2026/11/05 09:43:01 2026/11/05
【摘要】 线上磁盘告警时,df 与 du 常常对不上。本文按 df、df -i、du、lsof +L1 的顺序梳理排查路径,解释已删除未释放文件与 inode 耗尽的成因,并给出日志与临时目录的治理建议。

一、先分清 df 和 du 的差异

线上磁盘告警时,第一反应通常是执行 df -h。它统计的是文件系统层面的块使用量,而 du -sh 统计的是目录下文件的实际占用。两者经常对不上,最常见的原因是文件已被删除但仍被进程占用。

df -h
du -sh /* 2>/dev/null | sort -h | tail -n 10

如果 df 显示 95%,而 du 加总只有 40%,基本可以判定存在「已删除但未释放」的文件。

二、定位被删除但仍打开的文件

Linux 下删除文件只是移除目录项,只要还有进程持有文件描述符,数据块就不会释放。可以用 lsof 查找:

lsof +L1

输出中 NLINK 为 0 的条目就是这类文件。找到对应进程后,重启进程或让进程重新打开日志文件即可释放空间。对于日志场景,更优雅的做法是通知进程重新打开文件,而不是直接 kill:

kill -USR1 <pid>

多数服务(Nginx、部分 Java 应用)收到 USR1 会重新打开日志文件。

三、inode 耗尽也会报「磁盘满」

df -i 查看 inode 使用率,这一点常被忽略。大量小文件(缓存、会话文件、临时上传分片)会先耗尽 inode,此时 df -h 可能还有空间,但写入会直接失败并提示 No space left on device。

df -i
find /var/tmp -type f | wc -l

排查时按目录统计文件数量,找到小文件聚集的目录后,优先检查业务是否缺少清理策略。

四、日志与临时目录的治理

常见的高占用目录包括 /var/log、/tmp、容器运行目录和应用的本地缓存。建议:

  1. 日志按天切割并设置保留天数,避免单文件无限增长;
  2. 临时文件写入后及时清理,或使用带过期策略的目录;
  3. 容器场景注意镜像层与可写层分离,日志不要直接写在容器可写层;
  4. 对关键目录配置监控告警,而不是等到 95% 才处理。

五、一次完整的排查顺序

建议固定为:df -h 看整体 → df -i 看 inode → du 定位大目录 → lsof +L1 找已删除文件 → 检查日志与临时目录 → 确认清理策略。顺序固定后,多数磁盘问题可以在几分钟内定位,而不是盲目删除文件。

需要强调的是,清理只是止血手段。真正要解决的是「为什么会涨到 95%」:是日志没有轮转,还是临时文件没有生命周期,抑或是业务写入量突增。把根因补上,告警才不会反复出现。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。