优化文件数量极多时`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
相关产品推荐
相关产品推荐

