NFS客户端具有不平衡的读写速度

我有一个NetApp作为我的nfs服务器,两个Linux服务器作为nfs客户端。 问题是这两个服务器中较新的一个在读取和写入nfs服务器时,读写速度会有很大差异。 另外,这个新服务器的读写看起来很棒。 旧的服务器没有这个问题。

老主人:鲤鱼

带有8个内核,32 GB RAM的Sun Fire x4150

SLES 9 SP4

networking驱动程序:e1000

me@carp:~> uname -a Linux carp 2.6.5-7.308-smp #1 SMP Mon Dec 10 11:36:40 UTC 2007 x86_64 x86_64 x86_64 GNU/Linux 

新主持人:胡椒

HP ProLiant Dl360P Gen8 w / 8核,64 GB RAM

CentOS 6.3

networking驱动程序:tg3

 me@pepper:~> uname -a Linux pepper 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux 

我会跳到一些图表说明读/写testing。 胡椒粉和它的不平衡的读/写:

辣椒吞吐量

这里是鲤鱼,看起来很好:

鲤鱼吞吐量

testing

这是我正在运行的读/写testing。 我已经单独运行了这些程序,并且它们在胡椒上看起来很棒,但是当它们一起运行时(使用& ),写入性能保持稳定,而读取性能则受到很大影响。 testing文件是RAM大小的两倍(胡椒为128 GB,鲤鱼为64 GB)。

 # write time dd if=/dev/zero of=/mnt/peppershare/testfile bs=65536 count=2100000 & # read time dd if=/mnt/peppershare/testfile2 of=/dev/null bs=65536 & 

NFS服务器主机名是nfsc。 Linux客户端在子网上有一个专用NIC,与其他任何东西(即与主IP不同的子网)分开。 每个Linux客户端都会将nfs共享从服务​​器nfsc装载到/ mnt / hostnameshare。

nfsiostat

下面是辣椒同时testing的一分钟样品:

 me@pepper:~> nfsiostat 60 nfsc:/vol/pg003 mounted on /mnt/peppershare: op/s rpc bklog 1742.37 0.00 read: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 49.750 3196.632 64.254 0 (0.0%) 9.304 26.406 write: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 1642.933 105628.395 64.293 0 (0.0%) 3.189 86559.380 

我还没有在旧的主人鲤鱼nfsiostat,但在这上面工作。

的/ proc /坐骑

 me@pepper:~> cat /proc/mounts | grep peppershare nfsc:/vol/pg003 /mnt/peppershare nfs rw,noatime,nodiratime,vers=3,rsize=65536,wsize=65536,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.xxx,mountvers=3,mountport=4046,mountproto=tcp,local_lock=none,addr=172.xxx 0 0 me@carp:~> cat /proc/mounts | grep carpshare nfsc:/vol/pg008 /mnt/carpshare nfs rw,v3,rsize=32768,wsize=32768,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,timeo=60000,retrans=3,hard,tcp,lock,addr=nfsc 0 0 

网卡设置

 me@pepper:~> sudo ethtool eth3 Settings for eth3: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Half 1000baseT/Full Advertised pause frame use: Symmetric Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 4 Transceiver: internal Auto-negotiation: on MDI-X: off Supports Wake-on: g Wake-on: g Current message level: 0x000000ff (255) Link detected: yes me@carp:~> sudo ethtool eth1 Settings for eth1: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on Supports Wake-on: umbg Wake-on: g Current message level: 0x00000007 (7) Link detected: yes 

卸载设置:

 me@pepper:~> sudo ethtool -k eth3 Offload parameters for eth3: rx-checksumming: on tx-checksumming: on scatter-gather: on tcp-segmentation-offload: on udp-fragmentation-offload: off generic-segmentation-offload: on generic-receive-offload: on large-receive-offload: off me@carp:~> # sudo ethtool -k eth1 Offload parameters for eth1: rx-checksumming: on tx-checksumming: on scatter-gather: on tcp segmentation offload: on 

它全部在一个局域网上,在全双工的nfs客户端和nfs服务器之间有一个千兆交换机。 在另一个说明,我看到相当多的IO在CPU上等待胡椒比预期,因为我怀疑它等待nfs操作。

我用Wireshark / Ethereal抓取了数据包,但是在这方面我并不擅长,所以不知道要找什么。 在Wireshark中我看不到一堆以红色/黑色突出显示的数据包,所以我查找了所有这些信息:)。 这种糟糕的nfs性能已经在我们的Postgres环境中performance出来了。

任何进一步的想法或疑难解答提示 让我知道,如果我可以提供进一步的信息。

UPDATE

Per @ ewwhite的评论中,我尝试了两个不同的调谐configuration文件,但没有改变。

在我的红色标记的右边是两个更多的testing。 第一个是throughput-performance ,第二个是enterprise-storage

胡椒调教

nfsiostat 60的企业存储configuration文件

 nfsc:/vol/pg003 mounted on /mnt/peppershare: op/s rpc bklog 1758.65 0.00 read: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 51.750 3325.140 64.254 0 (0.0%) 8.645 24.816 write: ops/s kB/s kB/op retrans avg RTT (ms) avg exe (ms) 1655.183 106416.517 64.293 0 (0.0%) 3.141 159500.441 

更新2

sysctl -a用于胡椒

在fstab中添加noac nfs安装选项是silverlight子弹。 总吞吐量没有改变,仍然在100 MB / s左右,但是现在我的读写操作更加平衡,我不得不想象的将是Postgres和其他应用程序的前兆。

在这里输入图像说明

你可以看到我标记了我在testing时使用的各种“块”大小,即rsize / wsize缓冲区大小挂载选项。 我发现一个8K大小的ddtesting的吞吐量最好,令人惊讶的。

这些是我现在使用的nfs坐骑选项,per /proc/mounts

 nfsc:/vol/pg003 /mnt/peppershare nfs rw,sync,noatime,nodiratime,vers=3,rsize=8192,wsize=8192,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,hard,noac,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.xxx,mountvers=3,mountport=4046,mountproto=tcp,local_lock=none,addr=172.xxx 0 0 

FYI, noac选项man entry:

ac / noac

select客户端是否可以caching文件属性。 如果没有指定任何选项(或者指定了ac),则客户端将caching文件属性。

为了提高性能,NFS客户端caching文件属性。 每隔几秒,NFS客户端就会检查每个文件属性的服务器版本以进行更新。 在客户端再次检查服务器之前,在这些小间隔内发生的更改仍未被发现。 noac选项可防止客户端caching文件属性,以便应用程序可以更快速地检测服务器上的文件更改。

除了防止客户端caching文件属性外,noac选项还会强制应用程序写入同步,以便立即在服务器上显示对文件的本地更改。 这样,其他客户端在检查文件的属性时可以快速检测到最近的写入。

使用noac选项可以在访问相同文件的NFS客户端之间提供更高的caching一致性,但是会提高性能。 因此,鼓励谨慎使用文件locking。 数据和元数据一致性部分包含这些权衡的详细讨论。

我在网上看到关于属性caching的不同看法,所以我唯一的想法是,它是一个必要的选项,或者与NetApp NFS服务器和/或Linux客户机(更新的内核)(> 2.6.5)配合使用。 我们没有看到有关2.6.5内核的SLES 9上的这个问题。

我也阅读了rsize / wise的不同意见,并且通常采用默认值,目前我的系统是65536,但8192给了我最好的testing结果。 我们也将用postgres做一些基准testing,所以我们将看看这些不同的缓冲区大小如何。