什么是 inode 耗尽
传统文件系统(ext4、XFS、ZFS 之外多数)把 inode 看作固定资源:每个文件、目录、符号链接都占用至少一个 inode,inode 数量在建库时确定(ext4)或按需动态分配(XFS)。当 inode 用尽而块空间还有剩,就会出现“df 显示还有空间但就是创建不了文件”的经典故障,报错通常是 No space left on device,金额上却看不出空间问题。
基本信息
| 查看 | df -i 与 df -i /data |
|---|---|
| 定位 | find 统计各目录文件数,sort 排序取前几名 |
| ext4 行为 | inode 总数建库时固定,用尽后无法在线扩容 |
| XFS 行为 | inode 动态分配,通常不会因数量耗尽 |
| 极端值 | inode 使用率 100% 而空间使用率很低,即为典型特征 |
典型使用场景
- 写入报 No space left on device 但 df 还有空间时优先排查 inode
- 小文件密集型服务异常:缓存目录、会话文件、队列文件堆积
- 邮件与日志服务器:单目录几十万文件时 inode 消耗极快
- 备份与解压任务失败:大量小文件解包是最常见的触发场景
- 容量规划:新建文件系统时预估文件数量规模
排查流程
排查流程
df -i # 全局 inode 使用率
sudo df -i /data # 定位到具体文件系统
sudo find /data -xdev -type f -printf '%h\n' 2>/dev/null | sort | uniq -c | sort -rn | head
sudo find /data -xdev -type d -empty -delete # 清理空目录(确认后执行)
ls -U /data/some_dir | head # 目录内文件是否异常多
# ext4 可考虑重建文件系统提高 inode 密度,需要停机与迁移输出逐列读法
| 列 | 含义 | 异常表现 |
|---|---|---|
| Filesystem | 文件系统与挂载点 | 换挂载点后数值应与路径匹配 |
| Inodes | 该文件系统 inode 总量 | ext4 建库时固定 |
| IUsed | 已用数量 | 接近 Inodes 即告警 |
| IUse% | 使用率 | 100% 时无法新建文件 |
| Mounted on | 挂载点 | 用来确认清理目标目录 |
mkfs.ext4 的 -i(每多少字节一个 inode)与 -N(直接指定总数)可以在建库时提高 inode 密度,适合小文件密集的分区,空间代价是多占一些磁盘。
清理 inode 必须按目录批量确认:缓存目录、队列文件与业务数据混在一起时,直接按目录整删是常见的误删事故来源。