标签归档:NFS

转:VMware ESXi 挂载 iSCSI 和 NFS 性能测试

原文地址:http://www.yaoge123.com/blog/archives/202

  iSCSI-target和NFS Server由一台Raid10(4*2.5′ 10Krpm 146GB)的VMware ESXi
3.5里的FreeBSD服务机提供,在另一台Raid1(2*3.5′ 15Krpm 146GB)的VMware ESXi
3.5里挂载iSCSI和NFS,然后分别以虚拟磁盘添加入FreeBSD测试机中。使用/usr/local/bin/iozone -i 0 -i 1
-i 2 -r 1024 -s 1G -t 2 -C测试。测试结果如下:

  iSCSI测试:
Initial write = 5443.42 KB/sec
Rewrite = 4840.85 KB/sec
Read = 19823.13 KB/sec
Re-read = 19298.97 KB/sec
Random read = 44114.65 KB/sec
Random write = 4024.72 KB/sec

  NFS测试:
Initial write = 952.76 KB/sec
Rewrite = 975.36 KB/sec
Read = 14782.20 KB/sec
Re-read = 16085.16 KB/sec
Random read = 41878.42 KB/sec
Random write = 794.31 KB/sec

  CPU占用率上NFS只有iSCSI的一半,服务机和测试机都差不多。iSCSI时CPU占用率为15%左右,中间还有一段是30%多。NFS时基本都8%左右。两台机器均为2*Intel E5405,分配给虚拟机2个核。

  测试机直接加载NFS测试:
Initial write = 2361.99 KB/sec
Rewrite = 2130.92 KB/sec
Read = 17595.85 KB/sec
Re-read = 18904.29 KB/sec
Random read = 13139.79 KB/sec
Random write = 2001.82 KB/sec

  测试机本地测试:
Initial write = 8233.32 KB/sec
Rewrite = 12511.68 KB/sec
Read = 34969.73 KB/sec
Re-read = 34179.26 KB/sec
Random read = 82272.52 KB/sec
Random write = 4620.50 KB/sec

  服务机本地测试:
Initial write = 6236.64 KB/sec
Rewrite = 9016.30 KB/sec
Read = 47051.42 KB/sec
Re-read = 47444.12 KB/sec
Random read = 27243.86 KB/sec
Random write = 3251.88 KB/sec

服务器不稳定的罪魁祸首找到了

迁移到分布式集群后,困扰了我们很长时间的突发性Load异常终于在昨天找到原因了,原来是NFS的挂载选项引起的,我们之前挂载用的是sync模式,导致集群的web后端在往挂载于NFS服务器的日志目录打日志时会产生严重的延时,引起MySQL产生大量的sleep进程。而且在高并发的情况下,这种情况会不断的恶化,因为多个后端需要抢占日志文件,而sync决定了大家同时只能有一个后端在操作日志文件,其他的请求必须排队,高并发时nfsd的调度能力下降,会导致php-fpm出现大量的无法自己清理的sleep进程。

而且,由于我们自定义的日志是频繁打开和关闭文件的,于是,nfs用的portmap会产生大量的getattr类型的rpc call,查阅RedHat的文档的时候发现,频繁的getattr会大大降低nfs的性能,于是情况更加恶化了。所以前段时间妖气一直都不是很稳定。

经过在测试机上做的测试,把挂载选项调整为async后,往nfs上进行简单文件操作的php总执行时间从sync模式的25ms左右缩短到0.9ms,虽然和本机文件的0.0x ms比慢不少,但至少可以接受了。

async模式下,nfs服务端5s刷新一次脏数据到硬盘中,这个间隔还是可以接受的。调整为async后,日志都正常开启,MySQL的process list里面sleep终于没有了,偶尔有也是不超过1s的,正常了。

分布式系统带来的新的的技术难点和需要注意的地方真的很多,考虑的地方多很多。

妖气加油!

nfs优化(转)

转自:http://www.linuxsky.org/doc/network/200709/130.html

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服务器不得不说的一个问题–防火墙

如果NFS服务器在内网,没有暴露在外网的话,防火墙关闭的话,配置起来没有什么问题,但是如果需要打开防火墙,比如iptables,配置完毕后客户端正常情况下是访问不了nfs服务的。

NFS服务端:SERVER

在客户端:

showmount -e SERVER

会返回类似于No route to host.的错误,就是因为防火墙的原因,阻挡了RPC通信。

解决方法:

首先,在SERVER上

 vi /etc/sysconfig/nfs

把MOUNTD_PORT=892前面的注释去掉,保存

然后,在SEVER上修改iptables

添加以下几条

