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 |