linux - posix_fallocate 以 4K 间隔一次写入 1 个字节,导致我对 NFS 实现的熔断非常慢

标签 linux filesystems posix fuse

我有一个可以重新导出 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/

相关文章:

linux - 如何修复 bash az 命令未找到

perl - 为什么Perl的两个arg公开似乎剥夺了换行符?

c - 从 `std::io::File::open` 获取文件描述符

c++ - 如何附加到现有的共享内存段

C读取其中包含null的文件

c++ - 如何告诉 valgrind 对 fork 进程进行 memcheck?

c++ - 如何映射 Linux 系统线程 id 和 std::thread::id?

c - 如何找到哪个 C 函数正在调用特定的 TCL 过程?

node.js - Node-Webkit:fs.readdirSync ("~")不起作用

python - 如何在 Windows 中获取 *更改* 文件时间?