十、nfs的傳輸速度優化
如果按
$ mount -o nolock 192.168.1.220(假設為宿主機ip):/mnt/nfs /mnt/nfs_t
來mount ,傳輸速度可能很慢,
只有幾K到幾十K左右,
所以想要獲得較快的速度就要對nfs進行優化。
1.設置塊大小
mount命令的
risize和wsize指定了server端和client端的傳輸的塊大小。
如果沒有指定,
那么,系統根據nfs的版本來設置缺省的risize和wsize大小。大多數情況是4K(4096bytes),
對於nfs v2,最大是8K,
對於nfs v3,在server端設置risize和wsize的限制,
最大塊大小在kernel的常量 NFSSVC_MAXBLKSIZE,
該常量在usr/src/linux2.4/include/linux/nfsd/const.h.
所有的2.4 的client都支持最大32K的傳輸塊。
系統缺省的塊可能會太大或者太小,這主要取決於你的kernel和你的網卡,
太大或者太小都有可能導致nfs 速度很慢。
具體的可以使用Bonnie,Bonnie ,iozone等benchmark來測試不同risize和wsize下nfs的速度。
當然,也可以使用dd來測試。
這是來測試nfs寫:
$ time dd if=/dev/zero of=/testfs/testfile.dat bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.009669 seconds, 868 MB/s
real 0m0.013s
user 0m0.000s
sys 0m0.013s
這是測試nfs讀:
$ time dd if=/testfs/testfile.dat of=/dev/null bs=8k
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.002015 seconds, 4.2 GB/s
real 0m0.003s
user 0m0.000s
sys 0m0.002s
測試時文件 /testfs/testfile 的大小至少是系統RAM的兩倍,
每次測試都使用umount 和mount對/testfs進行掛載,
通過比較不同的塊大小,得到優化的塊大小。
2.網絡傳輸包的大小
網絡在包傳輸過程,對包要進行分組,過大或者過小都不能很好的利用網絡的帶寬,
所以對網絡要進行測試和調優。
可以使用:
$ ping -s 2048 -f hostname
進行 ping,嘗試不同的package size,這樣可以看到包的丟失情況。
同時,可以使用
$ nfsstat -o net
測試nfs使用udp傳輸時丟包的多少。
因為統計不能清零,所以要先運行此命令記住該值,然后可以再次運行統計。
如果,經過上面的統計丟包很多。那么可以看看網絡傳輸包的大小。使用下面的命令:
$ tracepath node1/端口號
$ ifconfig eth0
比較網卡的mtu和剛剛的pmtu,使用#ifconfig eth0 mtu 16436設置網卡的mtu和測試的一致。
當然如果risize和wsize比mtu的值大,那么的話,server端的包傳到client端就要進行重組,
這是要消耗client端的cpu資源。
此外,包重組可能導致網絡的不可信和丟包,任何的丟包都會是的rpc請求重新傳輸,
rpc請求的重傳有會導致超時,嚴重降低nfs的性能。
可以通過查看:
/proc/sys/net/ipv4/ipfrag_high_thresh和/proc/sys/net/ipv4 /ipfrag_low_thresh
了解系統可以處理的包的數目,
如果網絡包到達了ipfrag_high_thresh,那么系統就會開始丟包,直到包的數目到達ipfrag_low_thresh。
3.nfs掛載的優化
timeo:如果超時,客戶端等待的時間,以十分之一秒計算。
retrans:超時嘗試的次數。
bg:后台掛載,很有用
hard:如果server端沒有響應,那么客戶端一直嘗試掛載。
wsize:寫塊大小
rsize:讀塊大小
intr:可以中斷不成功的掛載
noatime:不更新文件的inode訪問時間,可以提高速度。
async:異步讀寫。
4.nfsd的個數
缺省的系統在啟動時,有8個nfsd進程。
$ps -efl|grep nfsd
通過查看/proc/net/rpc/nfsd文件的th行,
第一個是nfsd的個數,
后十個是線程是用的時間數,第二個到第四個值如果很大,那么就需要增加nfsd的個數。
具體如下:
#vi /etc/init.d/nfs
找到RPCNFSDCOUNT,修改該值,一般和client端數目一致。
然后,重啟服務。
$ service nfs restart
$ mount -a
5.nfsd的隊列長度
對於8個nfsd進程,系統的nfsd隊列長度是64k大小,如果是多於8個,就要相應的增加相應的隊列大小,
具體的在
/proc/sys/net /core/【rw】mem_default 和
/proc/sys/net/core/【rw】mem_max。
隊列的長度最好是每一個nfsd有8k的大小。這樣,server端就可以對client的請求作排隊處理。
如果要永久更改此值
$vi /etc/sysctl.conf
加入
net.core.【rw】mem_max=數目
net.core.【rw】mem_default=數目
#service nfs restart
6. 兩組不同參數的實測結果
參數一:
mount -t nfs 192.168.1.220:/mnt/nfs /mnt/nfs_t -o nolock, rsize=1024,wsize=1024,timeo=15
就能獲得較快的傳輸速度。。。
讀速度測試:
$ time dd if=/opt/mnt_nfs_shared/nfs_test.flv of=/dev/null bs=8k
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.00206 seconds, 4.1 GB/s
real 0m0.003s
user 0m0.000s
sys 0m0.003s
寫速度測試:
$ time dd if=/dev/zero of=/opt/nfs_test.flv bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.010595 seconds, 792 MB/s
real 0m0.014s
user 0m0.001s
sys 0m0.013s
參數二:
server:/opt/nfs_shared /opt/mnt_nfs_shared nfs rsize=8192,wsize=8192,timeo=14,intr
讀速度測試:
$ time dd if=/opt/mnt_nfs_shared/nfs_test.flv of=/dev/null bs=8k
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.002931 seconds, 2.9 GB/s
real 0m0.004s
user 0m0.000s
sys 0m0.004s
寫速度測試:
$ time dd if=/dev/zero of=/opt/nfs_test.flv bs=8k count=1024
1024+0 records in
1024+0 records out
8388608 bytes (8.4 MB) copied, 0.010859 seconds, 773 MB/s
real 0m0.014s
user 0m0.000s
sys 0m0.014s
NOTE:
我這里提供的參數只是在我的機器上測到的;
實際上真正使用時要具體測試才知道;
有時候什么參數都不設置,反而比設置了參數方案和讀/寫速度更好;