Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10197982
  • 博文数量: 1669
  • 博客积分: 16831
  • 博客等级: 上将
  • 技术积分: 12594
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 07:23
个人简介

柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!

文章分类

全部博文(1669)

文章存档

2023年(4)

2022年(1)

2021年(10)

2020年(24)

2019年(4)

2018年(19)

2017年(66)

2016年(60)

2015年(49)

2014年(201)

2013年(221)

2012年(638)

2011年(372)

分类: 系统运维

2015-07-17 13:25:54

转载:NFS性能优化

 (2015-07-04 11:44:11)
标签: 

it

分类: IT-存储服务器类
如果按mount -o nolock 192.168.1.220(假设为宿主机ip):/mnt/nfs /mnt/nfs_t 来mount ,传输速度可能很慢, 只有几K到几十K左右,所以想要获得较快的速度就要对nfs进行优化。
  
  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/端口号
  #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
  
  
  NFS:网络文件系统
  
  (NFS:Network File System)
  
    网络文件系统(NFS),起初由 Sun 微系统公司进行开发,后经 IETF 扩展,现在能够支持在不同类型的系统之间通过网络进行文件共享。换言之,NFS 可用于不同类型计算机、操作系统、网络架构和传输协议运行环境中的网络文件远程访问和共享。
  
     NFS 使用客户端/服务器架构,并由一个客户端程序和服务器程序组成。服务器程序向其它计算机提供对文件系统的访问,其过程就叫做“输出”。NFS 客户端程序对共享文件系统进行访问时,把它们从 NFS 服务器中“输送”出来。NFS 传输协议用于服务器和客户机之间文件访问和共享的通信,该协议还支持服务器通过输出控制向一组受到限制的客户计算机分配远程访问特权。
  
     NFS 版本2,是 NFS 最早被广泛应用的版本,起初完全运行于 UDP 协议之上,并且不保留状态。几大厂商扩展了 NSF 版本2,使之支持 TCP 传输。NFS 版本3整合了 TCP 传输。使用了 TCP 传输后,使得广域网中的 NFS 应用更为灵活。在继承了以前版本优点的基础之上,目前,NFS 版本4在功能上有如下的改进:
  
   * 提高了经由 Internet 进行访问的性能。本协议能够很容易地通过防火墙;在等待时间较长时带宽较小的情况下,其性能优越;且每台服务器所连接用户的数目可扩展到相当大的数目。
   * 将许可条款内置到协议之中,安全性得到了极大的加强。在对远程过程调用(RPC) PRCSEC_GSB 协议的支持上,本协议则建立在 ONCRPC 工作组的工作之上。另外,NFS 版本4支持客户机与服务器之间的安全对话,并要求客户机和服务器支持最简单的安全计划。
   * 支持扩展协议。本协议接受所支持协议的标准扩展,而不是打折的向后兼容。
  
     NFS 与 UNIX 系统息息相关,尽管它可以用于任何平台中,如 Macintosh 和 Microsoft Windows 操作系统。服务器消息块协议(SMB)和国际互联网普通文件系统(CIFS)是 NFS 的类似协议,在 Microsoft Windows 平台中,拥有着对等的网络文件系统应用。
  
  
  其实就是改为mount 192.168.1.220:/mnt/nfs /mnt/nfs_t -o nolock, rsize=1024,wsize=1024,timeo=15 就能获得较快的传输速度。。。

showmount -a
showmount -e

cat /etc/exports

优化读写块大小
默认是4096bit,
测试写性能 time dd if=/dev/zero of=/mnt/nfs1/512mb.dat bs=16k count=32768

32768+0 records out
536870912 bytes (537 MB) copied, 1.59033 s, 338 MB/s

real    0m1.600s
user    0m0.006s
sys     0m0.872s
 测试读性能 time dd if=/mnt/nfs1/512mb.dat of=/dev/null  bs=16k count=32768

32768+0 records in
32768+0 records out
536870912 bytes (537 MB) copied, 0.184586 s, 2.9 GB/s

real    0m0.187s
user    0m0.002s
sys     0m0.185s


改block大小,多测几次,看不同block下的性能

改block大小, vi /etc/fstab
nfs-server-ip:/nfs1 /mnt/nfs1 nfs rsize=8192,wsize=8192 0 0
 
 
优化MTU
tracepath nfsserver/2049
 
