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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM