设置块大小

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 进行挂载,通过比较不同的块大小,得到优化的块大小。




nfs 挂载的优化
  
timeo: 如果超时,客户端等待的时间,以十分之一秒计算。
retrans :超时尝试的次数。
bg :后台挂载,很有用
hard :如果 server 端没有响应,那么客户端一直尝试挂载。
wsize :写块大小
rsize :读块大小
intr :可以中断不成功的挂载
noatime :不更新文件的 inode 访问时间,可以提高速度。
async :异步读写。

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

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

网络传输包的大小
网络在包传输过程,对包要进行分组,过大或者过小都不能很好的利用网络的带宽,所以对网络要进行测试和调优。可以使用 ping -s 2048 -f hostname 进行 ping ,尝试不同的 package size ,这样可以看到包的丢失情况。同时,可以使用 nfsstat - o net 测试 nfs 使用 udp 传输时丢包的多少。

因为统计不能清零,所以要先运行此命令记住该值,然后可以再次运行统计。如果,经过上面的统计丢包很多。那么可以看看网络传输包的大小。使用下面的命令:

 

#tracepath node1/ 端口号
#ifconfig eth0

较网卡的 mtu 和刚刚的 pmtu ,使用 #ifconfig eth0 mtu 16436 设置网卡的 mtu 和测试的一致。

当然如果 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 。