Skip to the content.

fuse-bench

fuse-bench 是一个小型 FUSE 协议实验项目,用来测量最小用户态文件系统路径的开销。它在初始 FUSE_INIT 握手之后使用 FUSE-over-io_uring 传递请求。文件系统只暴露一个文件:

/
`-- file

daemon 直接通过 include/uapi/linux/fuse.h/dev/fuse 通信,不使用 libfuse,也不使用 liburing。初始 FUSE_INIT 请求仍然使用传统 /dev/fuse read/write 协议处理,因为连接初始化完成之前,内核会拒绝 FUSE io_uring command。初始化之后,daemon 会按 possible CPU 数量注册 io_uring entry,并通过 FUSE_IO_URING_CMD_REGISTERFUSE_IO_URING_CMD_COMMIT_AND_FETCH 处理请求。

构建

make
make test

生成的二进制是 fuse-bench.outbench.outtest_common.out。仓库已经忽略 *.out

运行

daemon 使用 fusermount3 挂载,所以只要 fusermount3 按常见发行版方式安装为 setuid root,就可以用普通用户启动。内核模块必须启用 FUSE-over-io_uring:

cat /sys/module/fuse/parameters/enable_uring
echo Y | sudo tee /sys/module/fuse/parameters/enable_uring

启动 daemon:

mkdir -p /tmp/fuse-bench-mnt
truncate -s 1G /tmp/fuse-bench.img
./fuse-bench.out --backing /tmp/fuse-bench.img --mountpoint /tmp/fuse-bench-mnt --uring --debug

在另一个 shell 中运行 benchmark:

./bench.out --path /tmp/fuse-bench-mnt/file --size 256M --bs 128k --mode rw
./bench.out --path /tmp/fuse-bench.img --size 256M --bs 128k --mode rw

第二条命令是直接访问 backing file 的基线。把它和挂载路径的结果对比,可以估算 FUSE 路径的额外开销。

如果 daemon 被中断但没有完成清理,可以手动卸载:

fusermount3 -u -z /tmp/fuse-bench-mnt

参数

fuse-bench.out

bench.out

TODO

当前环境有 /dev/fuse 和 setuid 的 fusermount3,但规划时没有发现 fuse3.pcliburing.pc。因此 v1 直接使用内核 UAPI,只把需要特权的挂载和卸载操作委托给 fusermount3

系统头文件支持 FUSE protocol 7.45,包括 FUSE_PASSTHROUGHFUSE_OVER_IO_URING。daemon 强制要求 FUSE_OVER_IO_URING;如果内核在 FUSE_INIT 中没有提供这个能力,启动会失败,不会退回传统 /dev/fuse 请求循环。FUSE_PASSTHROUGH 当前只会作为内核提供的能力被打印出来,本实验还没有启用它。

(我的总结:)

看来一直捣鼓的 fuse iouring 只是在接受 fd 上的变化,而不是在于 fd 的变化。 我希望的功能在 FUSE_PASSTHROUGH 中了。

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。