Share storage,諸如家用 NAS 或工作站常有的網路硬碟(NFS),是一個很方便又隨處可見的一種存儲空間,方便的點在於可以從不同機器存取或修改同樣的資料、避免需要維護重複的東西在不同的機器上;常見的使用情境像是會將 /home
家目錄放置於 Share storage 中,然後再掛載至所有工作站的機器上,這樣就可以讓使用者無論是登入哪一台工作站機器,都可以保持同樣的家目錄環境,十分方便。
除了前言提到的使用情境以外,其實常見的使用方式也有像是拿來做為平行運算寫入的位置,或者用於存放大量資料集(dataset)給需要的人方便讀取(像是之前 CML 就是這樣用)。而諸如此類的應用其實就很考驗 Share storage 的讀寫性能,若性能不佳可能常常會壞掉,導致所有有掛載的機器都會陷入無法存取的窘境。
而本篇目的就是想要測測看市面上常見的 share storage 解決方案以及他們各自的寫入性能,做個大PK。底下列舉的就是我打算要測試的幾種 share storage (由於純讀取通常效能都很好,所以這邊只測寫入效能)
- Gluster file system v7 using SSD
- Ceph file system v13.2 using SSD
- Google Filestore (2T Premium Tier)
- IBM File Storage (6T Type Endurance)
- AWS EFS
其中前兩個(Gluster, Ceph)需要自建,後三個(GCP, AWS, IBM)則是直接用雲端解決方案。
測試的方式我就用原始又有效的 dd
指令來試啦,基本上腳本長這樣:
1 |
|
這腳本有幾個參數可以調整:
bs
- block size 指單一寫入區塊的大小count
- 寫幾個區塊of
- 寫到哪裡,/mnt/
就是我們要測試的 share storage 的目錄
bs*count 就是總寫入大小,我這邊就統一使用 bs=10MB, count=100, 總計寫入 1GB。
而這個腳本執行的結果會像是這樣:
1 | $ bash test.sh |
但這樣還不夠,要測試到極限的話,需要平行化同時執行一堆這個腳本,寫爆 share storage!
- Gluster
- Ceph
- GCP
- IBM
- AWS
100x10MB, 10 jobs | 43 | 12 | 67 | 76 | 13 |
---|---|---|---|---|---|
100x10MB, 20 jobs | 12 | 6 | 29 | 66 | 6 |
100x10MB, 40 jobs | 9 | 6 | 21 | 33 | 2 |
Gluster | Ceph | GCP | IBM | AWS | |
---|---|---|---|---|---|
100x10MB, 10 jobs | 43.6 | 12.1 | 67.2 | 76.5 | 13.6 |
100x10MB, 20 jobs | 12.0 | 6.2 | 29.3 | 66.1 | 6.1 |
100x10MB, 40 jobs | 9.0 | 6.0 | 21.1 | 33.9 | 2.8 |
▲ 不同 storage 寫入效能比較[1][2]
結果如上圖所示,自建的系統其實表現都遜於雲端方案(尤其是同時平行寫入很多時),這不排除是因為我安裝 Gluster / Ceph 時基本上都是用預設的設定,沒有特別研究怎樣最佳化😱;而 AWS EFS 表現奇差,這有原因,底下詳述…。除此之外又穩又快的就是 GCP Filestore 以及 IBM File Storage 了,其中 IBM File Storage 在同時平行寫入很多時表現比較穩定,所以在這邊是 IBM 表現最佳🏆。
AWS EFS
AWS 的 EFS 的讀寫流量是有做限制的,基本上就是如果存越多資料在 EFS 裡面,則讀寫流量越高 (bursting mode),這也造成基礎流量超低,如果用的儲存空間只有 100G,則讀寫流量大概落在 5 MB/s,每增加 100GB 的空間用量會增加 5 MB/s 的速度[3],是個很妙的設計。在我這次的測試中,由於 EFS 基本上是空的,所以讀寫效能自然低下。
References
- 單位為 MB/s
- jobs 意指同時執行幾個寫入腳本,故若同時執行 10jobs,平均寫入可有 20MBps,則瞬時寫入速度為 200 MBps
- AWS EFS - Scale and performance