写入远程文件:write()何时真正返回



我有一个客户端节点正在向另一个节点上的硬盘写入文件(实际上我正在向并行fs写入文件)。

我想理解的是:
当我输入write()(或pwrite())时,write调用何时返回?

我认为有三种可能性:

  1. write在客户端I/O操作排队后立即返回:
    在这种情况下,write可以在数据实际离开客户端节点之前返回(如果您正在写入本地硬盘驱动器,那么write调用使用延迟写入,其中数据只是排队等待写入)。但是,当您向远程硬盘写入数据时,是否也会发生这种情况?)我编写了一个测试用例,其中我将一个大矩阵(1GByte)写入文件。没有fsync,它显示了非常高的带宽值,而使用fsync,结果看起来更真实。所以看起来它可能使用了延迟写入。

  2. write在数据被传输到服务器缓冲区后返回:
    现在数据在服务器上,但驻留在主内存的缓冲区中,但还没有永久存储在硬盘驱动器上。在这种情况下,I/O时间应该由通过网络传输数据的时间来支配。

  3. write在数据实际存储在硬盘上后返回:
    我确信默认情况下不会发生(除非你写真正大的文件,这会导致你的RAM被填满,最终被冲洗出来等等……)。

另外,我想确定的是:
是否会出现这样一种情况:程序在没有任何数据离开客户机节点的情况下终止,例如延迟、带宽和硬盘驱动器带宽等网络参数在程序的执行时间中根本没有出现?假设我们不做fsync或类似的东西。

编辑:我正在使用pvfs2并行文件系统

选项3。当然是简单、安全的。然而,一个产品质量的POSIX兼容并行文件系统,如果性能足够好,任何人都愿意使用它,通常会使用选项1和一些或多或少涉及的机制来避免冲突,例如,当几个客户端缓存同一个文件时。

俗话说,"在计算机科学中只有两件困难的事情:缓存无效、命名和off-by- 1错误"。

如果文件系统应该是POSIX兼容的,那么您需要学习POSIX fs语义,并查看fs如何在获得良好性能的同时支持这些语义(或者,它会跳过POSIX语义的哪些部分,就像NFS一样)。让这一点变得有趣的是,POSIX fs语义回溯到20世纪70年代,几乎没有考虑如何支持网络文件系统。

我不知道pvfs2具体是什么,但通常为了符合POSIX并提供体面的性能,选项1可以与某种缓存一致性协议(例如Lustre)一起使用。对于fsync(),在fsync()返回之前,数据必须实际传输到服务器并提交到服务器上的稳定存储(磁盘或电池支持的写缓存)。当然,客户端对脏页的数量有一定的限制,在此之后,它将阻止对文件的进一步写操作,直到一些脏页被传输到服务器。

您可以选择三个选项中的任何一个。这取决于您提供给open调用的标志。这取决于文件系统是如何在本地挂载的。这也取决于远程服务器是如何配置的。

下列内容均取自Linux。Solaris和其他系统可能有所不同。

一些重要的open标志是O_SYNC, O_DIRECT, O_DSYNC, O_RSYNC

NFS的重要挂载标志有acnoacctonoctolookupcachesyncasync

导出NFS文件的重要标志有syncasyncno_wdelay。当然,NFS导出的文件系统的挂载标志也很重要。例如,如果您从Linux导出XFS或EXT4,并且由于某种原因使用了nobarrier标志,那么服务器端的电源丢失几乎肯定会导致数据丢失。

最新更新