先看之前的數據…
本機硬碟實際讀寫數據:

以上是以單顆磁碟建置Pool所量測的讀寫數據,可以看到ZFS在大檔案的讀取約在107MB/s,小檔案約36MB/s;寫入的部份,上面的數據因受到快取的影響,只能作為參考,實際上寫入的效能與讀取差不多。也就是說單一磁碟的狀態下,ZFS的讀寫效能本身足以應付GigaLan的頻寬需求。
再來看看網路的傳輸數據…
網路傳輸數據:


(1) ZFS大檔案的寫入約94MB/s,若扣除磁碟的因素,整個系統最大寫入效能約104MB/s,這部份比較沒有問題。
(2) ZFS大檔案的讀取只有65MB/s,扣除磁碟的因素,網路的讀取效能可以到105MB/s。相較於寫入,讀取的效能有些低落,未能發揮它應有的表現。若透過快取,傳輸速度可以達到105MB/s,看起來似乎不是網路的問題。
(3) 小檔案的寫入低落,即使透過快取,因為還是需要等待Server端寫入,因此傳輸速率只有5MB/s左右。
(4) 小檔案的讀取大約在7MB/s左右,若是透過快取,小檔案的讀取可達到16MB/s。
從上方的數據分析來看,有幾個地方是我比較困惑的…
1. 讀取與寫入不對等,寫入>讀取,這與我們所認知的讀取>寫入相反。通常來說,讀取的動作較為簡單,因此效能上往往會比寫入來的佳,而上面的情形卻剛好相反,反而是寫入的效能比較好,而且不是好一點,差距還滿大的。
2. 讀取未能發揮應有實力。從快取的傳輸結果來看,大檔案應有106MB/s,小檔案應有16MB/s的實力。若說瓶頸在於磁碟身上似乎也不對,因為磁碟經過實測,本身足以提供大檔案107MB/s,小檔案35MB/s的傳輸能力,而這也是最困擾我的地方。
3. 若兩台電腦間傳輸的不對等是因為硬體或系統所造成的,那麼小檔案的寫入數值應該更高一些…
所以兇手到底是誰??
測試一:FTP測試 HD*1
對於這個問題,心中第一個想法就是,會不會是CIFS效能不佳?
雖說透過快取,網路傳輸就能發揮它應有的表現,問題點似乎不在網路身上。不過為了確切了解問題是不是CIFS造成的,最好的方法就是改採其他通訊協定來傳輸。
做個實驗,在二號機上安裝Proftpd-1.3.4a,一號機改用FTP協定來抓取檔案,看看是不是CIFS造成檔案傳輸效能的低落。因為小檔案必需一一建立連接,勢必會比網芳更慢,且大量連接,FTP Server會擋,因此在這就不測試,只測試大檔案的傳輸。
傳輸數據:


嗯,看起來問題不在CIFS身上,即使用傳輸效能最佳的FTP協定,存取的結果差不多…
測試二:Server端改採用NexentaStor系統
若不是傳輸協定的問題,那會是系統本身的問題嗎?因此此次測試Server端改採用NexentaStor系統。
說到NexentaStor得先提一下NexentaCore。NexentaCore是以Opensolaris為核心,搭配Debian/Ubuntu套件庫的一套作業系統。Unix的系統,用的卻是Linux的套件庫,我個人是覺得滿奇怪的。而NexentaStor則是Nexenta這家公司,以NexentaCore為基礎,所開發的一套儲存應用作業系統,就像FreeNAS一樣。NexentaStor有分成免費版及商用版,其中免費版有18TB的儲存限制,這邊用的是NexentaStor Community Edition 3.1.2。
在這裏採用NexentaStor系統的兩個原因:其一,NexentaStor是一套專業的NAS系統,就跟FreeNAS一樣,儲存資料是它的專業,我想用它來測試應該能壓搾出系統的最大效能;另外,NexentaStor本身有不錯的工具,能幫我更容易觀察整個傳輸的狀況。

測試環境:

測試環境 | Zoey | Sophie |
CPU | Q9400 2.66G | E5400 2.7G |
RAM | 8G | 8G |
OS | Win7 x64 | NexentaStor 3.1.2 |
NIC | Intel 82567LM-3 | Intel 82566DM-2 |
HD Read/Write | 123 / 122 | N/A |
RamDisk R/W | 2329 / 3949 | N/A |
一號機不變,二號機更改系統為NexentaStor 3.1.2,Zpool的版本是V28。
在NexentaStor初始化的過程中,我勾選了此項設定,看看能否得到更好的效能。

