自建 samba + ZFS (snhpshot快照/任意還原點)檔案伺服器
由於raidz有多種組合,對於硬碟數量比較多的人確實有必要了解一下什麼樣的組合效能才是最好,當然可用的最大空間也是考量之一,因此底下的測試也有把可用空間寫進去。
說明一下我的測試環境:
CPU:CPU E5-2660 v4 *2
RAM:64G*4=256GB
HDD:Segate 7200RPM 1TB*28顆硬碟
主機板型號:X10DSC+
機殼型號:6048R-E1CR60L
SAS卡型號:AOC-S3008L-L8-P 使用晶片是LSI 3008
背板型號:BPN-SAS3-946SEL1
底下的測試主要參考這兩頁而來:calomel.org、icesquare.com、
說明一下我的測速指令:
#寫入測速指令
dd if=/dev/zero of=/vic2/file.out bs=4096 count=80000000 &
327680000000 bytes (328 GB) copied, 597.424 s, 548 MB/s
指令的最後方加個 & 符號,將程序丟到背景去跑,接著可用 kill -USR1 PID號 來看dd的執行狀態
共寫入328GB,需要寫入這麼大的檔案用意是要超出我系統上的256G RAM,避免cache影響到測速。
寫入時亦可用底下的指令來看IO狀況
zpool iostat vic2 -v 1
#讀取測試指令
dd if=/vic2/file.out of=/dev/null bs=4096 &
327680000000 bytes (328 GB) copied, 456.144 s, 718 MB/s
zfs建28顆硬碟 raid 指令參考:
raidz3 28顆*1組 zpool create -f vic2 raidz3 sd{c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad} raidz2 14顆*2組 建14顆raidz2兩組的指令,有兩種下法 一行指令搞定 zpool create -f vic2 raidz2 sd{c,d,e,f,g,h,i,j,k,l,m,n,o,p} raidz2 sd{q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad} 兩行指令搞定 zpool create -f vic2 raidz2 sd{c,d,e,f,g,h,i,j,k,l,m,n,o,p} zpool add vic2 raidz2 sd{q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad} raidz3 7顆*4組 zpool create -f vic2 raidz3 sd{c,d,e,f,g,h,i} raidz3 sd{j,k,l,m,n,o,p} raidz3 sd{q,r,s,t,u,v,w} raidz3 sd{x,y,z,aa,ab,ac,ad} mirror 2顆*14組 zpool create -f vic2 mirror sd{c,d} mirror sd{e,f} mirror sd{g,h} mirror sd{i,j} mirror sd{k,l} mirror sd{m,n} mirror sd{o,p} mirror sd{q,r} mirror sd{s,t} mirror sd{u,v} mirror sd{w,x} mirror sd{y,z} mirror sd{aa,ab} mirror sd{ac,ad} raid0 28顆 zpool create -f vic2 sd{c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad}
底下是測試報告:
格式 | 組數 | 硬碟數 | 可用總容量 | 寫MB/s | 讀MB/s | 備註 |
raidz3 | 1 | 28 | 22T | 541 | 700 | |
raidz3 | 2 | 14 | 20T | 566 | 769~780 | |
raidz3 | 4 | 7 | 14T | 525 | 751 | |
raidz2 | 1 | 28 | 23T | 548 | 718 | |
raidz2 | 2 | 14 | 21T | 566~580 | 823~830 | 註1 |
raidz2 | 3 | 9 | 19T | 539 | 542 | 註2 |
raidz2 | 4 | 7 | 18T | 544 | 906 | |
raidz1 | 1 | 28 | 24T | 551 | 692 | |
raidz1 | 2 | 14 | 23T | 576 | 880 | |
raidz1 | 4 | 7 | 21T | 565 | 889 | |
raid0 | 1 | 28 | 25T | 592 | 1126 | 註3 |
mirror | 1 | 28 | 899G | 202 | 585 | |
mirror | 2 | 14 | 1.8T | 441 | 652 | |
mirror | 14 | 2 | 13T | 579 | 939 | 註4 |
註1:因考慮用raidz2 2組*14顆這樣的組合,所以測了兩次以上。其實不只raidz2其它組合每次測的數字都不太一樣,因此只能取個範圍值。
註2:3組*9顆硬碟=共27顆硬碟,沒錯少一顆硬碟沒用上。
註3:raid0無法分組別,也無資料保護,因此實務上不太會這樣用,在此是純測速用
註4:mirror 14組*2顆 它的速度接近raid0了,至於1組mirror裡面超過兩顆以上的硬碟其實意義不大,讀寫效能都很差。
心得:之前看到這個官方建議,單一個vdev不要超過9個硬碟,經我實測的結果,發現這個建議好象沒有什麼用,超過9個硬碟的效能一樣好,沒有太大效能損失。若你不需要那麼多的儲存空間的話,而又需要資料有比較安全的保護,會推薦你使用 mirror 14組*2顆 這樣子的組合,效能接近 raid0 ,若比較需要多一點儲存空間的話,那會建議你使用 raidz2 2組*14顆 這樣的組合。
至於raidz1 (同raid5),若你的資料很重要的話,不管是哪樣的組合都不推薦你使用,雖然它的效能跟可用空間看來都不錯,但因為它只允許一顆硬碟壞掉,這很危險。在實際使用上,我們的硬碟大多都是同一時期買進的,當用了一段時間之後,出現第一顆硬碟故障時,也差不多是其它硬碟要到壽了,此時你將一顆新硬碟替換上去時,其它的硬碟為了要同步資料,就開始被狂操,而那些快到壽的硬碟很有可能就被你操掛了,因此在第一顆新硬碟還未同步完,就又出現第二顆硬碟故障,那你整個raid的資料就會死掉。而在 zfs raidz1 裡,不管是兩組raidz1或是4組 raidz1 只要其中一組 raidz1 同時壞兩顆硬碟,那你整個儲存池(pool)會被退出。
上述的測試報告,有網友提醒我有效能不足的問題,因此我又做了不同的測試
mdadm raid0 測試
我擔心有可能是zfs效能不足的問題,因此我把 zfs 毀了,改用 mdadm 來建 raid0 測試
mdadm建raid0指令和測試指令參考:
28顆硬碟建raid0指令如下:
mdadm --creat /dev/md1 --auto=yes --level=0 --raid-devices=28 /dev/sd{c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad}
格式化
mkfs.ext4 /dev/md1
掛載
mount /dev/md1 /mnt/tmp
寫入測試指令
dd if=/dev/zero of=/mnt/tmp/file.out bs=4096 count=80000000 &
測試結果
327680000000 bytes (328 GB) copied, 258.264 s, 1.3 GB/s
讀取指令測試
dd if=/mnt/tmp/file.out of=/dev/null bs=4096 &
327680000000 bytes (328 GB) copied, 161.322 s, 2.0 GB/s
讀取速度有到 2GB/s
毀掉raid0指令參考:
umount /mnt/tmp
dd if=/dev/zero of=/dev/md1 bs=1M count=50
mdadm --stop /dev/md1
dd if=/dev/zero of=/dev/sd{c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad} bs=1M count=10
13顆硬碟建raid0指令如下:
mdadm --creat /dev/md1 --auto=yes --level=0 --raid-devices=13 /dev/sd{c,d,e,f,g,h,i,j,k,l,m,n,o}
測試結果
327680000000 bytes (328 GB) copied, 335.788 s, 976 MB/s
8顆硬碟建raid0指令如下:
mdadm --creat /dev/md1 --auto=yes --level=0 --raid-devices=8 /dev/sd{c,d,e,f,g,h,i,j}
測試結果
327680000000 bytes (328 GB) copied, 356.641 s, 919 MB/s
4顆硬碟建raid0指令如下:
mdadm --creat /dev/md1 --auto=yes --level=0 --raid-devices=4 /dev/sd{c,d,e,f}
測試結果
327680000000 bytes (328 GB) copied, 373.97 s, 876 MB/s
底下是 mdadm raid0的測試報告
硬碟數量 | 28顆 | 13顆 | 8顆 | 4顆 |
寫入速度 | 1.3GB/s | 976 MB/s | 919 MB/s | 876 MB/s |
注意上面的硬碟數,從最少的看起4顆就有876MB/s,但可不是隨著硬碟越多,速度就會跟著往上升...跟什麼因素有關,目前我不清楚。
網友提醒我 zfs pool 預設的 record size 是 128kb,可參閱此頁。建議我的dd測試指令可改用128kb來測試看看。
1kb=1024bytes
128kb → 1024*128 = 131072 bytes
256kb → 1024*256 = 262144 bytes 因此我們的測試指令改為
寫入測試指令
dd if=/dev/zero of=/vic2/file.out bs=131072 count=40000 &
上面的bs=131072 可簡寫成 bs=128k
讀取測試指令
dd if=/vic2/file.out if=/dev/zero bs=131072 &
測出來的寫入速度
raid0 有達到最高3GB/s
mirror 2顆*14組 達 2.5GB/s
但是讀取速度就少的可憐了,都只有11MB/s
由於效能最好的raid0跟mirror測出來的讀取速都只有11MB/s這麼低,因此就不多做其它組合的測試了,意義不大。
使用dd 指定 bs=128k 的方式來測寫入速度,請參考下圖
上圖是使用此指令 zpool iostat vic2 -v 1 來看的。
3.5" HDD 7200轉的傳輸速率在 65~115MB/s 之間,上圖的每顆單碟的速度都接近100MB/s了,這個128k的寫入測試,可說是把單碟的最高效能給逼出來了。
2.64GB/s 這數字是浮動的,我看到最高達 3GB/s ,總共28顆硬碟,也就是說單碟速度有超過 100MB/s。
此測試報告主要是要確認此台主機硬體的架構沒有問題即可,之前我擔心是否SAS卡或背板(expander)頻寬有效能不足的問題,經此測試確認了沒有效能不足的問題之後,就可安心使用了。美超微有針對我這台機器提供了測試報告給我,我這台機器背板的頻寬上限是6GB/s 他的測試是大約在25顆左右的硬碟數量即達此極限。