设置块大小
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
。