我有一个客户端节点将文件写入另一个节点上的硬盘(我实际上写的是并行fs)。
我想要了解的是:
当我write()
(或pwrite()
)时,write
来电何时返回?
我看到三种可能性:
write
在客户端排队I / O操作后立即返回:
在这种情况下,write
可以在数据实际离开客户端节点之前返回(如果您正在写入本地硬盘驱动器,则写入调用使用延迟写入,其中数据只是排队等待写入。但是这样做当你写到远程硬盘时也会发生?)。我写了一个测试用例,其中我写了一个大矩阵(1GByte)来存档。没有fsync
,它显示了非常高的带宽值,而对于fsync
,结果看起来更加真实。所以看起来它可能正在使用延迟写入。
write
返回:
现在数据在服务器上,但是驻留在其主存储器中的缓冲区中,但尚未永久存储在硬盘驱动器上。在这种情况下,I / O时间应该由通过网络传输数据的时间决定。
write
返回:
我确信默认情况下不会发生这种情况(除非您编写非常大的文件,导致RAM被填满并最终被刷新等等)。
此外,我想确定的是:
是否会出现程序终止而没有任何数据实际离开客户端节点的情况,这样延迟,带宽和硬盘驱动器带宽等网络参数在程序的执行时间内根本没有特征?考虑我们不做fsync
或类似的事情。
编辑:我正在使用pvfs2并行文件系统
答案 0 :(得分:3)
选项3.当然简单,安全。然而,生产质量POSIX兼容的并行文件系统具有足够的性能以至于任何人实际关心使用它,通常将选项1与一些或多或少涉及的机制结合使用以避免例如冲突时的冲突。几个客户端缓存同一个文件。
俗话说“计算机科学只有两件事:缓存失效,命名事物和一分一误”。
如果文件系统应该与POSIX兼容,你需要去学习POSIX fs语义,并查看fs如何在获得良好性能的同时支持这些(或者,它跳过的POSIX语义的哪些部分,以及NFS) 。让错误更有趣的是,POSIX fs语义可以追溯到1970年代,但是如何支持网络文件系统几乎没有。
我并不特别了解pvfs2,但通常为了符合POSIX并提供良好的性能,选项1可以与某种缓存一致性协议(例如Lustre)一起使用。对于fsync(),数据必须实际传输到服务器并在fsync()返回之前提交到服务器上的稳定存储(磁盘或电池支持的写缓存)。当然,客户端对脏页的数量有一些限制,之后它会阻止write()进一步写入文件,直到有些页面被传输到服务器。
答案 1 :(得分:2)
您可以获得三种选择中的任何一种。这取决于您为open
电话提供的标志。这取决于文件系统在本地安装的方式。它还取决于远程服务器的配置方式。
以下全部取自Linux。 Solaris和其他人可能会有所不同。
一些重要的open
标记为O_SYNC
,O_DIRECT
,O_DSYNC
,O_RSYNC
。
NFS的一些重要挂载标志是ac
,noac
,cto
,nocto
,lookupcache
,sync
,{{1} }。
导出NFS的一些重要标志是async
,sync
,async
。当然,NFS导出的文件系统的挂载标志也很重要。例如,如果您从Linux导出XFS或EXT4,并且由于某种原因您使用了no_wdelay
标志,那么服务器端的断电几乎肯定会导致数据丢失。