本质是I/O和元数据操作瓶颈,应优先用ionice -c3降级I/O类别,配合find -delete或find|xargs分批删除,并启用relatime减少atime更新,nice仅在CPU成为次要瓶颈时辅助使用。

用 rm -rf 删除百万级小文件时卡住,本质是 I/O 和元数据操作瓶颈,不是 CPU 不够。单纯加 nice(调低 CPU 优先级)几乎没用,真正关键的是控制磁盘 I/O 争抢——ionice 才是核心,配合合理策略才能提速。
优先用 ionice 降级 I/O 类别,避免阻塞系统响应
ionice 控制进程对磁盘的“抢夺强度”,比 nice 管 CPU 更对症。删除大量小文件时,每删一个都要更新 inode、目录项、块位图等,I/O 请求密集且随机,极易拖慢其他服务(如数据库、日志写入)。
- 推荐用
ionice -c3(Idle 类),表示“只在磁盘空闲时才做 I/O”,最温和,不影响前台业务 - 若需稍快一点且能接受轻微干扰,可用
ionice -c2 -n7(Best-effort 类,最低优先级),比默认(-n4)更低 - 绝对避免
-c1(Real-time),会饿死其他进程,风险极高
配合 find + xargs 分批删除,减少单次系统调用开销
rm -rf 递归扫描整个目录树时,要反复 stat、readdir,路径深、文件多时内核开销大。改用 find 按批次交给 xargs 处理,可显著降低路径解析和内存压力。
- 安全高效写法:
find /path/to/dir -mindepth 1 -delete(支持 GNU find,原子删除,最快) - 兼容旧系统(如 macOS):
find /path/to/dir -mindepth 1 -print0 | xargs -0 -P1 -n 1000 rm
其中-P1避免多线程加剧 I/O 冲突,-n 1000控制每批数量,平衡效率与内存
禁用 atime 更新,跳过不必要的元数据写入
每次访问文件(包括 rm 的 stat 操作)默认会更新 atime 字段,产生额外磁盘写入。对纯删除场景毫无意义,却加重 I/O 负担。
- 临时生效(当前挂载点):
mount -o remount,relatime /mount/point(比noatime更兼容,推荐) - 永久生效:编辑
/etc/fstab,在对应分区选项中加入relatime或noatime - 注意:修改后需重新挂载或重启才生效;若不确定影响,先在测试环境验证
慎用 nice,仅在 CPU 成为次要瓶颈时微调
删除小文件时 CPU 占用通常很低,nice 几乎不改善速度,反而可能让进程调度更不及时。只有当同时运行高 CPU 任务(如压缩、编译)导致调度延迟时,才考虑辅助降级:
- 搭配 ionice 使用:
ionice -c3 nice -n19 find /path -delete -
nice -n19是最低 CPU 优先级,但不要单独用它来“加速”删除 - 监控确认:用
iostat -x 1看 %util 和 await,若 %util 接近 100% 且 await 高,说明是 I/O 瓶颈,此时ionice有效;若 %util 很低但 CPU 占满,再看nice










