用 df -i 与 find 定位并清理 inode 耗尽:从排查到预防

举报
yd_229231784 发表于 2026/11/11 07:28:50 2026/11/11
【摘要】 文章面向 Linux 运维场景,介绍如何用 df -i 判断 inode 耗尽分区,再用 find -xdev 按目录统计文件数定位海量小文件目录,清理后对比 inode 回收量,并给出 tmp 与缓存堆积的最小预防措施与限制说明。

用 df -i 排查 inode 耗尽:定位海量小文件并清理

问题场景

Linux 的 ext4、XFS 等文件系统会用 inode 记录文件元数据。磁盘块还有空间,但 inode 用满时,创建新文件可能报 No space left on device;df -h 仍显示有空间,df -i 的 IUse% 却接近或达到 100%。常见诱因是临时文件、会话文件、缓存、小日志、队列落盘文件等海量小文件堆积。排查目标不是先删大文件,而是先确认哪个分区 inode 满,再定位文件数量最多的目录。

第一步:确认 inode 用满的分区

df -i
# 或者只观察目标挂载点
df -i /data

观察 Filesystem、Inodes、IUsed、IFree、IUse%。IUse% 高且 IFree 很小,说明该分区 inode 接近耗尽。把 Mounted on 列记录的挂载点作为下一步的 TARGET。不要对整机根目录盲目清理。

第二步:按目录统计文件数,定位海量小文件

在确认的分区上执行(GNU find;把 /data 换成实际挂载点):

TARGET=/data

sudo find "$TARGET" -xdev -type f -printf '%h\n' 2>/dev/null \
  | sort \
  | uniq -c \
  | sort -rn \
  | head -n 20

运行方法:登录主机,逐段复制执行;第一段设置目标挂载点,第二段输出文件数最多的 20 个目录。-xdev 表示不跨越到其他文件系统,避免把挂载在下面的目录算进来;-type f 只统计普通文件;-printf '%h\n' 输出每个文件所在目录;uniq -c 统计每个目录出现次数,再倒序取前 20。输出的第一列是文件数,第二列是目录路径。

如果想确认某目录大致有多少文件:

sudo find /data/app/tmp -xdev -type f -printf '.' 2>/dev/null | wc -c

这里用 . 计数,不依赖文件名换行;但输出是字节数,适合快速估算普通文件数量,不适合统计目录本身。

第三步:清理前后对比 inode 回收量

先记录清理前数值:

df -i /data

进入已确认的临时或缓存目录,先列出候选文件,确认路径、时间和业务影响后再删除:

# 示例:列出 /data/app/tmp 下 7 天前的普通文件
sudo find /data/app/tmp -xdev -type f -mtime +7 -print | head -n 50

# 确认无误后,再执行删除(示例路径,按实际替换)
sudo find /data/app/tmp -xdev -type f -mtime +7 -delete

清理后再次执行 df -i /data,对比 IUsed 和 IFree 的变化,即可得到该次清理大约回收的 inode 数量。注意:删除正在被进程打开的文件,df -i 可能不会立即下降;需要让相关进程关闭文件句柄或重启服务。若文件数统计不高但 inode 仍满,可用 lsof +L1 检查已删除但仍被占用的文件(需安装并具备权限),这属于另一种边界情况。

预防 tmp 与缓存堆积的最小措施

  1. 给临时目录设置定期清理。使用系统已有的 tmpfiles 机制时,可增加配置并在维护窗口执行清理:
# /etc/tmpfiles.d/app-tmp.conf(示例,路径和用户按实际修改)
d /data/app/tmp 0750 app app 7d
sudo systemd-tmpfiles --clean
  1. 应用缓存设置 TTL 和最大文件数或容量,写入前检查目录文件数;会话文件按过期时间清理。
  2. 日志按大小或时间轮转,避免按请求生成独立小文件;队列落盘文件处理成功后及时删除。
  3. 监控 df -i,对 IUse% 设置告警阈值;容量监控不能只看 df -h。
  4. 对共享缓存目录按业务分目录,便于用上面的 find 统计快速定位。

边界与限制

  • find -printf 是 GNU find 扩展,BusyBox、部分 BSD/macOS 环境不支持;可改用 find ... -exec dirname {} \;,但速度较慢。
  • 使用 %h\n 统计时,文件名含换行会干扰 sort/uniq 的行计数;生产环境可改用 NUL 分隔的 GNU 工具链,或先确认命名规范。
  • -xdev 只统计同一文件系统;如果目标目录下有独立挂载点,需要分别排查。
  • 容器、overlay、网络文件系统的 inode 统计口径可能不同,应以宿主机或存储侧指标为准。
  • 清理命令必须先 -print 审核,不要直接对未知目录执行 rm -rf;删除前确认备份、保留期和业务依赖。
  • 本文命令为通用示例,不承诺具体回收量;实际效果取决于文件数量、硬链接和打开文件状态。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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