我一直在学习 NFS 的“关闭打开”策略,该策略会导致每个文件在关闭时刷新到服务器,以确保客户端之间的一致性。(请参阅http://docstore.mik.ua/orelly/networking_2ndEd/nfs/ch07_04.htm)当尝试写入许多小文件时,这会导致性能大幅下降。
显然,我知道“异步”导出选项,但还有一个“nocto”客户端挂载选项,该选项应该禁用该客户端的关闭打开机制。据我所知,这应该阻止客户端在关闭时刷新文件(以及在打开时不检查缓存一致性)。然而,这似乎没有效果:客户端在关闭时仍在将文件刷新到服务器,导致大量等待 IO。
有人知道为什么“nocto”没有达到我期望的效果吗?“async”选项按预期工作,但对我来说,在这种情况下客户端缓存的正确性更为重要,这让我很烦。
例子:一组无盘节点共享一个远程根,该根偶尔会从其中一个节点更新。每个文件在关闭后立即刷新并不重要,因为没有其他节点尝试写入同一文件。但是,更重要的是,如果服务器在更新一组软件包时崩溃,客户端会知道哪些数据尚未写入服务器的磁盘,以便它可以在服务器重新启动后再次尝试。使用“异步”选项,这种情况可能会导致数据丢失(因为服务器对客户端谎称数据已刷新到磁盘),而禁用 close-to-open(并使用“同步”而不是“异步”)理论上应该提供相同的性能优势,而不会造成潜在的数据丢失(因为多个文件写入将被缓冲并一起刷新到服务器)。服务器和其他客户端将看到文件系统的略微过时的视图(几秒钟)。这对我来说似乎是合理的。
简单来说,“async” 会进行服务器端缓冲,从而大大加快速度。我期望“nocto” 能够进行客户端缓冲,并实现类似的速度提升,但代价是其他客户端上的数据会有所滞后。
答案1
来自nfs(5)手册页:
如果
nocto
指定了该选项,客户端将使用非标准启发式方法来确定服务器上的文件何时发生变化。使用该
nocto
选项可能会提高只读挂载的性能,但应仅在服务器上的数据偶尔更改时使用。数据和元数据一致性部分更详细地讨论了此选项的行为。