奇怪的nfsperformance:1个线程比8个更好,8个比2个更好!

我试图确定在同一主机上运行的两台Xen虚拟机(客户端和服务器)之间的nfs性能差的原因。 具体来说,根据两台虚拟机之间测得的networking连接速度,以及在服务器上直接读取文件的测量速度,我可以顺序读取客户端上1GB文件的速度远低于预期的速度。 虚拟机运行Ubuntu 9.04,服务器使用nfs-kernel-server软件包。

根据各种NFS调优资源,更改nfsd线程数(在我的情况下是内核线程)会影响性能。 通常这个build议是根据在重用服务器上的默认值8来增加的。 我在我目前的configuration中find:

RPCNFSDCOUNT=8 :(默认值):13.5-30秒,在客户端捕获一个1GB的文件,这样35-80MB /秒

RPCNFSDCOUNT=16 :18s RPCNFSDCOUNT=16文件60MB / s

RPCNFSDCOUNT=1 :8-9秒RPCNFSDCOUNT=1文件(!!?!)125MB / s

RPCNFSDCOUNT=2 :87s RPCNFSDCOUNT=2文件12MB /秒

我应该提到,我要导出的文件位于使用Xen的PCI-passthrough安装在服务器上的RevoDrive SSD; 在服务器上,我可以在几秒钟内(> 250MB /秒)捕获文件。 每次testing之前,我都会在客户端上放置caching。

我真的不想离开只有一个线程configuration的服务器,因为我猜测,有多个客户端时不会工作,但我可能会误解如何工作。 我重复了几次testing(改变两者之间的服务器configuration),结果相当一致。 所以我的问题是: 为什么1线程的性能最好?

我试过改变的其他一些东西,几乎没有影响:

  • 将/ proc / sys / net / ipv4 / ipfrag_low_thresh和/ proc / sys / net / ipv4 / ipfrag_high_thresh的值从默认值192K增加到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。 我已经使用这两个位置对我的文件进行了本地testing,并看到上面提到的良好性能。 如果答案/评论要求更多细节,我将添加它们。

当一个客户端请求进入时,它被切换到其中一个线程,其余的线程被要求做预读操作。 读取文件的最快方法是让一个线程按顺序执行…因此,对于一个文件来说这是过度的,线程实际上为自己做了更多的工作。 但是,当你在真实世界中进行部署时,1个客户端读取1个文件的情况不一定是真实的,所以坚持使用基于线程数和带宽/ CPU规格的预读数量的公式。