选择高性能的I/O设备
随着计算机技术的发展,以硬盘为首的I/O设备对计算机的整体性能影响越来越大。无论是通信服务器,还是数据库服务器及数据仓库等,都需要有很好的磁盘I/O吞吐性能,NFS服务器也不例外。
硬盘数据传输速率分为内部传输率和外部传输率。通常外部传输率也被称为突发数据传输率或接口传输率,即指从硬盘的缓存向外输出数据的速度,而硬盘的内部传输率要小于外部传输率,所以内部传输率的高低是评价一个硬盘整体性能的决定性因素。
在高性能网络服务器和工作站领域得到广泛应用的SCSI技术已经成为网络服务器的标准接口选择,目前,其内部传输速率可达320Mbps。通常在一个50个用户的NFS网络系统中,使用10个基于RAID5级别的10000rpm的SCSI硬盘可以达到较好的效果。
网络带宽是NFS性能的另一个瓶颈。通常,应当使用单独的快速百兆以太网连接来发送NFS服务器和客户机之间的报文信息。
优化软件环境
软件方面的性能优化可以从以下几个方面考虑。
清理NFS服务器磁盘碎片
随着时间的推移,文件系统都会趋向于碎片化,这些碎片将降低NFS的性能。及时整理磁盘碎片,释放磁盘空间可以帮助系统更好地工作。
开启硬盘DMA
IDE硬盘基本都支持DMA(直接内存读取)功能,但是现有的Linux发行版本中,默认情况下都没打开该功能。可以在/etc/rc.d/rc.local文件中添加如下一行:
/sbin/hdparm -d1 -x66 -c3 -m16 /dev/had
这样以后每次开机,硬盘的DMA就会被开启。
尽量选择UDP协议
对系统而言,UDP是负担较轻的通信传输方式。在局域网中,网络质量相对稳定,应当尽量选择UDP。
优化配置
为了进一步优化NFS的性能,需要调整一些相关的参数,比如,读写块大小、MTU和服务线程数量等。
调整读写块大小
(1)挂载NFS共享目录
首先在客户机建立挂载目录/home/nfs/cao,然后用以下命令来挂载NFS服务器上的共享目录/home/cao:
# mkdir -p /home/nfs/cao
# mount -t nfs 192.168.1.4:/home/cao /home/nfs/cao
挂载完毕后,使用df命令进行查看,应该可以看到NFS服务器上的/home/cao已被挂载到/home/nfs/cao目录(见图10)。只要进入/home/nfs/cao目录,就等于进入了IP地址为192.168.1.4的NFS 服务器的/home/cao目录中。
(2)测试数据读写时间
进入/home/nfs/cao目录,使用如下命令测试NFS的写性能:
#time dd if=/dev/zero of=/home/nfs/cao/nfs.dat bs=16k count=16384
这个命令的意思是在NFS服务器的nfs.dat文件里写16384个16KB的块,即一个256MB的文件。
通常该测试文件的大小设定为NFS服务器内存的2倍。正常的输出结果可能如下:
读入了 16384+0 个块
输出了 16384+0 个块
real 4m28.934s
user 0m0.200s
sys 0m5.790s
使用如下命令测试NFS的读性能:
#time dd if=/home/nfs/cao/nfs.dat of=/dev/null bs=16k count=16384
执行以上命令,系统会记录客户机读这个256MB文件的时间。正常的输出结果可能如下:
读入了 66535+0 个块
输出了 66535+0 个块
real 4m54.812s
user 0m0.420s
sys 0m3.190s
删除nfs.dat文件,使用如下命令卸载NFS服务器的共享目录:
#umount -t nfs 192.168.1.4:/home/cao /home/nfs/cao
然后重复上面的(1)和(2)步骤,记录下测试得到的数据,以计算读写时间的平均值。
(3)修改读写块大小
NFS V2版本的文件传输尺寸最多只能设定为8KB,缺省情况是4KB(4098字节)。需要进行实际测试得到一个最佳值。
修改读写块大小前需要卸载NFS的共享目录。rsize和wsize分别代表读写块大小,可以通过修改/etc/fstab文件来设定这两个参数,在/etc/fstab文件中加入如下一行:
192.168.1.4: :/home/cao /home/nfs/cao nfs rsize=8192,wsize=8192,timeo=10,intr
重新挂载NFS的/home/cao目录,然后重复(1)和(2)步骤。比较读写块大小修改前后的读写性能,如果没有明显提高,可以再次修/etc/fstab文件,直到得到最佳值。rsize和wsize的值必须是1024的倍数,对于NFS V2版本来说,8192是它们的最大值。
设定合适的MTU
每个网络都存在约定的MTU(Maximum Transfer Unit,最大传输单元),并且要求所有进入网络的数据报必须适合该MTU。如果一个数据报进入了一个MTU小于该数据报长度的网络,那么处于网络边界上的路由器会把该数据报分解为多个小的数据包,这样会影响NFS的性能。tracepath命令可以用
来跟踪MTU的路径:
# tracepath 192.168.1.4/2049
1: [LOCALHOST] pmtu 1500
1: 192.168.1.4 (192.168.1.4) 2.824ms reached
Resume: pmtu 1500 hops 1 back 1
192.168.1.4是NFS服务器的IP地址,2049是UDP协议的端口号。随后tracepath命令会给出NFS网络中的MTU值。
然后,使用ifconfig命令查看客户机上用于连接NFS服务器网卡接口的MTU值,如果两者相差很多,可以使用ifconfig命令进行修改:
#ifconfig eth0 mtu 1500
对以太网接口来说, MTU的默认设置是1500个字节。
3.增加NFS服务器的线程
缺省情况下NFS服务器会启动8个nfsd守护线程,可以使用如下命令察看每个线程的使用情况:
#cat /proc/net/rpc/nfsd
rc 0 0 2
fh 0 0 0 0 0
io 0 0
th 8 0 22.000 11.000 45.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
ra 16 0 0 0 0 0 0 0 0 0 0 0
net 2 2 0 0
rpc 2 0 0 0 0
proc2 18 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
proc3 22 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
在第五行的“th”后的“8”表示有8个线程,再后面的数字代表每秒钟每个线程使用的最大百分比。
如果紧接着的三个数字比较大,则可能表示现在挂载的客户机数目比较多,需要增加线程数目。
修改启动文件/etc/rc.d/init.d/nfs可以增加线程数量。首先,停止NFS服务:
#/etc/rc.d/init.d/nfs stop
然后,修改/etc/rc.d/init.d/nfs 文件,将“[ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=8”一行中的8替换为适当的数字。
重新启动NFS服务:
#/etc/rc.d/init.d/nfs restart
此时察看NFS服务器运行的线程数量就会提高到设定的数目。
4.提高可用的Socket缓冲区
通常情况下,Linux使用的Socket输入队列使用64KB的缓冲区,如果运行8个nfsd守护进程的话,每个守护进程(Daemon)就只有8KB的缓冲区用于存储输入队列的数据。如果再增加线程,情况会更糟。这种情况可以适当增加缓冲区大小至256KB。
首先停止NFS服务,然后修改/etc/rc.d/init.d/nfs配置文件,在“daemon rpc.nfsd $RPCNFSDCOUNT”一行之前加入如下两行代码:
#echo 262144 > /proc/sys/net/core/rmem_default
#echo 262144 > /proc/sys/net/core/rmem_max
这两行代码的作用是,在nsfd守护进程启动前设定缓冲区大小至256KB。
在“daemon rpc.nfsd $RPCNFSDCOUNTS”一行之后加入如下两行代码:
# echo 65536 > /proc/sys/net/core/rmem_default
# echo 65536 > /proc/sys/net/core/rmem_max
这两行代码的作用是,在nsfd守护进程关闭后设定缓冲区大小至缺省值。重新启动NFS服务后生效。
5.其它参数
挂载NFS文件系统时可以选择是硬(Hard)挂载,还是软(Soft)挂载。采用硬挂载,NFS客户机会在后台不断地尝试与NFS服务器的连接(一般不会给出任何提示信息),直到挂载上为止;采用软挂载,会在前台尝试与NFS服务器的连接,当收到错误信息后终止挂载尝试,软挂载是默认的连接方式。
硬挂载的命令如下:
# mount -t nfs -o hard 192.168.1.4:/home/cao /home/nfs/cao
相应的软挂载只要把命令中的“hard”参数替换为“soft”即可。
到底是使用“hard”还是“soft”,主要取决于访问什么信息。假如是察看NFS服务器的视频文件,用户绝对不会希望由于一些意外的情况(比如网速一下变慢)使系统输出大量的错误信息,如果此时用“hard”方式的话,系统就会等待,直到能够重新与NFS 服务器建立连接为止。对于非关键数据,可以使用“soft”方式,比如,使用FTP传输一些数据,这样在远程机器暂时连接不上或关闭时,就不会挂起会话过程,造成客户机的不响应。
http://zfpillar.devebar.net/2008/10/767.html