2010年4月5日 星期一

ZFS的測試結果分析整理:(1) 寫入和讀取行為,實際硬體測試結果






ZFS的寫入和讀取行為,實際硬體測試結果
在測試ZFS的過程中,發現一些ZFS與一般RAID加上檔案系統的組合,有著差異相當大的寫入和讀取行為,非常的有趣和吸引人。

但是進一步在網路上尋找相關
ZFS資料時,發現大多文章只是拿官方的宣傳稿介紹ZFS,或是只專注於說明系統架設的過程。而針對ZFS的寫入讀取行為,找不到詳細說明。

官方的
"Solaris ZFS Administration
Guide"
也只針對ZFS管理方面說明,雖然最後在官方ZFS開發人員的blog上有找到一些說明,但是屬於較深入的部份,較基本的ZFS寫入讀取行為部份一樣缺乏。

所以我根據之前實際測試的結果,加上自己的分析整理出這篇關於
ZFS寫入讀取行為的基本說明。



以下的結果來自實際的硬體測試結果,測試的紀錄請自行參閱我過去的測試中相關註解。

總共測試了三種組態,分別是單一
mirror,兩組mirror,或是一組raidz1。分別在正常下,硬碟故障下,以及從故障情況下復原後的ZFS寫入讀取行為。

資料用
ABCDEFGH英文字母代表,每一個字母代表容量相同,但是內容不同的資料。測試時故障硬碟使用關機拔SATA線的方式模擬,故障復原則使用另外準備的空白硬碟替換拆下來的硬碟。





1 zpool底下有兩顆硬碟,組成mirror的組態,ZFS的寫入讀取行為。
zpool
mirror
c2t0d0
c2t1d0
首先是正常情況下的寫入和讀取行為
zpool

status
vdev

type
disc disc

status
(順序由左至右)
寫入資料AB
硬碟內資料狀態  寫入資料 分配硬碟資料 寫入資料

及產生checksum
硬碟內資料狀態
online mirror c2t0d0 online n/a AB AB AB AB
c2t1d0 online n/a AB AB AB
AB同時寫入mirror的兩顆硬碟,速度是一顆硬碟的水準,寫入行為與RAID1相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料AB
硬碟內資料狀態 讀取資料

及檢查checksum
合併硬碟資料 讀取資料 硬碟內資料狀態
online mirror c2t0d0 online AB A A+B AB AB
c2t1d0 online AB B AB
mirror的兩顆硬碟分別讀取AB,檢查checksum之後再加以合併,速度是兩顆硬碟合併,讀取行為與RAID0相似
再來是mirror中有一個硬碟故障的情況下。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料AB
硬碟內資料狀態 讀取資料

及檢查checksum
合併硬碟資料 讀取資料 硬碟內資料狀態
degrade mirror c2t0d0 fail n/a n/a AB AB n/a
c2t1d0 online AB AB AB
mirror的其中一顆硬碟無法讀出資料,所以從另一顆讀取AB,速度是一顆硬碟水準,故障中讀取行為與RAID1相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
寫入資料CD
硬碟內資料狀態  寫入資料 分配硬碟資料 寫入資料

及產生checksum
硬碟內資料狀態
degrade mirror c2t0d0 fail n/a CD n/a n/a n/a
c2t1d0 online AB CD CD ABCD
mirror的其中一顆硬碟無法寫入資料,所以CD只寫入其中一顆硬碟,速度是一顆硬碟水準,故障中寫入行為與RAID1相似
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料CD
硬碟內資料狀態 讀取資料

及檢查checksum
合併資料 讀取資料 硬碟內資料狀態
degrade mirror c2t0d0 fail n/a n/a CD CD n/a
c2t1d0 online ABCD CD ABCD
mirror的其中一顆硬碟無法讀出資料,所以從另一顆讀取CD,速度是一顆硬碟水準,故障中讀取行為與RAID1相似
使用空白硬碟接回原來拔下來的故障硬碟位置,zpool開始進行resilver重建。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
Resilver重建
硬碟內資料狀態 ZFS根據日誌決定必須重建的資料 讀取資料

