Joe*_*Joe 5 linux performance xen nfs
我正在尝试确定在同一主机上运行的两个 Xen 虚拟机(客户端和服务器)之间 nfs 性能不佳的原因。具体来说,我可以在客户端上顺序读取 1GB 文件的速度远低于根据测量的两个 VM 之间的网络连接速度和直接在服务器上读取文件的测量速度所预期的速度。VM 运行 Ubuntu 9.04,服务器使用 nfs-kernel-server 包。
根据各种 NFS 调优资源,更改 nfsd 线程(在我的示例中为内核线程)的数量会影响性能。通常这个建议是根据在频繁使用的服务器上增加默认值 8 的数量来制定的。我在当前配置中发现的内容:
RPCNFSDCOUNT=8:(默认):13.5-30 秒在客户端上抓取 1GB 文件,所以 35-80MB/秒
RPCNFSDCOUNT=16: 18s to cat 文件 60MB/s
RPCNFSDCOUNT=1: 8-9 秒到文件 (!!?!) 125MB/s
RPCNFSDCOUNT=2: 87s to cat 文件 12MB/s
我应该提到我正在导出的文件是在使用 Xen 的 PCI-passthrough 安装在服务器上的 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 选择了一个在它们之间条带化的 fakeRAID-0,我已将其安装到 /mnt/ssd,然后绑定安装到 /export/ssd。我已经使用两个位置对我的文件进行了本地测试,并看到了上面提到的良好性能。如果答案/评论要求更多详细信息,我会添加它们。
小智 2
当客户端请求传入时,它会被移交给其中一个线程,并要求其余线程执行预读操作。读取文件的最快方法是让一个线程按顺序执行...因此对于一个文件来说,这有点过分了,线程本质上是在为自己做更多的工作。但是,当您在现实世界中部署时,1 个客户端读取 1 个文件的情况不一定成立,因此请坚持使用基于带宽/CPU 规格的线程数和预读数的公式。