用 df -i 与 find 定位并清理 inode 耗尽:从排查到预防
用 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 与缓存堆积的最小措施
- 给临时目录设置定期清理。使用系统已有的 tmpfiles 机制时,可增加配置并在维护窗口执行清理:
# /etc/tmpfiles.d/app-tmp.conf(示例,路径和用户按实际修改)
d /data/app/tmp 0750 app app 7d
sudo systemd-tmpfiles --clean
- 应用缓存设置 TTL 和最大文件数或容量,写入前检查目录文件数;会话文件按过期时间清理。
- 日志按大小或时间轮转,避免按请求生成独立小文件;队列落盘文件处理成功后及时删除。
- 监控
df -i,对IUse%设置告警阈值;容量监控不能只看df -h。 - 对共享缓存目录按业务分目录,便于用上面的
find统计快速定位。
边界与限制
find -printf是 GNU find 扩展,BusyBox、部分 BSD/macOS 环境不支持;可改用find ... -exec dirname {} \;,但速度较慢。- 使用
%h\n统计时,文件名含换行会干扰sort/uniq的行计数;生产环境可改用 NUL 分隔的 GNU 工具链,或先确认命名规范。 -xdev只统计同一文件系统;如果目标目录下有独立挂载点,需要分别排查。- 容器、overlay、网络文件系统的 inode 统计口径可能不同,应以宿主机或存储侧指标为准。
- 清理命令必须先
-print审核,不要直接对未知目录执行rm -rf;删除前确认备份、保留期和业务依赖。 - 本文命令为通用示例,不承诺具体回收量;实际效果取决于文件数量、硬链接和打开文件状态。
- 点赞
- 收藏
- 关注作者
评论(0)