Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7771028
  • 博文数量: 701
  • 博客积分: 2150
  • 博客等级: 上尉
  • 技术积分: 13233
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-29 16:28
个人简介

天行健,君子以自强不息!

文章分类

全部博文(701)

文章存档

2019年(2)

2018年(12)

2017年(76)

2016年(120)

2015年(178)

2014年(129)

2013年(123)

2012年(61)

分类: 大数据

2013-10-31 13:00:10

十、nfs的传输速度优化
如果按
$ mount -o nolock 192.168.1.220(假设为宿主机ip):/mnt/nfs /mnt/nfs_t 
来mount ,传输速度可能很慢, 
只有几K到几十K左右,
所以想要获得较快的速度就要对nfs进行优化。
  
  
1.设置块大小
mount命令的
  risize和wsize指定了server端和client端的传输的块大小。


如果没有指定,
那么,系统根据nfs的版本来设置缺省的risize和wsize大小。大多数情况是4K(4096bytes),
对于nfs v2,最大是8K,
对于nfs 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来测试。
这是来测试nfs写:
$ time dd if=/dev/zero of=/testfs/testfile.dat bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.009669 seconds, 868 MB/s


real    0m0.013s
user    0m0.000s
sys     0m0.013s


这是测试nfs读:
$ time dd if=/testfs/testfile.dat of=/dev/null bs=8k 
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.002015 seconds, 4.2 GB/s


real    0m0.003s
user    0m0.000s
sys     0m0.002s


测试时文件 /testfs/testfile 的大小至少是系统RAM的两倍,
每次测试都使用umount 和mount对/testfs进行挂载,
通过比较不同的块大小,得到优化的块大小。


2.网络传输包的大小
网络在包传输过程,对包要进行分组,过大或者过小都不能很好的利用网络的带宽,
所以对网络要进行测试和调优。
可以使用: 
$ 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。


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


6. 两组不同参数的实测结果  
参数一:
mount -t nfs 192.168.1.220:/mnt/nfs /mnt/nfs_t -o nolock, rsize=1024,wsize=1024,timeo=15 
就能获得较快的传输速度。。。
读速度测试:
$ time dd if=/opt/mnt_nfs_shared/nfs_test.flv of=/dev/null bs=8k 
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.00206 seconds, 4.1 GB/s


real    0m0.003s
user    0m0.000s
sys     0m0.003s


写速度测试:
$ time dd if=/dev/zero of=/opt/nfs_test.flv bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.010595 seconds, 792 MB/s


real    0m0.014s
user    0m0.001s
sys     0m0.013s




参数二:
server:/opt/nfs_shared /opt/mnt_nfs_shared nfs rsize=8192,wsize=8192,timeo=14,intr
读速度测试:
$ time dd if=/opt/mnt_nfs_shared/nfs_test.flv of=/dev/null bs=8k   
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.002931 seconds, 2.9 GB/s


real    0m0.004s
user    0m0.000s
sys     0m0.004s


写速度测试:
$ time dd if=/dev/zero of=/opt/nfs_test.flv bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.010859 seconds, 773 MB/s


real    0m0.014s
user    0m0.000s
sys     0m0.014s


NOTE:
我这里提供的参数只是在我的机器上测到的;
实际上真正使用时要具体测试才知道;
有时候什么参数都不设置,反而比设置了参数方案和读/写速度更好;
阅读(21480) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~