一、硬件設備的選擇
隨著計算機技術的發展,以硬盤為首的I/O設備對計算機的整體性能影響越來越大,通訊服務器(messaging/E-mail/VOD):快速的I/O是這類應用的關鍵,硬盤的I/O吞吐能力是主要瓶頸;數據倉庫:大型商業數據存儲、編目、索引、數據分析,高速商業計算等,需要具有良好的網絡和硬盤I/O吞吐能力;數據庫(ERP/OLTP等)服務器,除了需要具有強大的CPU處理能力,同時需要有很好的磁盤I/O吞吐性能;
NFS網絡文件系統性能的主要瓶頸是硬盤的I/O性能和網絡帶寬。SCSI(Small Computer System Interface,小型計算機系統接口)技術在需要高性能的網絡服務器和工作站領域卻得到了廣泛應用,現在已經成為網絡服務器的標准的接口選擇。速度從SCSI-I最初的5MBps到2005年的320MBps。內部傳輸率的高低是評價一個硬盤整體性能的決定性因素,硬盤數據傳輸率分為內外部傳輸率。通常稱外部傳輸率也為突發數據傳輸率或接口傳輸率,指從硬盤的緩存中向外輸出數據的速度。由於硬盤的內部傳輸率要小於外部傳輸率,所以只有內部傳輸率才可以作為衡量硬盤性能的真正標准。SCSI硬盤技術在內部傳輸率要性能上有更大優勢。通常在一個50個用戶的NFS網絡系統中使用10個基於RAID5級別10000rpm的SCSI硬盤可以達到較好的效果。
在服務器磁盤I/O性能之後,網絡帶寬是網絡文件系統下一個瓶頸。通常應當使用單獨的1000兆快速以太網連接NFS服務器和客戶機發送報文信息。同時確保NFS服務器和客戶機工作正常,交換機、路由器等網絡設備工作正常。圖-1是一個理想的NFS網絡拓撲結構。
圖-1 一個理想的NFS網絡拓撲結構
二、軟件環境優化
如果我們沒有很高硬件環境,可以考慮從軟件方面優化性能。
1、清理NFS服務器磁盤碎片:
不論Linux文件系統采用什麼文件格式(ext3、JFS、XFS、ReiserFS )、何種類型的硬盤(IDE 、SCSI),隨著時間的推移文件系統都會趨向於碎片化。ext3、JFS等高級文件系統可以減少文件系統的碎片化,但是並沒有消除。在繁忙的數據庫服務器中,隨著時間的過去,文件碎片化將降低硬盤性能,硬盤性能從硬盤讀出或寫入數據時才能注意到。時間長了會發現每個磁盤上確實積累了非常多的垃圾文件,釋放磁盤空間可以幫助系統更好地工作。Linux最好的整理磁盤碎片的方法是做一個完全的備份,重新格式化分區,然後從備份恢復文件。但是對於7×24小時工作關鍵任務服務器來說是比較困難的。Kleandisk是一個高效的磁盤清理工具,它能把磁盤上的文件分成不同的"組",比如把所有的"core"文件歸成一組(Group),這樣要刪除所有core文件時只要刪除這個組就行了。core文件是當軟件運行出錯時產生的文件,它對於軟件開發人員比較有用,對於其他用戶(比如電子郵件服務器)卻沒有任何意義。因此,如果沒有軟件開發的需要,見到core文件就可以將其刪除。
2、開啟硬盤DMA
現在使用的IDE硬盤基本支持DMA66/100/133(直接內存讀取)但是Linux發行版本安裝後一般沒有打開,可以/etc/rc.d/rc.local 最後面加上一行: /sbin/hdparm -d1 –x66 -c3 -m16 /dev/hda 這樣以後每次開機,硬盤的 DMA 就會開啟,不必每次手動設定。添加前後你可以使用命令:hdparm -Tt /dev/hda 來測試對比一下。 3、調整緩沖區刷新參數
Linux內核中,包含了一些對於系統運行態的可設置參數。緩沖刷新的參數可以通過調整 /proc/sys/vm/bdflush文件來完成,這個文件的格式是這樣的:
# cat /proc/sys/vm/bdflush
30 64 64 256 500 3000 60 0 0
每一欄是一個參數,其中最重要的是前面幾個參數。第一個數字是在"dirty"緩沖區達到多少的時候強制喚醒bdflush進程刷新硬盤,第二個數字是每次讓bdflush進程刷新多少個dirty塊。所謂dirty塊是必須寫到磁盤中的緩存塊。接下來的參數是每次允許bd flush將多少個內存塊排入空閒的緩沖塊列表。 以上值為RHEL 4.0中的缺省值。可以使用兩種方法修改:
(1)使用命令
# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush
並將這條命令加到/etc/rc.d/rc.local文件中去。
(2)在/etc/sysctl.conf 文件中加入如下行:
vm.bdflush = 100 128 128 512 5000 3000 60 0 0
以上的設置加大了緩沖區大小,降低了bdflush被啟動的頻度,VFS的緩沖刷新機制是Linux文件系統高效的原因之一。
4、NFS版本的選擇
NFS協議從誕生到現在為止,已經有多個版本,如NFS V2(rfc1094),NFS V3(rfc1813)(最新的版本是V4(rfc3010)。最早,Sun公司曾將NFS v2設計成為只使用UDP協議,主要原因是當時機器的內存、網絡速度和CPU的影響,不得不選擇對機器負擔較輕的方式。而到了NFS v3,Sun公司選擇了TCP協議作為缺省的傳輸方式。
V3相對V2的主要區別: 1、文件尺寸
V2版本最大只支持32BIT的文件大小(4G),而NFS V3版本新增加了支持64BIT文件大小的技術。 2、文件傳輸尺寸 V3版本沒有限定傳輸尺寸,V2版本最多只能設定為8k,可以使用-rsize and -wsize 選項來進行設定。 3、完整的信息返回 V3版本增加和完善了許多錯誤和成功信息的返回,對於服務器的設置和管理能帶來很大好處。 4、增加了對TCP傳輸協議的支持
V2版本只提供了對UDP協議的支持,在一些高要求的網絡環境中有很大限制,V3增加了對TCP協議的支持。UDP有著傳輸速度快,非連接傳輸的便捷特性,但是UDP在傳輸上沒有TCP來的穩定,當網絡不穩定或者黑客入侵的時候很容易使NFS的 Performance 大幅降低甚至使網絡癱瘓。所以對於不同情況的網絡要有針對的選擇傳輸協議。
5、異步寫入特性。 6、改進了服務器的mount性能。 在Linux上,UDP協議是缺省使用的協議。作為服務器而言,別無選擇。但作為客戶端,可以使用TCP協議和其它使用TCP的NFS服務器互連。在局域網中使用UDP協議較好,因為局域網有比較穩定的網絡保證,使用UDP可以帶來更好的性能,RHEL 4.0默認使用V2版本。但是 Linux也可以通過mount option的nfsvers=n進行選擇。
5、優化輸入輸出
I/O程序對Linux系統性能也是相當重要的,網絡硬件I/O對服務器尤其重要。現在大多數Linux服務器使用10/100 Mb以太網。如果有較重的網絡負載,則可以考慮千兆以太網卡。如果沒有能力購買千兆網卡的話:可以使用多塊網卡虛擬成為一塊網卡,具有相同的IP地址。這項技術,在Linux中,這種技術稱為Bonding。Bonding在Linux2.4以上內核中已經包含了,只需要在編譯的時候把網絡設備選項中的Bonding driver support選中見圖2。當然利用Bonding技術配置雙網卡綁定的前提條件是兩塊網卡芯片組型號相同,並且都具備獨立的BIOS芯片。
圖2 Linux內核的Bonding driver support選項
然後,重新編譯核心,重新起動計算機,執行如下命令:
#ifconfig eth0 down
#ifconfig bond0 ipaddress#ifenslave bond0 eth0#ifenslave bond0 eth1
現在兩塊網卡已經象一塊一樣工作了。這樣可以提高集群節點間的數據傳輸.bonding對於服務器來是個比較好的選擇,在沒有千兆網卡時,用兩塊100兆網卡作bonding,可大大提高服務器到交換機之間的帶寬.但是需要在交換機上設置連接bonding網卡的兩個子口映射為同一個虛擬接口。編輯/etc/modules.conf文件,加入如下內容,以使系統在啟動時加載Bonding模塊。
alias bond0 bonding
options bond0 mode=0
“mode”的值表示工作模式,共有0、1、2和3四種模式,這裡設定為0。Bonding工作在負載均衡(Load Balancing (round-robin))方式下,即兩塊網卡同時工作,這時理論上Bonding能提供兩倍的帶寬。Bonding運行在網卡的混雜(Promisc)模式下,而且它將兩塊網卡的MAC地址修改為一樣的。混雜模式就是網卡不再只接收目的硬件地址是自身MAC地址的數據幀,而是可以接收網絡上所有的幀。 6、關閉NFS服務器不用的服務
Linux在啟動時需要啟動很多系統服務,它們向本地和網絡用戶提供了Linux的系統功能接口,直接面向應用程序和用戶。但是,開啟不必要服務則會給操作系統帶來安全和性能上的影響。以root身份運行:
#ntsysv
把不需要的服務和進程前面的*去掉(用空格鍵),然後重新啟動系統服務,這樣就可以使不需要的服務和進程不再啟動。不但安全,而且還能提高系統的性能,一舉兩得。
7、設定客戶機合適的最大傳輸單元MTU
每個網絡都存在最大傳輸單元MTU(maximum transfer unit),要求每個數據報必須適合MTU。如果一個數據報進入了一個MTU小於該數據報長度的網絡,那麼處於網絡邊界上的路由器會把該數據報分解為多個小的數據報。這樣會影響NFS網絡系統的性能。tracepath它是一個工具:它用來跟蹤MTU的路徑:首先使用超級用戶權限登陸客戶機,使用命令::
Resume: pmtu 1500 hops 1 back 1
其中192.168.1.4是NFS服務器IP地址,2049是NFS服務器開啟的UDP協議的端口號。
可以使用命令查看:rpcinfo -p 192.168.1.4。最後tracepath命令會給出一個MTU值。
然後使用ifconfig命令查看客戶機上用於連接NFS服務器的網卡接口的MTU值。如果兩者相差很多,可以使用Ifconfig命令修改。
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個線程。其他數字代表每秒鐘線程使用的最大百分比。如果後邊三個數字比較大表示可能現在掛載客戶機數目比較多,需要增加線程數目。
(1)首先停止nfs服務
# echo 65536 > /proc/sys/net/core/rmem_default #ntsysv圖3自動掛載NFS文件系統
打開如圖3所示的窗口,在autofs和apmd服務選項加上*(用空格鍵),然後重新啟動系統,這樣可以自動掛載NFS文件系統。
13. 使用stand-alone模式運行NFS
NFS服務器可以以stand-alone、xinetd兩種模式運行。stand-alone方式是Unix傳統的C/S模式的訪問模式。服務器監聽(Listen)在一個特點的端口上等待客戶端的聯機。如果客戶端產生一個連接請求,守護進程就創建(Fork)一個子服務器響應這個連接,而主服務器繼續監聽。以保持多個子服務器池等待下一個客戶端請求。stand-alone模式工作原理見圖4。
圖4 stand-alone工作模式
工作在stand-alone模式下的網絡服務有route、gated。另外是大家最熟悉是Web服務器:Apache和郵件服務器Sendmail、NFS。因為在NFS這種負載很大服務器上,預先創子服務器,可以通過客戶的服務速度。在Linux系統中通過stand-alone工作模式啟動的服務由/etc/rc.d/下面對應的運行級別當中的符號鏈接啟動。和stand-alone工作模式相比,xinetd模式不想要每一個網絡服務進程都監聽其服務端口。運行單個xinetd就可以同時監聽所有服務端口,這樣就降低了系統開銷,保護系統資源。但是對於訪問量大、經常出現並發訪問時,xinetd想要頻繁啟動對應的網絡服務進程,反而會導致系統性能下降。察看系統為Linux服務提供那種模式方法在Linux命令行可以使用pstree命令可以看到兩種不同方式啟動的網絡服務。一般來說系統一些負載高的服務:NFS、sendmail、Apache服務是單獨啟動的。 14、 NFS服務器設置的調優步驟:
(1)首先掛接NFS服務器和每個客戶端。(2) 然後測量當前網絡、服務器和每個客戶端的執行效率。(3)優化讀寫塊大小。(4) 調整服務器 。 重復第一到第三步直到達到你渴望的性能。
1、掛載/home/cao目錄 首先建立這個目錄,然後再利用mount指令來掛載NFS 服務器的/home/cao目錄:
# mount -t nfs 192.168.1.4:/home/cao /home/nfs/cao
下面使用df命令查看掛載的目錄中已經包括:NFS 服務器的IP地址的共享目錄,見圖5。
圖5 掛載NFS服務器的共享目錄
將資料掛載進來後,只要進入/home/nfs/cao目錄,就等於到了IP地址:192.168.1.4那部NFS 服務器的/home/cao目錄中。
2、測試讀寫數據時間
NFS V2版本的文件傳輸尺寸設定(-rsize, -wsize)V2最多只能設定為8k,缺省情況是4k(4098字節),實際情況可能和缺省值有差別。這時需要進行實際測試得到一個最佳值。方法是:
(1)測試NFS網絡文件系統的寫性能
首先以超級用戶身份掛載NFS服務器的/home/cao目錄。然後進入本地目錄使用命令:
time dd if=/dev/zero of=/home/nfs/cao/nfs.dat bs=16k count=16384
這個命令意思使用命令 dd 向/dev/zero不斷輸入一個文件,是在NFS服務器的nfs.dat文件裡寫16384個16KB的塊,bs是值是16K也就是一個256MB的文件,通常文件大小(256MB)設定為NFS服務器內存的2倍。同時回寫到客戶機中同樣大小、數量的塊。正常的輸出結果可能是:
輸出了 16384+0 個塊
user 0m0.200s
輸出了 66535+0 個塊
user 0m0.420s
<p '>192.168.1.4: :/home/cao /home/nfs/cao nfs rsize=8192,wsize=8192,timeo=10,intr重新使用命令掛載NFS服務器的/home/cao的目錄,然後重復上面的(1)、(2)、(3)步驟。比較修改讀寫塊大小後,讀寫性能是否有所提高。如果沒有提高的話可以直接刪除/etc/fstab文件。接著尋找最佳值。用於測試的rsize和wsize必須是1024的倍數,對於NFS V2版本來說8192是RSIZE和WSIZE的最大數值。
總結:本文介紹了如何在現有條件下提高NFS文件服務器性能,網絡管理員充分了解自己的計算機和網絡,從而找到真正的瓶頸所在。在預算短缺的今天,理解如何優化系統性能比以往任何時候都重要。一味地硬件投資並不是能夠讓人們接受的辦法,並且也不一定生效。