为NFS加油提速

网络文件系统( Network File System,简称NFS)是Linux上最常见的网络服务之一。NFS服务器可以让计算机通过网络将远端的共享文件挂载到本机的系统中,就像是在使用本地文件一样。如何优化NFS的性能成为被广泛关注的问题,下面介绍一些常用方法。


选择高性能的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值