df 显示磁盘使用100% 但 du 统计出来远小于实际占用怎么排查

10次阅读

df与du差异主因是统计逻辑不同:df统计文件系统已分配块,du统计可见文件实际大小;常见原因包括已删除但被进程占用的文件、挂载点覆盖、inode耗尽、稀疏文件及保留空间。

df 显示磁盘使用100% 但 du 统计出来远小于实际占用怎么排查

这通常不是磁盘真满了,而是 df 和 du 统计逻辑不同 导致的表象。df 看的是文件系统级的已分配块,du 看的是当前目录下“可见文件”的实际大小。两者不一致,说明有空间被占着但 du 找不到——得顺着这个思路查。

检查是否有已删除但仍在被进程占用的文件

这是最常见原因:大日志文件(如 app.log、hive.log)被 rm 删除了,但 javanginx、cat 等进程还开着它的文件描述符,空间不会释放。

  • 运行 lsof +L1lsof | grep deleted,看输出里有没有带 (deleted) 标记的大文件
  • 重点关注 SIZE/OFF 列,如果显示几百 MB 或几 GB,就和 df – du 的差值对得上
  • 解决方法:重启对应服务(systemctl restart nginx),或杀掉进程(kill -9 PID),不建议直接清空 /proc/PID/fd/ 下的句柄

确认是否存在挂载点覆盖原数据

比如你原来在 /data 目录下存了大量文件,后来又把一块新磁盘挂到了 /data。此时 du 只看到新磁盘里的内容,而 df 仍把旧数据算在总用量里。

  • 执行 mount | grep data 查看是否在常用路径(如 /var、/data、/home)上有非根挂载
  • 临时卸载:umount /data,再 ls -lh /data —— 如果能看到一大文件,就是它了
  • 处理方式:卸载后清理旧数据,或改用空目录做挂载点(如新建 /mnt/data_disk

排查 inode 是否耗尽

磁盘块还有剩,但提示 “No space left on device”,创建文件失败,大概率是 inode 用光了。尤其常见于日志目录、缓存目录生成海量小文件时。

  • 运行 df -i,看 IUse% 是否接近 100%
  • 定位问题目录:find /var/log -type f | wc -l,或用 for i in /*; do echo $i; find $i -xdev -type f 2>/dev/NULL | wc -l; done | sort -nk2
  • 清理方向:删过期日志(journalctl --vacuum-time=7d)、清空 /tmp、/var/cache,避免程序持续写小文件

留意稀疏文件和文件系统保留空间

稀疏文件(如用 dd seek 创建的)逻辑体积很大,但实际只占少量块;ext4 默认为 root 预留 5% 空间,普通用户看不到这部分可用容量。

  • 查稀疏文件:find /path -type f -printf '%s %pn' | awk '$1 > 1073741824 {print}'(找逻辑大于 1G 的),再用 du -h 对比
  • 查保留空间:tune2fs -l /dev/sda1 | grep "Reserved block count",可调低但别设为 0
  • 云环境还要注意 thin-provisioning 延迟释放、配额限制等,需结合 lvs、厂商控制台确认
text=ZqhQzanResources