柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!
全部博文(1669)
分类: 系统运维
2015-07-17 13:25:54
async:异步读写。
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
user
sys
32768+0 records in
32768+0 records out
536870912 bytes (537 MB) copied, 0.184586 s, 2.9 GB/s
real
user
sys
改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
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
在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/