及檢查checksum
寫入資料

及產生checksum
硬碟內資料狀態
Resilver mirror c2t0d0 resilver n/a ABCD n/a ABCD ABCD
c2t1d0 online ABCD ABCD n/a ABCD
ZFS會根據檔案系統的日誌決定必須重建的資料,所以只會重建degrade期間變動的資料,新硬碟只缺少ABCD,所以只寫入ABCD進入新硬碟,不會重建整顆硬碟的容量,這是ZFS的一大特點,這部份與一般RAID1有相當大的差異。重建速度在理想情況下就是單顆硬碟的寫入速度上限。

值得一提的是,ZFS再遇到硬碟故障時,會因為故障方式不同,以及換上新硬碟時,是同一個SATA接口互換硬碟,還是用額外的SATA接口接上重建用的新硬碟,都會讓重建行為不同,因為內容複雜,我打算另外寫一篇文章說明。
Resilver重建完成後 zpool online
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料AB
硬碟內資料狀態 讀取資料

及檢查checksum
合併資料 讀取資料 硬碟內資料狀態
online mirror c2t0d0 online ABCD A A+B AB ABCD
c2t1d0 online ABCD B ABCD
mirror的兩顆硬碟分別讀取AB,檢查checksum之後再加以合併,速度是兩顆硬碟合併,讀取行為與RAID0相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料CD
硬碟內資料狀態 讀取資料

及檢查checksum
合併資料 讀取資料 硬碟內資料狀態
online mirror c2t0d0 online ABCD C C+D CD ABCD
c2t1d0 online ABCD D ABCD
mirror的兩顆硬碟分別讀取CD,檢查checksum之後再加以合併,速度是兩顆硬碟合併,讀取行為與RAID0相似。
假如要簡單的說明ZFSmirror組態下的寫入和讀取行為,正常下寫入像RAID1讀取像RAID0,異常下寫入和讀取都像RAID1

因為沒有測試過類似JBOD組態,完全沒有容錯功能的zpool組態,可能要用VM測一下。
2 zpool底下有4顆硬碟,組成兩組mirror的組態,ZFS寫入讀取行為。
zpool
mirror
c2t0d0
c2t1d0
mirror
c2t2d0
c2t3d0
首先是正常情況下的寫入和讀取行為
zpool

status
vdev

type
disc disc

status
(順序由左至右)
寫入資料ABCD
硬碟內資料狀態  寫入資料 分配vdev資料 分配硬碟資料 寫入資料

及產生checksum
硬碟內資料狀態
online mirror c2t0d0 online n/a ABCD AB AB AB AB
c2t1d0 online n/a AB AB AB
mirror c2t2d0 online n/a CD CD CD CD
c2t3d0 online n/a CD CD CD
ABCD分成ABCD分別寫入兩組mirror,速度是兩顆硬碟同時寫入的水準,行為與RAID10相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料ABCD
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
輸出

mirror

資料
合併

vdev

資料
讀取資料
online mirror c2t0d0 online AB A A+B AB AB+CD ABCD
c2t1d0 online AB B
mirror c2t2d0 online CD C C+D CD
c2t3d0 online CD D
從兩組mirror4顆硬碟分別讀取ABCD,檢查checksum之後再加以合併,速度是4顆硬碟合併,行為與RAID0相似。
再來是兩組mirror中,有一組mirror的其中一個硬碟故障的情況下。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料ABCD
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
輸出

mirror

資料
合併

vdev

資料
讀取資料
degrade mirror c2t0d0 fail n/a n/a AB AB AB+CD ABCD
c2t1d0 online AB AB
mirror c2t2d0 online CD C C+D CD
c2t3d0 online CD D
故障mirror的其中一顆硬碟無法讀出資料,所以從另一顆讀取AB,所以AB的讀取速度是一顆硬碟水準。另一組mirror正常,所以從兩顆硬碟分別讀取CD,檢查checksum之後再加以合併,所以CD的讀取速度是兩顆硬碟合併。但是讀取ABCD的總和速度受到故障mirror的限制,所以只有兩顆硬碟的合併水準。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
寫入資料EFGH
硬碟內資料狀態  寫入資料 分配vdev資料 分配硬碟資料 寫入資料

