nfs的调优有两个方面:
性能调优
安全性的保障
其中,性能调优方面可以分为三个方向来进行:
磁盘层(nfs server端上磁盘读写的性能)
应用层(针对于nfs建立的应用程序)
网络层(nfs依赖的传输网络)
磁盘层面的调优可以通过划分raid来进行
client端和server端的调优都需要考虑到,下面有几个常用的调优措施:
1、通过设置nfs数据块大小来调优
[root@toolbox ~]# cat /proc/mounts
192.168.x.x:/data /mnt nfs rw,vers=3,rsize=32768,wsize=32768,hard,proto=tcp,timeo=600,retrans=2,sec=sys,addr=192.168.x.x 0 0
其中rsize=32768,wsize=32768指的是rpc读写数据包的分片大小。若设置的过小,则会增大rpc传输数据包的数量,也就会相应地增大网络的流量。因此设置这个参数的时候,需要考虑到机器的网络环境。通常情况下,高带宽的机器可以相应地将这个参数设置大一点。
2、通过设置MTU值来调优
MTU值代表了系统的最大可传输单元,系统的默认值是1500。通过netstat -i可以看出网卡的相关信息
[root@toolbox ~]# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 68955307 0 0 0 88410056 0 0 0 BMRU
lo 65536 17310 0 0 0 17310 0 0 0 LRU
通过修改MTU的大小可以确保数据包传输的次数。可以通过修改/etc/sysconfig/network-scripts/ifcfg-eth0或ifconfig eth0 mtu 9000 up来修改
注意:由于一些正在运行的进程可能不兼容新的MTU值,所以这会存在一些丢包的风险。
3、通过timeo和restrans来调优
timeo表示等待回传数据包的时间,默认值是0.7。请注意,这里的单位是一秒的10分之一,即如果设置为4个单位,则nfs客户端会等待4/10秒后再开始回传数据包。
testrans表示客户端重试回传的总次数,如果超过了这个限制就会报出一个超时。
[root@toolbox ~]# mount 192.168.0.102:/data /mnt -o timeo=4,retrans=4
可通过netstat -r来查看当前的nfs rpc传输情况:
[root@toolbox ~]# nfsstat -r
Client rpc stats:
calls retrans authrefrsh
5 0 0
4、开启多线程调优
nfs默认采用了8并行进程来提供服务。如果有大量连接访问到nfs,则可以适当提高这个值。
下面将nfs并行进程提高到16个
[root@toolbox ~]# cat /etc/sysconfig/nfs
```
RPCNFSDCOUNT=16
```
5、通过rpc同步或异步来调优
当nfs收到读写请求后,会通过rpc协议传输到server端,然后在server端上通过调用vfs的接口来对磁盘进行操作。同步(sync)请求只能够一个接一个的执行。异步(async)请求的接受和执行是分开的。异步的调用可以保证一定较短的相应时间。
注意:异步的操作在高频数据访问的场景下可能会产生一些数据丢失、宕机的故障发生,最好在一些对数据不敏感的业务使用异步。
[root@toolbox ~]# mount 192.168.0.101:/data /mnt -o rw,async
6、调整socket接收队列来调优
在传输大文件的过程中通常会需要申请大内存,这涉及到两个参数rmem、wmem,分别代表了接受和发送队列的长度。通常调高此值可以在传输大文件场景下提高速率,但这意味着需要更多的内存,这就会带来oom的风险。
可以通过调整/etc/sysctl.conf来调整
echo 219136 > /proc/sys/net/core/rmem_default
echo 219136 > /proc/sys/net/core/rmem_max
echo 219136 > /proc/sys/net/core/wmem_default
echo 219136 > /proc/sys/net/core/wmem_max