ifconfig eth0 mtu 512

改守护进程的NFS数目
cat /proc/net/nfsd  看性能
改进程数: /etc/rc.d/init.d/nfs RPCNFSDCOUNT=16
 
控制socket 输入队列大小
通常为65535byte (64KB),如果有8个NFS进程,每个只有8KB缓冲区用于存储输入队列的数据
 
改大小,echo 262144 >/proc/sys/net/core/rmem_default
echo 262144 >/proc/sys/net/core/rmem_max

管理报文碎片
未经处理的UDP报文碎片到达最高点,默认262144byte 也就是256KB,内核会丢弃正在送入的报文碎片,也就是会丢失报文,直到到达下限值
,默认192KB

NFS协议使用了分片的UDP报文,cat /proc/sys/net/ipv4/ipfrag_high_thresh
 
echo 65546 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 1966 > /proc/sys/net/ipv4/ipfrag_low_thresh
 

为啥nfs server断开后client端偶尔会不响应及解决办法


nfs server unavailable/unreachable后,client端偶尔会出现很诡异的情况:任何命令都跑不了/跑了没输出
 
这个问题在网上找了半天也没找到根本的原因,可能得读代码才能搞懂了,但是这个代码可不是一般的长......

找到了个解决办法,mount nfs的时候option制动为 intr, soft就可以避免如上这种情况:
intr: 默认情况下,当一个nfs 变得不可达后,在这个挂载点上的操作如ls、cd等会hang住。指定这个参数后,ls/cd之类的命令会收到信号EINTR 从而退出。
soft: 默认情况下,如果nfs server断开了,client这端会不停的尝试重新恢复连接而不是断开,这样频繁的重试会导致系统hang住,但是为啥就不知道了。指定soft后,client会timeout抛出异常而不是一直傻试。


===================分割线=================

1.设置块大小
mount命令的risize和wsize指定了server端和client端的传输的块大小。

mount -t nfs -o rsize=8192,wsize=8192,timeo=14,intr client:/partition /partition

如果未指定,系统根据nfs version来设置缺省的risize和wsize大小。大多数情况是4K对于nfs v2,最大是8K,对于v3,通过server端kernel设置risize和wsize的限制

vi /usr/src/linux2.4.22/include/linux/nfsd/const.h
修改常量: NFSSVC_MAXBLKSIZE

所有的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/端口
#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/rwmem_default
/proc/sys/net/core/wwmem_default
/proc/sys/net/core/rmmem_max
/proc/sys/net/core/wmmem_max

队列的长度最好是每一个nfsd有8k的大小。这样,server端就可以对client的请求作排队处理。如果要永久更改此值

#vi /etc/sysctl.conf
net.core.rmmem_default=数目
net.core.wmmem_default=数目
net.core.rmmem_max=数目
net.core.wmmem_max=数目
#service nfs restart


在NFS客户端运行

nfsstat -4 --all     (对于NFSv4)

在NFS服务器端运行

# nfsstat --all

cat /proc/mounts
fe80::63%vlan6:/ /nfsfolder nfs4 rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=fe80::82c1:6eff:fe76:6921,minorversion=0,local_lock=none,addr=fe80:0:0:0:0:0:0:63 0 0

NFS 调优

mount -v -t nfs4 -o rsize=1048576,wsize=1048576 [fe80::63%vlan6]:/ /nfsfolder/ 


  • nfsv4 或nfsv3 比nfsv2具有更好的性能
  • 如果系统支持,尽量使用更大的rsize和wsize。根据测试wsize为1MB时的连续写性能可以比wsize为1kB时提高2倍
  • 提高nfsd的线程数(SUSE linux /etc/sysconfig/nfs文件中的USE_KERNEL_NFSD_NUMBER,一个CPU内核至少设置一个线程,根据经验一个CPU内核设置4~8个线程更好)
  • 提高输入队列的内存限制,注意多个nfsd线程共享这些内存。NSF Client有很高的读负载,NFS Server有很高的写负载时,提高内存限制有重要的作用。


      # echo 262144 > /proc/sys/net/core/rmem_default
      # echo 262144 > /proc/sys/net/core/rmem_max

      # echo 262144 > /proc/sys/net/core/wmem_default
      # echo 262144 > /proc/sys/net/core/wmem_max

阅读(3223) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~