及產生checksum
硬碟內資料狀態
degrade mirror c2t0d0 fail n/a EFGH n/a n/a n/a n/a
c2t1d0 online AB n/a AB
mirror c2t2d0 online CD EFGH EFGH EFGH CDEFGH
c2t3d0 online CD EFGH EFGH CDEFGH
zpooldegrade狀態下寫入全新資料EFGH時,ZFS的特色就出現了。

因為其中一組
mirrordegrade狀態下,失去了容錯能力,ZFS會掠過這一組失去容錯能力的mirror,把新資料EFGH寫入另一組容錯能力正常的mirrorEFGH同時寫入正常mirror中的兩顆硬碟,速度是一顆硬碟的水準。同時zpool屬於degarde狀態中,但是新資料EFGH仍然保有容錯能力。

可以發現ZFS在這時犧牲寫入速度,以寫入資料的安全性為第一優先,不會像一般的RAID1+0,因為RAID0部份的關係,在degrade狀態下,新寫入的資料沒有容錯能力。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料EFGH
硬碟內資料狀態 讀取資料

及檢查checksum
合併

vdev

硬碟資料
輸出

mirror

資料
合併

vdev

資料
讀取資料
degrade mirror c2t0d0 fail n/a n/a n/a n/a EFGH EFGH
c2t1d0 online AB n/a
mirror c2t2d0 online CDEFGH EF EF+GH EFGH
c2t3d0 online CDEFGH GH
因為zpooldegrade狀態下寫入的全新資料EFGH只存在於容錯正常的mirror中。

從正常的
mirror讀取EFGH的行為就和單一mirror相同了,從mirror的兩顆硬碟分別讀取EFGH,檢查checksum之後再加以合併,速度是兩顆硬碟合併,讀取行為與RAID0相似。
使用空白硬碟接回原來拔下來的故障硬碟位置,zpool開始進行resilver重建。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
Resilver重建
硬碟內資料狀態 ZFS根據日誌決定必須重建的資料 讀取資料

及檢查checksum
寫入資料

及產生checksum
硬碟內資料狀態
Resilver mirror c2t0d0 resilver n/a AB n/a AB AB
c2t1d0 online AB AB n/a AB
mirror c2t2d0 online CDEFGH n/a n/a CDEFGH
c2t3d0 online CDEFGH n/a n/a CDEFGH
ZFS同樣會根據檔案系統的日誌決定必須重建的資料,所以只會重建degrade期間變動的資料,新硬碟只缺少AB而故障期間的新資料EFGH已經在正常的mirror中有容錯,所以ZFS不會再針對EFGH進行重建,所以只寫入AB進入新硬碟,不會重建整個zpool下的資料,大幅縮短重建時間,這也是ZFS的一大特點,與一般RAID和檔案系統各自獨立的情況下是辦不到的。重建速度在理想情況下就是單顆硬碟的寫入速度上限。

我再重複提一次的是,ZFS再遇到硬碟故障時,會因為故障方式不同,以及換上新硬碟時,是同一個SATA接口互換硬碟,還是用額外的SATA接口接上重建用的新硬碟,都會讓重建行為不同,因為內容複雜,我打算另外寫一篇文章說明。
Resilver重建完成後 zpool online
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料ABCD
硬碟內資料狀態 讀取資料

及檢查checksum
合併

vdev

硬碟資料
輸出

mirror

資料
合併

vdev

資料
讀取

資料
online mirror c2t0d0 online AB A A+B AB AB+CD ABCD
c2t1d0 online AB B
mirror c2t2d0 online CDEFGH C C+D CD
c2t3d0 online CDEFGH D
從兩組mirror4顆硬碟分別讀取ABCD,檢查checksum之後再加以合併,速度是4顆硬碟合併,行為與RAID0相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料EFGH
硬碟內資料狀態 讀取資料

