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 文件系统

GPL-3.0 许可证

19KB
156

Version

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