• NFS 优化


    1. NFS I/O性能测试工具

    1.1 dd

    dd 只能测试连续读写性能

    dd 测试写性能的命令(连续写16384个16KB的块到nfs目录下的testfile文件)

    # time dd if=/dev/zero of=/nfsfolder/testfile bs=16k count=16384

    dd 测试读性能的命令

    # time dd if=/nfsfolder/testfile of=/dev/null bs=16k

    1.2 nfsstat

     

    在NFS客户端运行

    nfsstat -4 --all     (对于NFSv4)

    Client packet stats:
    packets    udp        tcp        tcpconn
    0          0          0          0      

    Client rpc stats:
    calls      retrans    authrefrsh
    24932703   9          0      

    Client nfs v4:
    null         read         write        commit       open         open_conf   
    0         0% 19359418 77% 513478    2% 513295    2% 1880475   7% 9         0%
    open_noat    open_dgrd    close        setattr      fsinfo       renew       
    0         0% 0         0% 1209733   4% 0         0% 4         0% 0         0%
    setclntid    confirm      lock         lockt        locku        access      
    7         0% 7         0% 0         0% 0         0% 0         0% 305360    1%
    getattr      lookup       lookup_root  remove       rename       link        
    881574    3% 267948    1% 2         0% 0         0% 0         0% 0         0%
    symlink      create       pathconf     statfs       readlink     readdir     
    0         0% 0         0% 2         0% 2659      0% 0         0% 404       0%
    server_caps  delegreturn  getacl       setacl       fs_locations exchange_id 
    6         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    create_ses   destroy_ses  sequence     get_lease_t  layoutget    layoutcommit
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    layoutreturn getdevlist   getdevinfo   ds_write     ds_commit   
    0         0% 0         0% 0         0% 0         0% 0         0%

    在NFS服务器端运行

    # nfsstat --all
    Server packet stats:
    packets    udp        tcp        tcpconn
    171175445   0          171147948   13     

    Server rpc stats:
    calls      badcalls   badauth    badclnt    xdrcall
    170930602   0          0          0          0      

    Server reply cache:
    hits       misses     nocache
    0          0          170718860

    Server file handle cache:
    lookup     anon       ncachedir  ncachedir  stale
    0          0          0          0          0      

    Server nfs v4:
    null         compound    
    4         0% 170935498 99%

    Server nfs v4 operations:
    op0-unused   op1-unused   op2-future   access       close        commit      
    0         0% 0         0% 0         0% 730000    0% 13960911  2% 51863971  9%
    create       delegpurge   delegreturn  getattr      getfh        link        
    2         0% 0         0% 0         0% 152090452 28% 14469063  2% 0         0%
    lock         lockt        locku        lookup       lookup_root  nverify     
    0         0% 0         0% 0         0% 509243    0% 0         0% 0         0%
    open         openattr     open_conf    open_dgrd    putfh        putpubfh    
    14887499  2% 0         0% 340567    0% 0         0% 170109922 31% 0         0%
    putrootfh    read         readdir      readlink     remove       rename      
    24        0% 30077993  5% 676       0% 0         0% 0         0% 0         0%
    renew        restorefh    savefh       secinfo      setattr      setcltid    
    4         0% 13960755  2% 14885721  2% 0         0% 1         0% 20        0%
    setcltidconf verify       write        rellockowner bc_ctl       bind_conn   
    20        0% 0         0% 56911268 10% 0         0% 0         0% 0         0%
    exchange_id  create_ses   destroy_ses  free_stateid getdirdeleg  getdevinfo  
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    getdevlist   layoutcommit layoutget    layoutreturn secinfononam sequence    
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    set_ssv      test_stateid want_deleg   destroy_clid reclaim_comp
    0         0% 0         0% 0         0% 0         0% 0         0%

    1.3 查看 nfs 的mount参数

    cat /proc/mounts
    fe80::63%vlan6:/ /nfsfolder nfs4 rw,relatime,vers=4,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=fe80::82c1:6eff:fe76:6921,minorversion=0,local_lock=none,addr=fe80:0:0:0:0:0:0:63 0 0

    2. NFS 调优

    mount -v -t nfs4 -o rsize=1048576,wsize=1048576 [fe80::63%vlan6]:/ /nfsfolder/ 

    • nfsv4 或nfsv3 比nfsv2具有更好的性能
    • 如果系统支持,尽量使用更大的rsize和wsize。根据测试wsize为1MB时的连续写性能可以比wsize为1kB时提高2倍
    • 提高nfsd的线程数(SUSE linux /etc/sysconfig/nfs文件中的USE_KERNEL_NFSD_NUMBER,一个CPU内核至少设置一个线程,根据经验一个CPU内核设置4~8个线程更好)
    • 提高输入队列的内存限制,注意多个nfsd线程共享这些内存。NSF Client有很高的读负载,NFS Server有很高的写负载时,提高内存限制有重要的作用。

          # echo 262144 > /proc/sys/net/core/rmem_default
          # echo 262144 > /proc/sys/net/core/rmem_max

        

          # echo 262144 > /proc/sys/net/core/wmem_default
          # echo 262144 > /proc/sys/net/core/wmem_max

    NFS中的rsize、wsize

    rsize、wsize对于NFS的效能有很大的影响.wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参数 的合理设定与很多方面有关,不仅是软件方面也有硬件方面的因素会影响这两个参数的设定(例如LINUX KERNEL、网卡,交换机等等).
    下面这个命令可以简单测试NFS的执行效能,读和写的效能可以分别测试,分别找到合适的参数.对于要测试分散的大量的数据的读写可以通过编写脚本来进行测试.在每次测试的时候最好能重复的执行一次MOUNT和unmount.
    time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384
    用于测试的wsize,rsize最好是1024的倍数,大多的时候,默认是4K(4096),对于NFS V2来说8192是rsize和wsize的最大数值,如果使用的是NFS V3则可以尝试的最大数值是32768.
    我测试过,在内网比较合理的每个客户机应该用 rsize=32768,wsize=32768,intr,noatime 挂装远程文件系统,从而确保速度:

        * 使用大的读/写块(数字指定最大块大小,在这个示例中是 32KB).
        * 在挂起时 NFS 操作可以被中断.
        * 不持续更新 atime.

    可以将这些设置放在 /etc/fstab 中.

    注意,在测试rsize和wsize比mtu值大时,server的包发送到client要进行重组,会要浪费二者的cpu.另外重组也会导致 nfs不稳定,因为丢包会让rpc重传,重传象tcp一样,会导致超时,可以通过查看/proc/sys/net/ipv4 /ipfrag_high_thresh和/proc/sys/net/ipv4/ipfrag_low_thresh了解系统处理包的数量,如果包到了 ipfrag_high_thresh就会开始丢包.真到数目达到ipfrag_low_thresh.

    NFS客户端的数目
    在服务器端,一定要确保有足够的 NFS 内核线程来处理所有客户机.在默认情况Red Hat系统会启动8个线程.对于繁忙的 NFS 服务器,应该提高这个数字,比如32或64.可以用 nfsstat -rc 命令评估客户机,了解是否有阻塞的现象,这个命令显示客户机远程过程调用(RPC)统计数据.
    例:
    # nfsstat -rc
    Client rpc stats:
    calls      retrans    authrefrsh
    95374234   3432       0

    第二列retrans是3432,这表示从上一次系统启动以来出现了3432次重新传输的情况.这个数字比较大,就应该考虑增加NFS线程.
    设置方法是将所需的线程数量设置到nfs,比如设置128 会启动 128 个线程.任何时候都可以进行这种设置.线程会根据需要启动或销毁.同样,这个设置应该放在启动脚本中,尤其是在系统上启用 NFS 的脚本.

    如RedHat和Centos
    vim /etc/init.d/nfs

    找到下面这行修改
    [ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=32 

    如上,我修改的是启动32个.随着nfsd数目的增加,平均负载会上升(可用uptime查看),就应减少nfsd数目.平时测试和客户端的数量一样多就行.

    NFS的版本
    关于 NFS,需要注意一点:避免使用 NFSv2,因为 NFSv2 的性能比 v3 和 v4 差得多.当前的Linux 发行版中这应该不是问题,我们可以在nfs的服务器上检查nfsstat 的输出,了解是否有任何 NFSv2 调用.

    Client nfs v3:
    null         getattr      setattr      lookup       access       readlink    
    0         0% 13536     0% 1         0% 14150     0% 26160     0% 0         0%
    read         write        create       mkdir        symlink      mknod       
    95313570 99% 70        0% 1         0% 0         0% 0         0% 0         0%
    remove       rmdir        rename       link         readdir      readdirplus 
    0         0% 0         0% 0         0% 0         0% 56        0% 6650      0%
    fsstat       fsinfo       pathconf     commit      
    15        0% 8         0% 0         0% 15        0%

    Client nfs v4:
    null         read         write        commit       open         open_conf   
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    open_noat    open_dgrd    close        setattr      fsinfo       renew       
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    setclntid    confirm      lock         lockt        locku        access      
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    getattr      lookup       lookup_root  remove       rename       link        
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    symlink      create       pathconf     statfs       readlink     readdir     
    0         0% 0         0% 0         0% 0         0% 0         0% 0         0%
    server_caps  delegreturn 
    0         0% 0         0%

    如上,都是v3和v4的.

    启动了NFS之后又修改了/etc/exports,是不用重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
    exportfs [-aruv]
    -a :全部mount或者unmount /etc/exports中的内容
    -r :重新mount /etc/exports中分享出来的目录
    -u :umount 目录
    -v :将详细的信息输出到屏幕上.

    mountd 与 nfsd 共享一个访问控制数据库,除了内核内部的表之外,这个数据库的运行副本通常还保存在一个称为 /var/lib/nfs/xtab 的文件中.
    因为xtab并不是供人阅读的,所以要使用另外的命令来添加和修改其中的项,就是用exportfs

    # nfsstat -s //显示NFS服务器进程的统计信息
    # nfsstat -c //显示与客户端操作相关的信息

    NFS传送的方式UDP and TCP
    可以手动进行设置,也可以自动进行选择.
    mount -t nfs -o sync,tcp,noatime,rsize=1024,wsize=1024,tcp EXPORT_MACHINE:/EXPORTED_DIR /DIR
    UDP 有着传输速度快,非连接传输的便捷特性,但是UDP在传输上没有TCP来的稳定,当网络不稳定或者黑客入侵的时候很容易使NFS的 Performance 大幅降低甚至使网络瘫痪.所以对于不同情况的网络要有针对的选择传输协议.nfs over tcp比较稳定,nfs over udp速度较快.在机器较少网络状况较好的情况下使用UDP协议能带来较好的性能,当机器较多,网络情况复杂时推荐使用TCP协议(V2只支持UDP协 议).在局域网中使用UDP协议较好,因为局域网有比较稳定的网络保证,使用UDP可以带来更好的性能,在广域网中推荐使用TCP协议,TCP协议能让 NFS在复杂的网络环境中保持最好的传输稳定性.可以参考这篇文章:http: //www.hp.com.tw/ssn/unix/0212/unix021204.asp.
    根据原理,有时TCP在内网不会丢失包的情况下,也可能会性能好很多,所以,最好也测试一下.
    补充:
    UDP套接口溢出:在带有许多UDP客户机的一台NFS服务器上,当所有nfsd线程都在使用,而此时又有请求到达的时候,就会发生UDP套接口溢出.可 使用netstat -s命令监测溢出数目,增加更多的nfsd直到UDP套接口溢出数目降为0.溢出表明服务器提供的守护进程数量不足,所以增加的nfsd要比通过这种方法 测量出来的数目多几个.

    NFS的队列大小
    在linux 2.2和2.4内核里,默认的8个nfsd的输入队列大小是64K,2.6内核是108K.下面将设置为较合理的值256K
    # echo 262144 > /proc/sys/net/core/rmem_default
    # echo 262144 > /proc/sys/net/core/rmem_max
    # echo 262144 > /proc/sys/net/core/wmmen_default
    # echo 262144 > /proc/sys/net/core/wmmen_max

    网络传输包的大小

    在不同的网络当中,因为tcp/ip需要给文件分成一个个的数据包,过大和过小都会影响很大,所以需要对网络包大小进行不同的package测试. 常用的方法ping -s 2048 -f hostname进行ping.来测试不同的网络传送包的大小.这样可以了解不同的包大小的包丢失情况.同时,还可以使用nfsstat -o net 测试nfs使用udp传送时的丢包率.

    nfsstat命令显示关于NFS和到内核的远程过程调用(RPC)接口的统计信息,也可以使用该命令重新初始化该信息。如果未给定标志,默认是nfsstat -csnr命令。使用该命令显示每条信息,但不能重新初始化任何信息。

    nfsstat命令的主要参数如下。

    (1)-b:显示NFS V4服务器的其他统计信息。

    (2)c:只显示客户机端的NFS和RPC信息,允许用户仅查看客户机数据的报告。nfsstat命令提供关于被客户机发送和拒绝的RPC和NFS调用数目的信息。

    要只显示客户机NFS或者RPC信息,将该参数与-n或者-r参数结合。

    (3)-d:显示与NFS V4授权相关的信息。

    (4)-g:显示RPCSEC_GSS信息。

    (5)-m:显示每个NFS文件系统的统计信息,该文件系统和服务器名称、地址、安装标志、当前读和写大小,以及重新传输计数

    (6)-n:为客户机和服务器显示NFS信息。要只显示NFS客户机或服务器信息,将该参数与-c和-s参数结合。

    (7)-r:显示RPC信息。

    (8)-s:显示服务器信息。

    (9)-t:显示与NFS标识映射子系统的转换请求相关的统计信息,要只显示NFS客户机或服务器信息,将-c和-s<br />选项结合。

    (10)-4:当与-c、-n、-s或-z参数组合使用时,将包含NFS V4客户机或服务器的信息,以及现有的NFS V2和V3数据<br />。

    (11)-z:重新初始化统计信息。该参数仅供root用户使用,并且在显示上面的标志后可以和那些标志中的任何一个组合到<br />统计信息的零特殊集合。

    要显示关于客户机发送和拒绝的RPC和NFS调用数目的信息,输入:

    nfsstat -c

    要显示和打印与客户机NFS调用相关的信息,输入如下命令:

    nfsstat -cn
    

    要显示和打印客户机和服务器的与RPC调用相关的信息,输入如下命令:

    nfsstat -r

    要显示关于服务器接收和拒绝的RPC和NFS调用数目的信息,输入如下命令:

    nfsstat –s
  • 相关阅读:
    DevExpress第三方控件之ASPxGridView
    单一职责原则(SRP)
    .NET 4 并行(多核)编程系列之一入门介绍
    .NET 分布式架构开发实战之二
    .NET 分布式架构开发实战之四
    .NET 分布式架构开发实战之三
    .NET 分布式架构开发实战之一
    .NET 4 并行(多核)编程系列之三
    .NET 4 并行(多核)编程系列之四
    .NET 分布式架构开发实战五
  • 原文地址:https://www.cnblogs.com/derekchen/p/2865207.html
Copyright © 2020-2023  润新知