我有一个可以重新导出 NFS 共享的 fuse 模块。像 fio 这样调用 posix_fallocate 的应用程序最终会调用我的 fuse 写入函数,并以 4K 的散布写入一个字节。这反过来会导致通过 NFS 进行单字节 RPC 调用,从而使性能非常缓慢。
我如何通过 fuse 向应用程序宣传我可以直接处理 fallocate 而它不应该求助于单字节写入?
最佳答案
你需要的是:
不要让你的 fuse 在 posix_fallocate
调用时返回 EOPNOTSUPP
。
我在安装了 NFS 卷的 Linux 上跟踪 posix_fallocate。 事实证明,linux 的 posix_fallocate 实现会在遇到 EOPNOTSUPP 时向每个 block 写入 1 个字节。
下面一行显示了输出的部分strace:
fallocate(3, 0, 0, 8589934592) = -1 EOPNOTSUPP (Operation not supported)
pwrite(3, "\0", 1, 1048575) = 1
pwrite(3, "\0", 1, 2097151) = 1
pwrite(3, "\0", 1, 3145727) = 1*
.....
关于linux - posix_fallocate 以 4K 间隔一次写入 1 个字节,导致我对 NFS 实现的熔断非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38534607/