清空缓存目录里五十万个文件后,du 统计该目录还是二十 G,df 也几乎没降,用 ls 看目录里确实是空的。
排查方向其实有限,先把可能性排一排。文件删了但目录的索引树没有回收,目录文件本身越撑越大。另一种情况是仍然有进程持有这些文件的句柄。
不容易想到的是,文件系统延迟回收,需要时间或者 sync 触发。
动手时先看目录自身大小和内容
du -sh /data/cache && ls -la /data/cache | head
接着确认还有没有残留句柄
lsof +D /data/cache | wc -l
原地重建目录最彻底
mv /data/cache /data/cache_old && mkdir /data/cache
等前面都确认过,再确认后删除旧目录
rm -rf /data/cache_old
同事提醒我看一下最近一次发布,时间点确实对得上。
改完先别撤,确认这几项。新目录占用回到几 KB,已用空间下降二十 G,lsof 显示没有残留句柄。
重建目录会让应用短暂写失败,最好先停服务或者用软链做原子切换;高峰期做等于给自己制造故障。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。