ZFS over NFS并发写入问题

我运行一个Proxmox集群,在这个集群上,我有一些专用networking上的虚拟机,一个(Proxmoxpipe理的)CEPH存储后端用于VM磁盘。

运行“Ubuntu 16.04 server minimal vm”的一台(KVM)VMconfiguration了第二个“硬盘”,设置为一个磁盘ZFS池“存储”,使用

zpool create storage /dev/sdb1 

它被自动挂载到/存储。 这个虚拟机也运行nfs-kernel-server。

然后通过/ etc / exports中的以下行通过nfs导出该目录:

 /storage 10.10.0.0/16(rw,sync) 

我从另外两台机器(一台运行Ubuntu 14.04的虚拟机,一台运行Ubuntu 16.04服务器的物理机器)挂载这个导出

 mount -t nfs4 10.10.3.1:/storage /mnt 

由于这是testing存储设置的操作环境,因为这两个Web服务器托pipe一个写入Berkeley DB文件的旧Perl应用程序,所以我决定使用一个简单的PHP脚本以简单的方式testing我的共享存储后端并发写入:

 <?php $line = str_repeat($argv[1], 30) . "\n"; for ($i = 1; $i <= 10000; $i++) { $of = fopen("test.txt", "a") or DIE("can't open output file\n"); fwrite($of, sprintf("%04d-", $i) . $line); fclose($of); } ?> 

我进入共享存储目录(这也是php脚本的位置),并使用它来运行它

 php test.php 1 

从第一个远程机器,并与

php test.php 2

从第二台机器。

我的问题是,有些写道似乎没有到目的地的文件,即我得到这样的输出:

 9286-222222222222222222222222222222 9287-222222222222222222222222222222 9288-222222222222222222222222222222 9289-222222222222222222222222222222 7473-111111111111111111111111111111 7474-111111111111111111111111111111 7475-111111111111111111111111111111 7476-111111111111111111111111111111 7477-111111111111111111111111111111 7478-111111111111111111111111111111 7479-111111111111111111111111111111 9297-222222222222222222222222222222 9298-222222222222222222222222222222 7481-111111111111111111111111111111 9300-222222222222222222222222222222 7482-111111111111111111111111111111 9302-222222222222222222222222222222 7484-111111111111111111111111111111 

并validation该行不被caching并写入文件中的不同位置:

 nas:/storage# grep "9290-" test.txt 9290-111111111111111111111111111111 nas:/storage# 

即它失踪(其中包括)的

 9290-222222222222222222222222222222 

线。 在这一点上,我希望我只是缺less一些configuration参数或一个或两个步骤在安装过程中可以解决这个问题。

编辑:我只是注意到写入似乎互相阻塞,即行号之间的差距总是与来自另一个远程“作家”的交错写入的数量相对应。 尽pipe如此,我仍然没有接近解释为什么发生这种情况,也没有如何解决这个问题。

另外,我在vm硬盘上的proxmox上启用了“Discard”和“IO thread”,并禁用了这两个选项,没有任何效果(不过没有想到会这样,不过检查不过)。 行为是一样的。

好吧,显然Berkeley DB为并发访问提供了locking机制,所以我的“简单testing场景”是不充分的,因为在应用程序级别上需要进行locking; 我的testing脚本没有做任何types的testing,所以testing不符合用例。

因此,我正在考虑这个问题的答案。 感谢您的回复!