傳輸數據:HD*1


「Zoe <- Sop」這一塊還是一樣,不過「Zoe -> Sop」小檔案的數值倒有增長。我想這可能跟之前勾選的「Optimize I/O performance」有關,應該是關掉了ZIL。另外,透過監測系統的傳輸過程,倒是發現很有意思的地方…
「Zoe -> Sop」Single HD


使用zpool iostat -v 1指令觀察Pool的I/O狀況。Client端傳輸資料到Server端時,資料的寫入確實能破百。
「Zoe <- Sop」Single HD


從這兩張圖來看,基本上巳很明顯了,瓶頸是在資料的讀取而非傳輸身上。只是為什麼系統經由本機磁碟存取均能破百,但透過網路讀取時卻只有63MB/s,為什麼這兩者會有差別?實在是令人不解…
「Zoe <- Sop」Stripe HD


更進一步來測試,Pool即使使用Stripe(Raid 0),兩顆磁碟平均讀取,但Pool的總頻寬還是被限制在64MB/s左右。附上一張本機存取的圖來做對照。

這張圖證明在本機存取時,ZFS的確有能力提供最大的效能。只是若透過網路存取時,寫入沒問題,讀取卻被限制住了,這個限制的因素是什麼,嗯…我也還不知道。
「Zoe <- Sop」Single HD via Cache


這兩張是透過快取的。可以看到透過快取時,Pool並沒有做讀取的動作,完全由記憶體內的資料做直接的傳送。
測試三:一號機、二號機對調
從上面的測試可以知道,問題的癥結點在於:當透過網路讀取ZFS Pool的檔案時,讀取的頻寬會被限制在60~70MB/s左右,Pool的型態(Stripe、Raidz)會影響傳輸的速度,不過影響很小。而這些限制,只有透過網路存取時才有,本機磁碟的存取沒問題。那這個限制到底是如何造成的?
在實驗的過程中,我無意中發現了一個可能影響讀取效能的因素…
測試環境 | Zoey | Sophie |
CPU | Q9400 2.66G | E5400 2.7G |
RAM | 8G | 8G |
OS | Solaris Express 11 64bit | Win7 x64 |
NIC | Intel 82567LM-3 | Intel 82566DM-2 |
我把一號機與二號機的作業系統對調



大檔案的寫入略有下降,但是讀取效能卻增加了三成。很顯然的,CPU的Power會影響到資料的讀取,雖然還未能達到極限,不過這樣的數值算是可以接受的了。
綜合以上的測試,可以歸納出幾個論點:
1. ZFS在本機(localhost)存取時,沒有問題,效能十分優異。
2. 若以ZFS做為File Server的檔案系統。透過網路存取,資料的寫入沒問題,不過讀取的效能會被限制在60~70MB/s左右。
3. CPU的效能對讀取有滿大的影響。
4. 以上限制只有透過網路存取才有此種情形。
雖說確定有以上幾個現象,但也只是“知其然,不知其所以然”。這段期間也跟國外的網友請教,網友指出ZFS在本機及透過網路讀取的效能不同,可能在於一個是直接讀取,另一個除了讀取還要將資料分割成封包所造成的延遲。這或許可以解釋為什麼CPU效能對讀取有影響。不過還是未能解釋為什麼寫入的效能大於讀取,關於這一點網友也說不上來…
總的來說,以ZFS做為File Server的檔案系統,大檔案約60MB/s的傳輸,不滿意,但還可以接受;小檔案測試雖然只有5~7MB/s,經過調校,應該有16MB/s的能力。這樣的數值比起Windows系統雖然差了一個等級,不過考慮到ZFS的一些優秀特性,以ZFS拿來建置File Server還是值得評量的。
同場加映:Solaris to Solaris
在測試的過程中,也曾想過問題點會不會是Client端的Win7。因此將一號機的作業系統更改為Solaris Express 11,二台PC同樣以CIFS來做傳輸。
網路傳輸數據:



更慘!或許是因為在Unix的系統裏,CIFS不是主流,NFS才是王道!
To be continue…
網路傳輸測試 測試一:測試基準
網路傳輸測試 測試二:影響網路傳輸的因素
網路傳輸測試 測試三:Soft Raid @ Windows
網路傳輸測試 番外篇:殘酷的現實…
網路傳輸測試 測試四:ZFS @ Solaris Express 11