清理脚本删 uploads/cache,目录里 82 万个 4KB 小文件,rm -rf 跑了 20 分钟还没完。同机接口 P99 从 80 毫秒涨到 2 秒。乍看像缓存或者权限的锅,追下去往往不是。

mv /data/uploads/cache /data/uploads/trash-20261112
find /data/uploads/trash-20261112 -type f -delete
ionice -c3 nice -n19 rm -rf /data/uploads/trash-20261112

追下去是这么回事:删除每个文件都要改目录项和 inode 位图,几十万次随机元数据写入,耗时按文件数走而不是按容量。单线程 rm 还占满一个核,和业务抢同一块盘的 IO。

「删除大目录慢」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,用 find 配合 -delete 分批删 每批几千个;先 rename 成待删目录 再后台慢慢清 业务路径立刻空出来;调 ionice 降低清理进程的 IO 优先级;目录按天分片 避免单个目录堆到几十万文件。

验收就看一点,业务目录瞬间清空 清理在后台跑完 接口 P99 回到 100 毫秒以内。

作者 9823189