及檢查checksum
合併

vdev

硬碟資料
輸出

mirror

資料
合併

vdev

資料
讀取資料
online mirror c2t0d0 online AB n/a n/a n/a EFGH EFGH
c2t1d0 online AB n/a
mirror c2t2d0 online CDEFGH EF EF+GH EFGH
c2t3d0 online CDEFGH GH
因為EFGH只存在於其中一組的mirror中。

從正常的
mirror讀取EFGH的行為就和單一mirror相同了,從mirror的兩顆硬碟分別讀取EFGH,檢查checksum之後再加以合併,速度是2顆硬碟合併,讀取行為與RAID0相似。
假如要簡單的說明ZFS在兩組mirror組態下的寫入和讀取行為,正常下寫入像RAID1+0讀取像RAID0,異常下寫入和讀取則要看資料配置的狀況,但是可以發現ZFS以確保寫入資料的安全為第一優先。

再進一步,萬一是壞兩顆硬碟,剛好兩個
mirror各壞一顆硬碟,全壞在同一組mirror的情況下,ZFS的寫入和讀取行為會如何變化,也很值得用VM測試一下。
3 zpool底下有3顆硬碟,組成單一raidz1的組態,ZFS寫入讀取行為。
zpool
raidz1
c2t0d0
c2t1d0
c2t2d0
zpool

status
vdev

type
disc disc

status
(順序由左至右)
寫入資料AB
硬碟內資料狀態  寫入資料 分配資料

產生檢查碼P
寫入資料

及產生checksum
硬碟內資料狀態
online raidz1 c2t0d0 online n/a AB A A A
c2t1d0 online n/a B B B
c2t2d0 online n/a P(AB) P(AB) P(AB)
ABP(AB)同時分別寫入3顆硬碟,所以寫入速度是2顆硬碟的合併,寫入行為與RAID5相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料AB
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
讀取資料 硬碟內資料狀態
online raidz1 c2t0d0 online A A A+B+

P(AB)
AB A
c2t1d0 online B B B
c2t2d0 online P(AB) P(AB) P(AB)
分別從3顆硬碟讀取ABP(AB),還原資料AB,所以讀取速度是2顆硬碟的合併,讀取行為與RAID5相似。
再來是raidz1其中一個硬碟故障的情況下。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料AB
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
讀取資料 硬碟內資料狀態
degrade raidz1 c2t0d0 fail n/a n/a B+

P(AB)
AB n/a
c2t1d0 online B B B
c2t2d0 online P(AB) P(AB) P(AB)
其中一顆硬碟故障,所以從正常的2顆硬碟讀取BP(AB),還原資料AB,所以讀取速度是2顆硬碟的合併,讀取行為與RAID5相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
寫入資料CD
硬碟內資料狀態  寫入資料 分配資料

產生檢查碼P
寫入資料

及產生checksum
硬碟內資料狀態
degrade raidz1 c2t0d0 fail n/a CD n/a n/a n/a
c2t1d0 online B C C B,C
c2t2d0 online P(AB) D D P(AB)D
因為一顆硬碟故障,所以CD同時分別寫入正常的2顆硬碟,所以寫入速度是2顆硬碟的合併,寫入行為與RAID5相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料CD
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
讀取資料 硬碟內資料狀態
degrade raidz1 c2t0d0 fail n/a n/a C+D CD n/a
c2t1d0 online B,C C B,C
c2t2d0 online P(AB),D D P(AB),D
其中一顆硬碟故障,所以從正常的2顆硬碟讀取CD,還原資料CD,所以讀取速度是2顆硬碟的合併,讀取行為與RAID5相似。
使用空白硬碟接回原來拔下來的故障硬碟位置,zpool開始進行resilver重建。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
resilver重建
硬碟內資料狀態 ZFS根據日誌決定必須重建的資料 讀取資料

及檢查checksum
還原資料 分配資料

產生檢查碼P
寫入資料

