NFS导致的IO负载过大的问题 淡淡的烟草味﹌ 2021-09-20 01:46 399阅读 0赞 **\[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 转载于:https://blog.51cto.com/13272050/2115363
还没有评论,来说两句吧...