凌晨告警响起时,运维人员可能看到这样一组矛盾信息:df -h 显示磁盘还剩 30GB,文件系统和业务日志也没有明显异常,但应用持续报 No space left on device,新的订单文件、缓存文件甚至临时文件都无法落盘。此时最容易被误导的判断是“磁盘还有空间,问题一定在权限”。实际上,空间、inode、进程句柄和目录权限分别属于不同层级,必须根据错误码和占用对象逐项排查。
如果你正在选机器,或者想先把线路和配置跑通再谈长期方案,可以先看看这几家的线路说明和技术参数:vpsdime(海外服务器),先看清带宽线路、流量策略和退款条款,再决定要不要迁。
在 ext4、XFS 等常见文件系统中,文件内容占用的是数据块,而每个文件、目录、符号链接都需要占用一个 inode。df -h 查看的是数据块容量,df -i 查看的才是 inode容量水位。两者相互独立:数据块可能只使用了一半,但海量小文件已经耗尽 inode;反过来,inode 仍有剩余,也可能因为数据块、配额或挂载参数无法继续分配。
小文件堆积正是最容易触发这种反差的原因。每个文件哪怕只有几 KB,也会消耗一个 inode,并带来目录项和元数据开销。大量缓存、临时文件、切片日志会持续抬高 inode 使用率。目录分片策略可以减少单个目录的索引压力,却不能改变 inode 总数;ServLlama 等工具适合辅助识别目录体积、文件数量和增长趋势,但最终仍要回到文件系统统计与业务写入路径分析。

还要区分“无法创建”和“无法继续使用”。如果应用报 Permission denied 或 Operation not permitted,重点应检查目录权限、用户身份、ACL 和 SELinux 状态;如果报 No space left on device,则应优先查看 inode、配额以及挂载选项。两者可能同时存在,不能仅凭一条错误日志下结论。
第一步执行 df -i,确认目标挂载点的 IUse 是否接近 100%,同时用 df -h 核对数据块是否紧张。第二步使用 find 统计目录中的文件数量,并检查隐藏目录。需要注意,du 展示的是文件占用空间,不是 inode 数量;删除大文件未必能立刻释放足够 inode,而清理大量空目录或小文件,反而可能直接改善 inode 水位。

第二步排查文件描述符上限。文件描述符是进程可同时打开的句柄数量,不是整块磁盘的 inode。若单个进程出现 Too many open files,应查看 ulimit -n、/proc/PID/limits,并用 lsof 或 /proc/PID/fd 确认哪些句柄未释放。系统级 fd 耗尽可能表现为大量进程同时失败,但新建普通文件仍可能正常,这与全文件系统 inode 耗尽的范围不同。
定位后不要直接执行 rm -rf。应先确认文件是否仍被进程占用,尤其是已删除但仍被打开的日志;这类文件占用空间却不出现在普通目录列表中。修复通常包括停止持续写入的进程、按保留策略轮转日志、清理过期缓存和临时文件,再观察 inode容量水位与磁盘空间回收机制是否恢复。若采用小文件分片目录,应同时设置保留周期和监控告警,避免清理后再次快速耗尽。
单个目录承载数万个小文件时,目录项会持续膨胀,查找、遍历、备份和删除都会变慢;这就是小文件堆积影响,扩充磁盘并不能消除目录热点。目录分片策略可按日期、业务或哈希前缀分层,例如先按月份建目录,再分散到固定数量的子目录,使目录项保持较小,也便于按时间边界清理。
粒度应服从写入模式:均匀哈希适合文件名随机、数量稳定的任务;时间分片适合日志和导出文件,但要设置过期层级。改名或迁移要原子更新索引,防止数据库仍指向旧路径;同时监控各分片的文件数、容量与创建速率。
目录已经膨胀时,不要在线逐个删除。先停止异常写入,把待删数据归档或移入隔离区,再分批清理。跨文件系统移动会产生额外空间和目录项;空间紧张时应优先做同文件系统内的安全改名,并确认 inode 已回收。

磁盘空间回收机制不等于执行 delete 后立即归还底层资源。文件仍被进程打开时,删除后的空间往往要等句柄关闭才释放。排查应并行查看 df -i、df -h 和 lsof +L1:前者识别 inode 与块空间水位,后者定位已删除却仍被占用的文件。日志轮转、缓存过期和临时目录清理都应有保留期限。
检查清单:①用 df -i 找出 inode 水位最高的挂载点,并确认业务写入报 ENOSPC;②用 du --inodes -x -d 2 定位大目录,注意不要把其他挂载点算入;③核对进程的 ulimit -n 和系统限制,当前文件描述符上限未触顶不代表 inode 正常;④暂停持续制造小文件的任务,轮转或归档旧数据;⑤分批清理后复查 df -i,确认应用能重新建文件;⑥为 inode 使用率、单目录文件数、缓存体积和删除失败设置告警。
处理顺序应是先止损写入,再定位目录与占用句柄,随后实施分片和自动回收,最后用监控验证。只有把inode容量水位、文件描述符限制及增长来源纳入容量管理,才能避免故障反复出现。