KVM + NFS 磁盘性能不佳

bet*_*ler 4 performance hard-drive nfs kvm-virtualization

情况:我们有一个使用 KVM 托管三个 VM 的 Ubuntu 服务器。所有来宾和主机都需要访问 /var 某个子文件夹中的相同文件。因此,子文件夹通过 NFS 导出。我们的问题是来宾只能以主机的一半速度读取/写入目录。导出表看起来像这样

alice@host:~$ cat /etc/exports
/home/videos 192.168.10.0/24(rw,sync,no_root_squash)
Run Code Online (Sandbox Code Playgroud)

其中主机 IP 为 192.168.10.2,VM 为 192.168.10.1{1..3}。/home/videos 是指向 /var 中某个子文件夹的符号链接。特别是,它是 /var/videos/genvids。

这是 VM 的 fstab 中的相关行:

192.168.10.2:/home/videos /mnt/nfs nfs auto,noatime,rsize=4096,wsize=4096  0 0
Run Code Online (Sandbox Code Playgroud)

硬盘具有 ~155 MB/s 的持续数据速率,这由 hdparm -tT 和 dd 的输出验证:

alice@host:~$ dd if=/home/videos/4987_1359358478.mp4 of=/dev/null bs=1024k count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 2.04579 s, 154 MB/s
Run Code Online (Sandbox Code Playgroud)

在 VM 中,事情看起来有所不同:

bob@guest:~$ dd if=/mnt/nfs/4959_3184629068.mp4 of=/dev/null bs=1024k count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 4.60858 s, 68.3 MB/
Run Code Online (Sandbox Code Playgroud)

使块大小适合文件系统的页面大小并没有令人满意的效果:

bob@guest:~$ dd if=/mnt/nfs/4925_1385624470.mp4 of=/dev/null bs=4096 count=100000
100000+0 records in
100000+0 records out
409600000 bytes (410 MB) copied, 5.77247 s, 71.0 MB/s
Run Code Online (Sandbox Code Playgroud)

我查阅了有关 NFS 性能的各个页面、最相关的NFS 常见问题B 部分以及相应的性能调优方法。大多数提示不适用。其他人没有改善结果。这里 线程 这里是处理磁盘性能和KVM。然而,它们不包括 NFS 方面。线程确实如此,但在我们的案例中,网络速度似乎不是限制因素。

为了给出完整的图片,这是导出 etab 的内容,符号链接已解决,并显示了所有活动的导出选项:

alice@host:~$ cat /var/lib/nfs/etab
/var/videos/genvids 192.168.10.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,
no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,
anonuid=65534,anongid=65534)
Run Code Online (Sandbox Code Playgroud)

在这种情况下也困扰我 - 我不明白 - 是 nfsd 的 procfile 输出:

alice@host:~$ cat /proc/net/rpc/nfsd
...
th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
...
Run Code Online (Sandbox Code Playgroud)

对于第三列及以后的列,在从 VM 内的磁盘读取后,我会得到除零以外的预期值。但是,nfsstat 告诉我确实存在读取操作:

alice@host:~$ nfsstat
...
Server nfs v3:
null         getattr      ...
9     0%     15106     3% ...
read         write        ...
411971   95% 118       0% ...
...
Run Code Online (Sandbox Code Playgroud)

所以,这个话题非常复杂,我想知道还有什么地方可以看,或者是否有一个简单的解决方案。

bet*_*ler 5

事实证明,问题比预期更容易解决。在 VM 的 fstab 中调整rsizewsize选项可以解决问题。相应的行现在是

192.168.10.2:/home/videos /mnt/nfs nfs auto,noatime,rsize=32768,wsize=32768  0 0
Run Code Online (Sandbox Code Playgroud)

对我来说,这并不明显,因为如果rsizewsize 的值满足磁盘的块大小 (4096) 并且不大于 NIC 的 MTU (9000),我曾期望最佳性能。显然,这个假设是错误的。

值得注意的是,确切的持续磁盘数据速率取决于文件本身:对于大小为 9 GB 的两个类似文件,我观察到的速率介于 155 MB/s(文件 1)和 140 MB/s(文件 2)之间。因此,降低一个文件的数据速率可能仍会导致另一个文件的全数据速率。