【问题标题】:How to make NFS support posix_fallocate?如何使 NFS 支持 posix_fallocate?
【发布时间】:2017-02-24 08:52:26
【问题描述】:

我的全文搜索引擎将索引数据存储在 NFS 存储上。 由于经常读/写ioes,我想为每个表文件预先分配巨大的连续磁盘空间,因此求助于posix_fallocate。 在 NFS 卷上,我的小演示失败,“EOPNOTSUPP”响应 posix_fallocate。 NFS 协议/规范是否包含 posix_fallocate 场景?

【问题讨论】:

  • fallocate 为文件系统提供了一个机会,可以更有效地分配空间,而不是仅仅将零写入文件。如果底层文件系统不支持它,你能做的最好的就是打开文件并写入多个零字节直到所需的文件大小。在大多数情况下,这不会比使用fallocate() 效率低。
  • 什么版本的 NFS?您为 NFS 客户端和服务器运行的操作系统版本是什么?你可以发布你的代码吗? Google search 的讨论似乎表明 glibc 应该在 NFS 上模拟 posix_fallocate(),但模拟似乎有一些错误。

标签: c linux filesystems nfs


【解决方案1】:

(虽然问题的标题提到了posix_fallocatedefinition of posix_fallocate means EOPNOTSUPP is not an error code it will return。提问者很可能实际上在使用fallocate on Linux as that CAN return EOPNOTSUPP

NFS 可以在 Linux (http://wiki.linux-nfs.org/wiki/index.php/Fallocate) 上支持 fallocate,但是:

  1. 您的客户端和服务器必须使用 NFS 4.2 或更高版本。
  2. NFS 4.2+ 服务器不必实现 fallocate - 它是可选的(请参阅在 libc-alpha 邮件列表线程中发布的 Re: [PATCH 4/4] Remove broken posix_fallocate, posix_falllocate64 fallback code [BZ#15661]])。

回复posix_fallocate,您可以never know whether a Linux glibc posix_fallocate call was real or emulated 无需事先仔细观察或手动检查(例如,通过进行平台原生fallocate 调用并检查它是否失败或不受支持)以及您是否已完成原生为什么需要posix_fallocate 电话?此外,不同的平台对本机fallocate(或完全没有它)有不同的调用,因此如果考虑到非Linux 平台的可移植性,您将需要为每个平台编写适当的本机fallocate 包装器。如果您必须进行预分配,即使下面的内容没有支持它的调用,您将不得不回退到手动进行(例如,通过漂亮的大块写入或黑客之类的glibc 的posix_fallocate...)。

注意:如果可以进行真正的预分配(例如通过fallocate),它可能比必须进行完全写入要快得多,因为文件系统只需设置适当的元数据即可完成它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多