及產生checksum
硬碟內資料狀態
Resilver raidz1 c2t0d0 resilver n/a AB,CD n/a AB,CD A,P(CD) A,P(CD) A,P(CD)
c2t1d0 online B,C B,C B,C n/a B,C
c2t2d0 online P(AB),D P(AB),D P(AB),D n/a P(AB),D
可能分別從正常的兩顆硬碟讀取資料,還原出ABCD,再從ABCD重新產生要寫入新硬碟的重建資料,基本上和一般RAID5相似,但是ZFS同樣會根據檔案系統的日誌決定必須重建的資料,所以只會重建degrade期間變動的資料。

因為我只能從iostat的讀取寫入資訊來推測ZFS行為,沒辦法直接知道ZFS寫入的詳細順序,所以raidz1比較複雜的重建順序,可能不太正確。
Resilver重建完成後 zpool online
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料AB
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
讀取資料 硬碟內資料狀態
online raidz1 c2t0d0 online A,P(CD) A A+B+

P(AB)
AB A,P(CD)
c2t1d0 online B,C B B,C
c2t2d0 online P(AB),D P(AB) P(AB),D
分別從3顆硬碟讀取ABP(AB),還原資料AB,所以讀取速度是2顆硬碟的合併,讀取行為與RAID5相似。
zpool

status
vdev

type
disc disc

status
(順序由左至右)
讀取資料CD
硬碟內資料狀態 讀取資料

及檢查checksum
合併

硬碟資料
讀取資料 硬碟內資料狀態
online raidz1 c2t0d0 online A,P(CD) P(CD) P(CD)+C+D AB A,P(CD)
c2t1d0 online B,C C B,C
c2t2d0 online P(AB),D D P(AB),D
分別從3顆硬碟讀取P(CD)CD,還原資料CD,所以讀取速度是2顆硬碟的合併,讀取行為與RAID5相似。
假如要簡單的說明ZFS在單一raidz1組態下的寫入和讀取行為,大約和RAID5相似。

但是我打算進一步用VM測試4顆硬碟以上組成的單一raidz1組態,故障一顆和故障兩顆硬碟時的寫入和讀取行為。

因為在官方的
ZFS介紹中"ZFS – The Last Word in File Systems"raidz1stripe width並不是固定大小,說明圖片中的stripe也不是固定依硬碟數量分割,是動態的分配。加上測試出到兩組mirror存在時,會只把資料寫入正常的mirror以確保安全性的特殊行為。

所以我異想天開懷疑
4顆硬碟組成的raidz1會在一顆硬碟故障時,寫入資料時會重新以剩下的3顆硬碟為基準產生stripe,以確保資料有容錯。因為我的測試是由3顆硬碟組成raidz1,故障1顆後,剩下的兩顆無法產生raidz1的資料分配。所以測試不出這種行為。

很值得測試一下確定
ZFS是否在確保資料安全上有積極成這樣。
整理一下我個人的ZFS寫入讀取行為測試結論

1. ZFS會以寫入資料安全為第一優先,所以寫入資料的安全性很高。

2. 因為ZFS是檔案系統和RAID合一的架構,ZFS可以在硬碟異常時動態的改變寫入資料的分配,也可以在重建時只重建必要的部份,縮短資料在危險狀態下的時間。

3. 相對於寫入行為,讀取行為則十分的大膽,只要checksum檢查ok,就敢送出資料,因此mirror組態的讀取行為和RAID0相似,非常高速。

4. 但是也因為動態的寫入分配行為,讀取的行為和效能也因為動態的資料分佈,並不是那麼穩定。



目前還缺少的資料

1. raidz14顆以上硬碟組成時,硬碟故障下的寫入和讀取行為,ZFS是否會發生我異想天開的保護寫入資料行為(以剩下的硬碟分配寫入資料形成raidz1,確保資料有容錯),這可以用VM測試。

2. 沒有任何容錯的硬碟組態下,和有兩組raidz1的組態下,的寫入和讀取行為,同樣可以用VM測試。

沒有留言: