作者:老王
公司一台服务器IO异常,先检测一下服务器状态:
[www@WebServer www]$ top
16:17:54 up 6:13, 4 users, load average: 15.03, 11.25, 8.96
87 processes: 85 sleeping, 1 running, 1 zombie, 0 stopped
CPU states: cpu user nice system irq softirq iowait idle
total 9.2% 0.0% 2.6% 0.4% 0.4% 39.7% 47.5%
cpu00 9.2% 0.0% 3.0% 3.0% 2.7% 48.6% 33.2%
cpu01 13.8% 0.0% 2.7% 0.3% 0.0% 30.5% 52.5%
[www@WebServer www]$ vmstat 1
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy id wa
0 2 4924 22572 41884 3072376 0 0 1028 2256 4215 5557 10 3 55 32
0 3 4924 21528 41876 3073488 0 0 1024 1236 2793 2656 16 2 45 47
可以看出IO负载很大,同时发现 一个僵尸进程(zombie),经确认不是IO负载的罪魁祸首。
[www@WebServer www]$ iostat
Linux 2.4.21-4.ELsmp (WebServer)
avg-cpu: %user %nice %system %iowait %idle
11.05 0.00 2.96 33.89 52.09
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
cciss/c1d0 40.46 172.63 151.65 3886978 3414712
cciss/c1d0p1 40.45 172.62 151.65 3886722 3414712
cciss/c0d0 263.09 1395.17 1037.15 31414204 23352808
cciss/c0d0p1 42.79 38.49 316.87 866738 7134680
cciss/c0d0p2 10.55 33.16 179.16 746584 4034144
cciss/c0d0p3 209.73 1323.51 541.12 29800618 12183984
大部分IO压力都集中在cciss/c0d0p3上面。
[www@WebServer www]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/cciss/c0d0p3 258G 180G 66G 74% /home
192.168.0.4:/home/x 258G 208G 37G 85% /home/x
192.168.0.4:/home/y 258G 208G 37G 85% /home/y
192.168.0.4:/home/z 258G 208G 37G 85% /home/z
可以确定IO压力是NFS造成的。
[www@WebServer www]$ cat /etc/fstab
未发现NFS设置。
[www@WebServer www]$ cat /etc/rc.local
mount -t nfs -o nolock -o intr -o soft 192.168.0.4:/home/x /home/x
mount -t nfs -o nolock -o intr -o soft 192.168.0.4:/home/y /home/y
mount -t nfs -o nolock -o intr -o soft 192.168.0.4:/home/z /home/z
得到NFS相关设置。
优化配置,视NFS版本调整rsize和wsize的设置,man mount可以看到相关信息:
Mount options for nfs:
rsize=8192,wsize=8192
This will make your nfs connection faster than with the default
buffer size of 4096. (NFSv2 does not work with larger values of
rsize and wsize.)
Mount options for nfs4:
rsize=32768,wsize=32768
This will make your nfs connection faster than with the default
buffer size of 4096.
查看一下192.168.0.4的NFS版本:
[www@FileServer /]# /usr/sbin/rpcinfo -p
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
可以看到是NFS2和NFS3混合使用。NFS2里,限制是8K,NFS3的限制取决于源代码里NFSSVC_MAXBLKSIZE的大小(/usr/include/linux/nfsd/const.h),一般也是8K。总的来说,Linux2.4内核里,NFS上限一般就是8K,如果条件允许,尽量使用Linux2.6内核,那样NFS上限可以达到32K,会爽得多。
当然,有时候不可能这么容易的确定BlockSize的大小,因为除了NFS自身上限的限制,还有诸如网络MTU等等的影响:
MTU的检测:
每个网段都有一个MTU,一般就是1500,一个数据要能传输,就必须符合MTU,大了的话就要分割成多块再传输,如果分块过多,可能会影响NFS的性能。
先来检测一下MTU的大小:
[www@WebServer www]$ tracepath 192.168.0.4
1: WebServer (192.168.0.3) asymm 65 0.236ms pmtu 1500
1: FileServer (192.168.0.4) 1.513ms reached
Resume: pmtu 1500 hops 1 back 1
不出所料,是1500。不过修改MTU对我来说有点太过专业,我还是通过别的方式来提升NFS性能吧。
我们可以通过一些测试来判断rsize, wsize设置是否合理:
测试NFS写操作:
假设256M的数据,分别按4k, 8k, 16k的BlockSize大小进行测试:
time dd if=/dev/zero of=/home/x/testfile bs=4k count=65536
time dd if=/dev/zero of=/home/x/testfile bs=8k count=32768
time dd if=/dev/zero of=/home/x/testfile bs=16k count=16384
多测试几次,就可以根据时间来判断最佳的wsize大小。
测试NFS读操作:
假设256M的数据,分别按4k, 8k, 16k的BlockSize大小进行测试:
time dd if=/home/x/testfile of=/dev/null bs=4k
time dd if=/home/x/testfile of=/dev/null bs=8k
time dd if=/home/x/testfile of=/dev/null bs=16k
多测试几次,就可以根据时间来判断最佳的rsize大小。 ---------------------------------
注:因为我没有Root权限,无法修改NFS设置,只能研究至此。
参考链接:
http://nfs.sourceforge.net/nfs-howto/ar01s05.html
NFS导致的IO负载过大的问题
最新推荐文章于 2022-01-16 12:47:31 发布