我有一个 nfs 服务器和一个客户端(v4,都是 CentOS 7.6/7.8)
在服务器上我有一个程序,用于inotifywait
复制传入的文件(在CLOSE_WRITE
)
在客户端上,共享的安装方式如下
sudo mount 192.168.1.10:/myshare /mnt/share
(这意味着异步模式)
或
sudo mount -o sync 192.168.1.10:/data/shares/myshare /mnt/share
同步的解释
如果在安装点上指定了同步选项,则任何将数据写入该安装点上的文件的系统调用都会导致在系统调用将控制权返回到用户空间之前将数据刷新到服务器。这在客户端之间提供了更好的数据缓存一致性,但会带来显着的性能成本。
在服务器上我观察文件/data/shares/myshare
夹
inotifywait -m -e CLOSE_WRITE /data/shares/myshare | while read path action file; do echo "$action"; done
现在我用正常的方式复制一个足够大的文件(效果从大约 500mbyte 开始)cp
问题
服务器上发生的情况是,使用该标志,在复制文件时会触发一次sync
事件,这是所需的效果。 但在异步模式下,该事件会被多次触发,并且由于我们使用此事件复制服务器上的传入文件,因此我们复制了不完整的文件。CLOSE_WRITE
虽然使用同步标志本身可以解决问题,但它会带来约 10% 的性能损失。我的 580MB 测试文件为 25% - 35%(对于较大的文件,速度似乎会降低,甚至与 2.5GB 文件的异步速度一样快)
samba 不会出现这个问题,所以我认为问题与 nfs 有关。
是否有任何标志/选项或其他可能性来保持性能而不多次触发事件?