如何使NFS支持posix_fallocate?

3

我使用的全文搜索引擎将索引数据存储在NFS存储中。由于频繁的读写操作,我想为每个表文件预分配大量连续的磁盘空间,因此采用了posix_fallocate。但是,在NFS卷上,我的小型演示失败了,并响应“EOPNOTSUPP”以拒绝posix_fallocate。NFS协议/规范是否包括posix_fallocate场景?


fallocate 给文件系统一个机会,比仅仅向文件写入零更有效地分配空间。如果底层文件系统不支持它,你所能做的最好的办法就是打开文件并写入一定数量的零字节,直到达到所需的文件大小。在大多数情况下,这种方法不会比使用 fallocate() 更低效。 - Ctx
2
NFS的版本是什么?你的NFS客户端和服务器运行的操作系统版本是什么?你能贴出你的代码吗?从Google搜索的讨论中可以看出,glibc应该在NFS上模拟posix_fallocate()函数,但是这种模拟似乎存在一些bug。 - Andrew Henle
1个回答

2
虽然问题的标题提到了posix_fallocate,但是posix_fallocate的定义意味着EOPNOTSUPP不是一个错误代码,它会被返回。看起来很可能问题的提问者实际上是在使用Linux上的fallocate,因为它可以返回EOPNOTSUPP)。
NFS可以支持Linux上的fallocate(http://wiki.linux-nfs.org/wiki/index.php/Fallocate),但是:
您的客户端和服务器必须使用NFS 4.2或更高版本。
一个NFS 4.2+服务器不一定要实现fallocate - 这是可选的(参见libc-alpha邮件列表线程中的Re:[PATCH 4/4] Remove broken posix_fallocate,posix_falllocate64 fallback code [BZ#15661]帖子)。
关于 posix_fallocate,在没有仔细观察或事先手动检查(例如通过进行平台本地的fallocate调用并检查是否失败或不支持)之前,您永远无法知道Linux glibc的 posix_fallocate 调用是真实的还是仿真的。如果已经进行了本地调用,为什么还需要posix_fallocate调用?此外,不同的平台对于本地的fallocate调用有不同的调用方式(或者完全缺少该功能),因此如果需要可移植性到非Linux平台,则需要为每个平台编写适当的本地fallocate包装器。如果即使下面的内容没有支持它的调用,您也必须进行预分配,那么您将不得不手动执行它(例如通过漂亮的大块写入或类似glibc的posix_fallocate的黑客方法...)。
注意:当可能进行真正的预分配时(例如通过fallocate),它可以比进行完整写入要快得多,因为文件系统可以通过设置适当的元数据来满足它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接