-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state –state NEW -m udp –dport 111 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 892 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state –state NEW -m udp –dport 892 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m state –state NEW -m udp –dport 2049 -j ACCEPT

保存。

service iptables restart

service portmap restart

service nfs restart
客户端上:

service portmap restart

于是,OK啦.

一篇比较全面的NFS配置日志,转之…《CentOS下NFS服务器配置》

原文地址:

CentOS下NFS服务器配置

Posted by – 2010-04-20


####################################
#NFS_Configuration
#Author:楚霏
#Date: 2010-4-20
#Update:2010-4-26
#Env: Centos 5.4 x86_64
####################################

二、环境介绍
####################################
两台机器全是Centos 5.4 x86_64
服务端IP=10.0.0.52
客户端IP=10.0.0.166
####################################

三、配置服务端
####################################
#因为默认已经安装portmap,nfs-utils-lib和nfs-utils,所以直接配置即可
#创建要共享的目录


1 mkdir /nfsdata

#nfs的主配置文件是/etc/exports


1 vi /etc/exports
2 #----------------------------引用文字-开始----------------------------
3 #加入
4 /nfsdata 10.0.0.0/24(rw,root_squash,no_all_squash,sync)
5 #----------------------------引用文字-结束----------------------------

#保存设置


1 exportfs -r

#配置文件每行分为段:
#第一段为共享的目录,使用绝对路径
#第二段为客户端地址及权限:
地址可以使用完整IP或网段,例如10.0.0.8或10.0.0.0/24,10.0.0.0/255.255.255.0当然也可以
地址可以使用主机名,DNS解析的和本地/etc/hosts解析的都行,支持通配符,例如:*.chengyongxu.com
权限有:
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。
####################################

四、启动、测试
####################################
#先启动所依赖的postmap


1 service portmap start
2 service nfs start

#本地测试


1 showmount -e 10.0.0.52
2 #----------------------------输出文字-开始----------------------------
3 Export list for 10.0.0.52:
4 /nfsdata 10.0.0.0/24
5 #----------------------------输出文字-结束----------------------------

#创建挂载点

1 mkdir /mnt/nfsdata

#挂载


1 mount -t nfs 10.0.0.52:/nfsdata /root/nfsdata

#检查


01 mount
02 #----------------------------输出文字-开始----------------------------
03 /dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
04 proc on /proc type proc (rw)
05 sysfs on /sys type sysfs (rw)
06 devpts on /dev/pts type devpts (rw,gid=5,mode=620)
07 /dev/hda1 on /boot type ext3 (rw)
08 tmpfs on /dev/shm type tmpfs (rw)
09 none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
10 sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
11 nfsd on /proc/fs/nfsd type nfsd (rw)
12 10.0.0.52:/nfsdata on /root/nfsdata type nfs (rw,addr=10.0.0.52)
13 #----------------------------输出文字-结束----------------------------

#写文件进行测试


1 echo "This is a test" >> /nfsdata/test

#检查一下


1 cat /root/nfsdata/test

#客户端测试
#步骤相似


1 service portmap start
2 service nfs start
3 showmount -e 10.0.0.52
4 mount -t nfs 10.0.0.52:/nfsdata /root/nfsdata

#检查


01 mount
02 #----------------------------输出文字-开始----------------------------
03 /dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
04 proc on /proc type proc (rw)
05 sysfs on /sys type sysfs (rw)
06 devpts on /dev/pts type devpts (rw,gid=5,mode=620)
07 /dev/hda1 on /boot type ext3 (rw)
08 tmpfs on /dev/shm type tmpfs (rw)
09 none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
10 sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
11 nfsd on /proc/fs/nfsd type nfsd (rw)
12 10.0.0.52:/nfsdata on /root/nfsdata type nfs (rw,addr=10.0.0.52)
13 #----------------------------输出文字-结束----------------------------

#读写一下检查检查


1 cat /root/nfsdata/test
2 vi /root/nfsdata/test

#注意:
#如果需要开机挂载的话别忘了在/etc/fstab中加入


1 #----------------------------引用文字-开始----------------------------
2 /root/nfsdata   10.0.0.52:/nfsdata
3 #----------------------------引用文字-结束----------------------------

####################################

五、常见错误
####################################
错误一:Cannot register service: RPC


01 service nfs restart
02 #----------------------------输出文字-开始----------------------------
03 Shutting down NFS mountd:                                  [  OK  ]
04 Shutting down NFS daemon:                                  [  OK  ]
05 Shutting down NFS quotas:                                  [  OK  ]
06 Shutting down NFS services:                                [  OK  ]
07 Starting NFS services:                                     [  OK  ]
08 Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused
09 rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).
10                                                            [FAILED]
11 #----------------------------输出文字-结束----------------------------
12  
13 #解决方法:
14 service portmap start
15 #先启动portmap才行

