关于AIX挂载NFS写入效率低效的解决方法
NFS提供的服务
Mount:通过在服务端启用/usr/sbin/rpc.mountd伺服进程,在客户端使用mount命令,mounted伺服进程是一个RPC来回应客户端的请求
RemoteFileaccess:通过在服务端启用/usr/sbin/nfsd和在客户端启用/usr/sbin/biod,来出来客户端对文件的请求。但客户端一个用户要来读或写一个在服务器端的文件时,biod伺服进程发送这个请求到服务端。
Bootparameters:通过在服务端启用/usr/sbin/rpc.bootparamd伺服进程来提供无盘SunOS客户端的启动参数。
PCauthentication:通过在服务端启动/usr/sbin/rpc.pcnfsd来提供PC-NFS的用户认证服务
一个NFS服务是无状态的(stateless),也就是说,NFS的传输是原子级的,一个单一的NFS传输对应了一个单一完整的文件操作。
背景:
Linux是NFS的Server端,AIX是NFS的Client端(此外,有一个Linux也作为Client端对比测试)。
1.NFS对应的底层设备是闪存卡,本地测试I/O写性能可达2GB/s;
2.服务器是千兆网卡,FTP测试传输可达到100MB/s;
3.AIX成功挂载NFS,dd测试写入速度只有10MB/s;
4.Linux成功挂载NFS,同样dd测试写入速度可达到100MB/s;
说明:以上速度主要是体现数量级的差异,实际测试会有少许偏差。
具体环境:
- NFSServer:RHEL6.8
- NFSClient:AIX6.1、RHEL6.8
挂载参数均依据MOS文档配置:
MountOptionsforOraclefilesforRACdatabasesandClusterwarewhenusedwithNFSonNASdevices(文档ID359515.1)
根据本次实际需求,提炼一下需要配置的参数:
--MOS建议(AIX):
cio,rw,bg,hard,nointr,rsize=32768,
wsize=32768,proto=tcp,noac,
vers=3,timeo=600--MOS建议(Linux):
rw,bg,hard,nointr,rsize=32768,
wsize=32768,tcp,actimeo=0,
vers=3,timeo=600
AIXNFS的挂载参数:
mount-ocio,rw,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,noac,vers=3,timeo=60010.xx.xx.212:/xtts/xtts
直接挂载提示如下错误:
#mount-ocio,rw,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,noac,vers=3,timeo=60010.xx.xx.212:/xtts/xtts mount:1831-008givingupon: 10.xx.xx.212:/xtts vmount:Operationnotpermitted.
查资料确认AIX需要额外设置网络参数:
#nfso-p-onfs_use_reserved_ports=1
再次尝试挂载成功:
mount-ocio,rw,bg,hard,nointr,rsize=32768,wsize=32768,proto=tcp,noac,vers=3,timeo=60010.xx.xx.212:/xtts/xtts
可dd测试的速度非常不理想,只有10MB/s:
--testperformance;AIXNFS #timeddif=/dev/zeroof=/xtts/test-writebs=8192count=102400 102400+0recordsin. 102400+0recordsout. real0m43.20s user0m0.79s sys0m5.28s #timeddif=/xtts/test-writeof=/dev/nullbs=8192count=102400 102400+0recordsin. 102400+0recordsout. real0m30.86s user0m0.84s sys0m5.88s
所有参数都是根据实际需求,按照MOS的建议设置的。有什么问题吗?
- 尝试去掉cio参数测试,发现结果几乎没变化;
- 尝试去掉hard参数测试,发现结果几乎没变化;
- 尝试协议从tcp改为udp测试,发现结果几乎没变化;
几乎能试的参数都试了,结果都不理想,马上都准备协调资源找主机工程师定位了。
此时,灵感乍现,突然想到一个可能性。有没有可能AIX上的NFS限制了单个进程的I/O吞吐能力?带着这个猜测,进行并行测试:
开5个窗口同时开始dd:
timeddif=/dev/zeroof=/xtts/test-write1bs=8192count=102400 timeddif=/dev/zeroof=/xtts/test-write2bs=8192count=102400 timeddif=/dev/zeroof=/xtts/test-write3bs=8192count=102400 timeddif=/dev/zeroof=/xtts/test-write4bs=8192count=102400 timeddif=/dev/zeroof=/xtts/test-write5bs=8192count=102400
惊喜的发现5个窗口都在55s同时完成,这相当于800M*5=4000M,都在55s完成,每秒达到72MB/s,通过这种并行的方式已满足提升效率的需求。
而且看起来只要继续尝试多开窗口测试,基本也能达到网络上限100MB/s(千兆网卡限制)。
附:测试同样的NFS挂载到另一台Linux服务器上,无需并行,dd写入速度就可达100MB/s,这也是之前影响自己思考的因素。
LinuxNFS的挂载参数:
#mount-orw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=60010.xx.xx.212:/xtts/xtts
LinuxNFS的测试结果:
--testperformance;LinuxNFS #ddif=/dev/zeroof=/xtts/test-writebs=8192count=102400 102400+0recordsin 102400+0recordsout 838860800bytes(839MB)copied,6.02451s,139MB/s #ddif=/xtts/test-writeof=/dev/nullbs=8192count=102400 102400+0recordsin 102400+0recordsout 838860800bytes(839MB)copied,8.55925s,98.0MB/s
对AIX不熟悉,没有进一步深究底层原理。开始解决问题过程中的主要困惑在于,为何Linux作为client时,无需并行就可以dd测试达到100MB/s的速度,使自己陷入了固有思维中。从这件事情得到的思考是:有些时候,要跳出常规思维去思考方可有所突破。
最后把NFSServer端本地测试的结果也贴出来,感叹下闪存卡的I/O能力:
#ddif=/dev/zeroof=/dev/test-write2bs=8192count=1024000 1024000+0recordsin 1024000+0recordsout 8388608000bytes(8.4GB)copied,4.19912s,2.0GB/s
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。