You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化文件数量极多时`du`命令的执行性能

优化百万级文件目录的大小统计方案

针对你统计含956878个文件的目录时du耗时约4.255秒的问题,下面给出几种优化du本身或替代工具的实用方案:

先明确你的原命令及执行结果:

root@DEB-NUC11PAH-G6PA2500045B:~# time du --total /var/lib/docker/volumes/data.vol/_data/out/priority.images | tail -n 1 | cut -f1
1710732
real    0m4.255s
user    0m0.671s
sys 0m2.453s

一、优化du命令本身

  • 减少管道与遍历开销:用-s参数直接输出目录总大小,省去tail和cut的管道处理;加上-x限制只统计当前文件系统,避免跨挂载点的无效扫描,命令简化为:
    time du -sx /var/lib/docker/volumes/data.vol/_data/out/priority.images
    
  • 跳过不必要的软链接:如果目录内存在大量软链接且无需统计其指向文件的大小,加上-P参数(明确不跟踪软链接),进一步减少遍历量。

二、更快的替代工具方案

  • ncdu:原本是交互式磁盘分析工具,支持非交互模式统计,遍历效率优于du,命令如下:
    time ncdu -o- /var/lib/docker/volumes/data.vol/_data/out/priority.images | grep '^total size:' | awk '{print $3}'
    
  • find+awk组合:若只需统计文件逻辑大小(和du --apparent-size效果一致),用find遍历累加速度更快:
    time find /var/lib/docker/volumes/data.vol/_data/out/priority.images -type f -printf '%s\n' | awk '{sum+=$1} END{print sum/1024}'
    
    若要统计磁盘实际占用(和原du结果一致),将%s替换为%b(磁盘块数),再除以2(默认块大小为512字节,转成KB):
    time find /var/lib/docker/volumes/data.vol/_data/out/priority.images -type f -printf '%b\n' | awk '{sum+=$1} END{print sum/2}'
    
  • dust:用Rust编写的现代磁盘统计工具,支持并行遍历文件系统,速度远快于du,安装后用-s参数直接输出总大小:
    time dust -s /var/lib/docker/volumes/data.vol/_data/out/priority.images
    

三、长期优化思路

如果需要频繁统计该目录大小,可以:

  • 用cron定时执行统计脚本,将结果缓存到文件中,需要时直接读取缓存,避免重复遍历;
  • 检查目录内的小文件,考虑归档合并,从根源上减少文件总数,提升后续统计速度。

内容的提问来源于stack exchange,提问作者Samadhan Fuke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:45:06