记录一下那天晚上的排查过程。运维在 /data 下执行 du -sh *,统计出四十七 T,可 df 里 /data 只用了十二 T,怀疑有文件被重复算或者目录被挂载盖住,逐个目录看都对不上。
刚开始盯着「硬链接被重复计数,备份目录里存着同一份文件的多个入口」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。/data 下面挂了 NFS 和另一块云盘,du 不跨文件系统也照样递归进去算。少数情况下是加了 -x 但只写在第一个目录上,后续参数各自按默认处理。
少数情况下是稀疏文件按表观大小统计,和实际占用的块数差出一大截。
限定在同一文件系统内统计
du -xsh /data/* 2>/dev/null | sort -h | tail
接着列出 /data 下的挂载点,单独统计
findmnt -R /data
然后按实际占用块数统计,避开稀疏文件
du -sx --block-size=1 /data/* | sort -n | tail
和 df 的总用量对一次账
df -h /data && du -xsh /data
怎么算真的好了,看的是同一批现象。du -xsh /data 的结果与 df 的已用空间相差不到百分之五,各子目录加总也能对上,NFS 挂载点被单独列出。
补一句。du 默认会跨文件系统,统计容量对账一律加 -x;稀疏文件要用 --apparent-size 之外的默认算法,否则会虚高。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