01 错误二:Address already in use
02 tail -f /var/log/message
03 #----------------------------输出文字-开始----------------------------
04 Apr 10 13:43:27 bogon nfsd[15918]: nfssvc: Setting version failed: errno 16 (Device or resource busy)
05 Apr 10 13:43:27 bogon nfsd[15918]: nfssvc: unable to bind UPD socket: errno 98 (Address already in use)
06 Apr 10 13:45:27 bogon nfsd[15978]: nfssvc: Setting version failed: errno 16 (Device or resource busy)
07 Apr 10 13:45:27 bogon nfsd[15978]: nfssvc: unable to bind UPD socket: errno 98 (Address already in use)
08 Apr 10 13:49:05 bogon nfsd[16080]: nfssvc: Setting version failed: errno 16 (Device or resource busy)
09 #----------------------------输出文字-结束----------------------------
10  
11 #解决方法:
12 ps aux | grep nfs
13 #然后用kill干掉这些进程

错误三:mount: 10.0.0.52:/nfsdata failed, reason given by server: Permission denied


1 #解决方法:
2 a.把该客户端的ip加入服务端的/etc/exports
3 b.服务端的和客户端规则要统一,要么都使用主机名(注意每台机器的hosts文件),要么都使用IP

错误四:客户端挂载超时


01 tail -f /var/log/message
02 #----------------------------输出文字-开始----------------------------
03 Apr 10 14:42:35 localhost kernel: portmap: server localhost not responding, timed out
04 Apr 10 14:42:35 localhost kernel: RPC: failed to contact portmap (errno -5).
05 Apr 10 14:42:46 localhost kernel: RPC: failed to contact portmap (errno -512).
06 Apr 10 14:42:46 localhost kernel: lockd_up: makesock failed, error=-512
07 Apr 10 14:42:46 localhost kernel: RPC: failed to contact portmap (errno -512).
08 #----------------------------输出文字-结束----------------------------
09  
10 #解决方法:
11 service portmap restart
12 service nfs restart

错误五:Error: RPC MTAB does not exist.


01 service nfs start
02 #----------------------------引用文字-开始----------------------------
03 Starting NFS services:                                     [  OK  ]
04 Starting NFS quotas:                                       [  OK  ]
05 Starting NFS daemon:                                       [  OK  ]
06 Starting NFS mountd:                                       [  OK  ]
07 Starting RPC idmapd: Error: RPC MTAB does not exist.
08 #----------------------------引用文字-结束----------------------------
09  
10 #解决方法:
11 #手动执行
12 mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs/
13 #需要时加入开机启动时,加入下面两行到/etc/fstab
14 #----------------------------引用文字-开始----------------------------
15 rpc_pipefs /var/lib/nfs/rpc_pipefs rpc_pipefs defaults 0 0
16 nfsd /proc/fs/nfsd nfsd defaults 0 0
17 #----------------------------引用文字-结束----------------------------

####################################

昨天关于NFS的那篇日志的补完

昨天的关于nfs的日志中缺少一种情况,就是服务端和客户端都重启的情况下,如果服务端比客户端晚重启完成,会造成客户端第一次就mount失败,于是就停止mount NFS的目录了,于是需要解决这个问题,目前有3种方法可以考虑。

1.最简单的,在客户端上crond每五分钟自动执行一次mount -a

2.用cacti的监控,如果监控机发现客户端的nfs目录异常,执行脚本通知客户端执行mount -a

3.autofs,访问时自动挂载,只要服务端启动完成,就能挂载上

其实就是定期执行和触发式的区别。暂未决定使用哪种。

NFS服务器端和客户端重启后自动挂载的处理

服务器部署中有个问题一直没有去解决,写文档的时候涉及到了,必须去解决一下。

NFS服务启动完成,NFS客户端成功挂载后。进行重启实验。

1.只重启客户端,客户端启动后会自动加载fstab中的nfs挂载项,成功挂载。

2.只重启服务端,客户端在服务端重启后操作之前挂载上的nfs目录,会卡死。而且在服务端重启完毕后仍然无法正常挂载nfs目录,且umount也会失败。

解决方法:1.fstab中nfs挂载选项加上hard,intr

类似这样:

test1:/data/nfs_test      /data/nfs_test  nfs          hard,intr         0 0

hard指连接失败后一直尝试重新挂载,intr指的是中断无法完成的访问请求。

修改后保存客户端fstab。

再次重启客户端或者服务端都可以正常挂载.

2.使用autofs,访问的时候才去挂载,有超时和重试机制,没有具体实验。

另外注意服务端的防火墙需要关闭或者开放相应的端口