我正在尝试确定在同一主机上运行的两个 Xen 虚拟机(客户端和服务器)之间 nfs 性能不佳的原因。具体来说,根据测量的两个虚拟机之间的网络连接速度和测量的直接在服务器上读取文件的速度,我在客户端上连续读取 1GB 文件的速度远低于预期。虚拟机运行的是 Ubuntu 9.04,服务器使用的是 nfs-kernel-server 包。
根据各种 NFS 调优资源,更改 nfsd 线程数(在我的情况下是内核线程)会影响性能。通常,此建议是在使用率高的服务器上将数量从默认值 8 增加。我在当前配置中发现:
RPCNFSDCOUNT=8
:(默认值):客户端上 cat 一个 1GB 文件需要 13.5-30 秒,即 35-80MB/秒
RPCNFSDCOUNT=16
:18 秒内 cat 文件速度为 60MB/s
RPCNFSDCOUNT=1
:8-9秒对文件进行 cat 操作(!!?!)125MB/s
RPCNFSDCOUNT=2
:87 秒内 cat 文件速度为 12MB/s
我应该提到,我导出的文件位于使用 Xen 的 PCI 直通安装在服务器上的 RevoDrive SSD 上;在服务器上,我可以在几秒钟内 (> 250MB/s) 读取文件。每次测试之前,我都会在客户端上删除缓存。
我真的不想让服务器只配置一个线程,因为我猜想当有多个客户端时,这样做效果不会很好,但我可能误解了它的工作原理。我重复了几次测试(中间更改了服务器配置),结果相当一致。所以我的问题是:为什么1线程性能最好?
我还尝试过改变其他一些事情,但效果不大:
将 /proc/sys/net/ipv4/ipfrag_low_thresh 和 /proc/sys/net/ipv4/ipfrag_high_thresh 的值从默认的 192K、256K 增加到 512K、1M
将 /proc/sys/net/core/rmem_default 和 /proc/sys/net/core/rmem_max 的值从默认值 128K 增加到 1M
使用客户端选项 rsize=32768、wsize=32768 进行安装
从 sar -d 的输出中我了解到实际读取到底层设备的大小相当小(<100 字节),但这不会在客户端本地读取文件时造成问题。
RevoDrive 实际上公开了两个“SATA”设备 /dev/sda 和 /dev/sdb,然后 dmraid 拾取一个跨它们的假 RAID-0,我已将其安装到 /mnt/ssd,然后绑定安装到 /export/ssd。我使用这两个位置对我的文件进行了本地测试,并看到了上述良好的性能。如果答案/评论要求更多详细信息,我会添加它们。
答案1
当客户端请求到达时,它会被交给其中一个线程,其余线程则被要求执行预读操作。读取文件的最快方法是让一个线程按顺序执行...因此对于一个文件来说,这是过度的,线程本质上是在为自己做更多的工作。但是,对于一个客户端读取一个文件来说是正确的,当您在现实世界中部署时,不一定是正确的,因此请坚持使用基于带宽/CPU 规格的线程数和预读次数的公式。