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
2
3
4
#!/bin/bash
f=`hostname`
rand=`head /dev/urandom | tr -dc A-Z | head -c 5 ; echo ''`
sync && dd if=/dev/zero of=/mnt/testfile_${f}_${rand} bs=10M count=100 oflag=direct 2>&1 | cat

這腳本有幾個參數可以調整:

  • bs - block size 指單一寫入區塊的大小
  • count - 寫幾個區塊
  • of - 寫到哪裡,/mnt/ 就是我們要測試的 share storage 的目錄

bs*count 就是總寫入大小,我這邊就統一使用 bs=10MB, count=100, 總計寫入 1GB。

而這個腳本執行的結果會像是這樣:

1
2
3
4
5
6
$ bash test.sh
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 4.59822 s, 128 MB/s
# ^^^^^^^^
# 這就是寫入速度

但這樣還不夠,要測試到極限的話,需要平行化同時執行一堆這個腳本,寫爆 share storage!

  • Gluster
  • Ceph
  • GCP
  • IBM
  • AWS
100x10MB, 10 jobs4312677613
100x10MB, 20 jobs12629666
100x10MB, 40 jobs9621332

GlusterCephGCPIBMAWS
100x10MB, 10 jobs43.612.167.276.513.6
100x10MB, 20 jobs12.06.229.366.16.1
100x10MB, 40 jobs9.06.021.133.92.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

  1. 單位為 MB/s
  2. jobs 意指同時執行幾個寫入腳本,故若同時執行 10jobs,平均寫入可有 20MBps,則瞬時寫入速度為 200 MBps
  3. AWS EFS - Scale and performance