深度掌握NFS服務器
對于NFS服務器,可能你已經有所掌握。但是你真的完全學會了么?很多細節上的知識也許已經被忽略了。沒關系,本文就將為大家做一下具體的總結。希望對大家有所幫助。NFS是網絡文件系統(Network File System)的簡稱,是分布式計算系統的一個組成部分,可實現在異種網絡上共享和裝配遠程文件系統.NFS由Sun公司開發,目前已經成為文件服務的一種標準(RFC1904,RFC1813).其最大的功能就是可以通過網絡,讓不同操作系統的 計算機可以共享數據,所以也可以將它看做是一個文件服務器.NFS文件服務器是Linux最常見網絡的服務之一.盡管它的規則簡單,卻有著豐富的內涵. NFS 服務器可以看作是一個文件服務器,它可以讓你的PC通過網絡將遠端的NFS 服務器共享出來的文件掛載到自己的系統中,在客戶端看來使用NFS的遠端文件就象是在使用本地文件一樣.
一、硬件設備的選擇
隨著計算機技術的發展,以硬盤為首的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網絡拓撲結構#p#
二、軟件環境優化
如果我們沒有很高硬件環境,可以考慮從軟件方面優化性能.
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/bdflush30 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協議作為缺省的傳輸方式.#p#
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選項#p#
然后,重新編譯核心,重新起動計算機,執行如下命令:
#ifconfig eth0 down#ifconfig bond0 ipaddress
#ifenslave bond0 eth0
#ifenslave bond0 eth1
現在兩塊網卡已經象一塊一樣工作了.這樣可以提高集群節點間的數據傳輸.bonding對于服務器來是個比較好的選擇,在沒有千兆網卡時,用兩 塊100兆網卡作bonding,可大大提高服務器到交換機之間的帶寬.但是需要在交換機上設置連接bonding網卡的兩個子口映射為同一個虛擬接口. 編輯/etc/modules.conf文件,加入如下內容,以使系統在啟動時加載Bonding模塊.
alias bond0 bondingoptions 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個線程.其他數字代表每秒鐘線程使用的最大百分比.如果后邊三個數字比較大表示可能現在掛載客戶機數目比較多,需要增加線程數目.#p#
(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工作模式#p#
工作在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目錄中.#p#
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文件服務器性能,網絡管理員充分了解自己的計算機和網絡,從而找到真正的瓶頸所在.在預算短缺的今天,理解如何優化系統性能比以往任何時候都重要.一味地硬件投資并不是能夠讓人們接受的辦法,并且也不一定生效.