![KVM + NFS 磁盘性能不佳](https://linux22.com/image/617876/KVM%20%2B%20NFS%20%E7%A3%81%E7%9B%98%E6%80%A7%E8%83%BD%E4%B8%8D%E4%BD%B3.png)
情况:我们有一台使用 KVM 托管三台虚拟机的 Ubuntu 服务器。所有来宾和主机都需要访问 /var 某个子文件夹中的相同文件。因此,子文件夹通过 NFS 导出。我们的问题是来宾只能以主机一半的速度读取/写入目录。导出表如下所示
alice@host:~$ cat /etc/exports
/home/videos 192.168.10.0/24(rw,sync,no_root_squash)
其中主机的 IP 为 192.168.10.2,虚拟机的 IP 为 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
硬盘的持续数据速率为~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
从虚拟机内部来看情况有所不同:
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/
将块大小与文件系统的页面大小相匹配并没有得到令人满意的效果:
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
我查阅了有关 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)
在这种情况下,令我困扰的——也是我不明白的——是 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
...
对于第三列及以后的列,我预期从虚拟机内的磁盘读取后会出现除零以外的值。但是,nfsstat 告诉我确实存在读取操作:
alice@host:~$ nfsstat
...
Server nfs v3:
null getattr ...
9 0% 15106 3% ...
read write ...
411971 95% 118 0% ...
...
所以,这个主题相当复杂,我想知道在哪里可以找到它或者是否有一个简单的解决方案。
答案1
事实证明,这个问题比预期的更容易解决。大小和大小VM 的 fstab 中的选项解决了这个问题。相应的行现在是
192.168.10.2:/home/videos /mnt/nfs nfs auto,noatime,rsize=32768,wsize=32768 0 0
对我来说这并不明显,因为我曾期望如果值为大小和大小满足磁盘的块大小(4096)并且不大于网卡的 MTU(9000)。显然,这个假设是错误的。
值得注意的是,确切的持续磁盘数据速率取决于文件本身:对于两个大小为 9 GB 的类似文件,我观察到的速率介于 155 MB/s(文件 1)和 140 MB/s(文件 2)之间。因此,一个文件的数据速率降低仍可能导致另一个文件的数据速率达到最高。