10 个版本
0.3.2 | 2021 年 3 月 18 日 |
---|---|
0.3.1 | 2021 年 2 月 17 日 |
0.3.0 | 2019 年 4 月 7 日 |
0.2.2 | 2017 年 6 月 20 日 |
0.1.1 | 2017 年 1 月 31 日 |
#1048 in 文件系统
19KB
156 行
ffcnt
为旋转 Rust 优化的快速文件计数和列表,使用 Rust 实现。
ffcnt 的目的是为一些常见的文件系统操作提供更快的替代方案,作为 platter-walk crate 的前端。
ffcnt --type f
替代find -type f | wc -l
ffcnt --type f --ls --leaf-order content
替代find -type f
并按优化顺序返回文件以供读取ffcnt --s
替代du --s ---apparent-size
要求
- Linux
- 支持在目录上执行
fiemap
ioctl 的文件系统。
目前已知 ext4 提供了该功能。如果您知道其他文件系统,请报告!
不兼容的文件系统也可以工作,但不会比find
获得速度提升。
您可以使用 filefrag
工具测试文件系统支持。
## supported
$ filefrag /tmp/
/tmp/: 3 extents found
## unsupported
$ filefrag /mnt/test/
/mnt/test/: FIBMAP unsupported
二进制文件
您可以在 发布 下找到未包含调试信息的预构建 x86_64-linux-glibc 二进制文件。对于故障排除和其他环境,您必须自己构建。
构建
- 克隆仓库
- 安装 liblzo2 和 libz(构建时依赖项)
- 安装 rust 和 cargo
cargo构建 --发布
用法
fast file counting 0.3.0
USAGE:
ffcnt [FLAGS] [OPTIONS] [dirs]...
FLAGS:
-h, --help Prints help information
--ls list files
--prefetch attempt to prefetch directory indices from underlying mount device. requires read permission on device
-s sum apparent length of matched files. Only counts hardlinked files once. Does not follow symlinks. Implies --leaf-order inode.
-V, --version Prints version information
OPTIONS:
--leaf-order <ord> optimize order for listing/stat/reads [values: inode, content, dentry]
--type <type> filter type [values: f, l, d, s, b, c, p]
ARGS:
<dirs>... directories to traverse [default: cwd]
非科学基准测试
空闲系统
$ echo 3 > /proc/sys/vm/drop_caches ; time find /tmp/foo/ -type f | wc -l
826536
real 0m52.289s
user 0m0.680s
sys 0m4.361s
$ echo 3 > /proc/sys/vm/drop_caches ; time ffcnt /tmp/foo/ --type f
files: 826536
real 0m17.072s
user 0m1.230s
sys 0m2.190s
$ echo 3 > /proc/sys/vm/drop_caches ; time sudo ffcnt /tmp/foo/ --prefetch --type f
files: 826536
real 0m13.311s
user 0m2.029s
sys 0m1.440s
忙碌的系统,具有混合的读写工作负载。由于在此期间发生了写入,文件计数出现了差异
# echo 3 > /proc/sys/vm/drop_caches ; time ffcnt .
4411262
real 10m36.288s
user 0m3.656s
sys 0m7.588s
# echo 3 > /proc/sys/vm/drop_caches ; time find . -type f | wc -l
4412101
real 45m54.955s
user 0m3.212s
sys 0m12.044s
这两个测试都是在至少2层嵌套结构和256个分支因子的硬盘上进行执行的
想法
- 树中每个块设备对应一个线程
依赖关系
~5.5MB
~107K SLoC