nfs优化篇

1.配置块大小
mount命令的risize和wsize指定了server端和client端的传输的块大小。假如没有指定,那么,系统根据nfs的版本来配置缺省的risize和wsize大小。大多数情况是4K(4096bytes),对于nfs v2,最大是8K,对于v3,在server端配置risize和wsize的限制,最大块大小在kernel的常量NFSSVC_MAXBLKSIZE,该常量在usr/src/linux2.4/include/linux/nfsd/const.h.任何的2.4的的client都支持最大32K的传输块。系统缺省的块可能会太大或太小,这主要取决于您的kernel和您的网卡,太大或太小都有可能导致nfs速度很慢。具体的能够使用Bonnie,Bonnie ,iozone等benchmark来测试不同risize和wsize下nfs的速度。当然,也能够使用dd来测试。
#time dd if=/dev/zero of=/testfs/testfile bs=8k count=1024这是来测试nfs写
#time dd if=/testfs/testfile of=/dev/null bs=8k 这是测试nfs读
测试时文档的大小至少时系统RAM的两倍,每次测试都使用umount 和mount对/testfs进行挂载,通过比较不同的块大小,得到优化的块大小。
2.网络传输包的大小
网络在包传输过程,对包要进行分组,过大或过小都不能很好的利用网络的带宽,所以对网络要进行测试和调优。能够使用ping -s 2048 -f hostname进行 ping,尝试不同的package size,这样能够看到包的丢失情况。同时,能够使用nfsstat -o net 测试nfs使用udp传输时丢包的多少。

因为统计不能清零,所以要先运行此命令记住该值,然后能够再次运行统计。假如,经过上面的统计丢包很多。那么能够看看网络传输包的大小。使用下面的命令:
#tracepath node1/端口号 如 #tracepat 192.168.1.1/2049 # 这里2049为nfs的侦听端口
#ifconfig eth0

比较网卡的mtu和刚刚的pmtu,使用#ifconfig eth0 mtu 16436配置网卡的mtu和测试的一致。
备注:linux最大包大小的有效范围是 64 到 9216 字节,并且9216是支持jumbo frame的。

当然假如risize和wsize比mtu的值大,那么的话,server端的包传到client端就要进行重组,这是要消耗client端的cpu资源。此外,包重组可能导致网络的不可信和丢包,任何的丢包都会是的rpc请求重新传输,rpc请求的重传有会导致超时,严重降低nfs的性能。能够通过查看/proc/sys/net/ipv4/ipfrag_high_thresh和/proc/sys/net/ipv4/ipfrag_low_thresh了解系统能够处理的包的数目,假如网络包到达了ipfrag_high_thresh,那么系统就会开始丢包,直到包的数目到达ipfrag_low_thresh。
3.nfs挂载的优化

timeo:假如超时,客户端等待的时间,以十分之一秒计算。
retrans:超时尝试的次数。
bg:后台挂载,很有用
hard:假如server端没有响应,那么客户端一直尝试挂载。
wsize:写块大小
rsize:读块大小
intr:能够中断不成功的挂载
noatime:不更新文档的inode访问时间,能够提高速度。
async:异步读写。
4.nfsd的个数
缺省的系统在启动时,有8个nfsd进程。
#ps -efl|grep nfsd
通过查看/proc/net/rpc/nfsd文档的th行,第一个是nfsd的个数,后十个是线程是用的时间数,第二个到第四个值假如很大,那么就需要增加nfsd的个数。
具体如下:
#vi /etc/init.d/nfs
找到RPCNFSDCOUNT,修改该值,一般和client端数目一致。
然后,重启服务。
#service nfs restart
#mount -a
5.nfsd的队列长度
对于8个nfsd进程,系统的nfsd队列长度是64k大小,假如是多于8个,就要相应的增加相应的队列大小,具体的在/proc/sys/net/core/【rw】mem_default和/proc/sys/net/core/【rw】mem_max。队列的长度最好是每一个nfsd有8k的大小。这样,server端就能够对client的请求作排队处理。假如要永久更改此值
#vi /etc/sysctl.conf
加入
net.core.【rw】mem_max=数目
net.core.【rw】mem_default=数目
#service nfs restart