df 显示磁盘还有空间却无法写文件:Linux inode 耗尽排查与治理

应用报 No space left on device,但执行 df -h 明明还有几十 GB 空间。这类看似矛盾的问题,常见原因不是磁盘容量耗尽,而是 inode 用完了:文件系统还能容纳数据块,却已经无法再创建新的文件和目录。

一、同时检查容量和 inode

bash 复制代码
df -hT
df -ih

df -hT 看数据块使用率,df -ih 看 inode 使用率。如果某个挂载点 IUse% 接近 100%,即可确认问题方向。

inode 记录文件的元数据。大量小文件会快速消耗 inode,即使这些文件占用的总容量并不大。

二、定位哪个目录文件数量最多

先确认异常挂载点,再在该文件系统内逐层统计。假设问题发生在 /var:

bash 复制代码
sudo find /var -xdev -printf '%h\n' 2>/dev/null \
  | sort | uniq -c | sort -nr | head -30

也可以按一级目录统计文件数量:

bash 复制代码
for d in /var/*; do
  printf '%10s %s\n' "$(sudo find "$d" -xdev -type f 2>/dev/null | wc -l)" "$d"
done | sort -nr | head

-xdev 很重要,它避免跨越到其他挂载点。生产服务器上执行全盘 find 可能产生明显 IO,应该先从异常文件系统和可疑目录开始。

三、常见元凶

高频来源包括:

  • 应用按请求或任务生成大量临时文件;
  • PHP Session、邮件队列或爬虫缓存未清理;
  • 容器日志、overlay2 层或构建缓存产生海量小文件;
  • 监控、追踪和审计系统保存过细的分片;
  • 定时任务不断生成文件但没有生命周期策略;
  • 程序异常重试,每次失败都创建新文件。

检查近期快速增长的文件:

bash 复制代码
sudo find /var -xdev -type f -mmin -60 2>/dev/null | head -100

只输出前 100 条用于观察,不要直接把大规模结果全部打印到终端。

四、安全释放 inode

先识别文件的业务用途、保留周期和是否仍被进程使用,再进行清理。常见安全做法包括调用应用自带的清理命令、缩短缓存周期、压缩归档旧日志,以及修复异常生成逻辑。

删除前先抽样:

bash 复制代码
sudo find /var/tmp/myapp -xdev -type f -mtime +7 -print | head -50

确认无误后再按明确目录和条件处理。不要执行来源不明的全盘批量删除命令,也不要删除 /proc、/sys 或容器运行时仍在使用的文件。

清理后复查:

bash 复制代码
df -ih
df -hT

五、Docker 环境的专项检查

bash 复制代码
docker system df -v
sudo find /var/lib/docker -xdev -type f 2>/dev/null | wc -l

不要直接进入 /var/lib/docker 手工删除文件。应优先删除已确认不再使用的容器、镜像和构建缓存,并在操作前确认回滚和重建方案。

如果业务频繁生成短生命周期小文件,可考虑把临时目录挂载到独立文件系统,避免拖垮根分区。

六、建立长期治理

监控不能只看磁盘容量,还要同时采集 inode 使用率。建议设置分级告警:

  • 70%:观察增长速度;
  • 85%:定位目录并准备清理;
  • 95%:进入紧急处置,限制异常写入。

部署前还要评估文件数量,而不仅是数据容量。创建文件系统时 inode 密度由文件系统参数决定,调整通常需要重新格式化,因此更重要的是从应用生命周期和目录隔离上治理。

总结

"磁盘有空间但写不进去"时,应立即把 df -ih 加入检查清单。确认异常挂载点后,使用 find -xdev 从局部统计文件数量,抽样确认业务用途,再通过应用清理机制释放 inode。最终还要补上 inode 监控和小文件生命周期策略,避免故障反复出现。

相关推荐
readhere8 小时前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
打工仔折腾 AI9 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
yyuuuzz9 小时前
跨境站点日志时区混乱的排查记录
运维·服务器·网络·云计算·aws·1024程序员节
‎ദ്ദിᵔ.˛.ᵔ₎9 小时前
关于Linux 线程局部存储的认识
linux·运维
GlobalInfo9 小时前
全球及中国风电叶片检测机器人行业研究报告(2026版):市场现状、行业前景与占有率分析
运维·网络·人工智能·机器人
数字新视界11 小时前
一体化机柜在数据中心运维中的创新应用与优势分析
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
隔窗听雨眠11 小时前
KingbaseES平替全链路实践:从迁移评估到可持续运维
运维
skywalk816311 小时前
登到192.168.1.5那台机器,看看今天白天,大约从早晨到晚上,都卡住了。看看因为什么卡住,为什么卡住而没有杀死那个导致卡死的进程,为什么
运维·系统·freebsd
运维行者_11 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
小小de风呀11 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习