最佳化永久磁碟和本機 SSD 的效能

永久磁碟的價格實惠、效能優異且具耐用性,因此是最常用的儲存空間選項。您也可以選擇本機 SSD,進一步提高效能及減少延遲,只是這樣就無法享有備援功能,且僅能在特定執行個體的生命週期內使用。對於在執行個體上運行的應用程式,請依照下列程序設定儲存選項:

  • 決定您需要多少空間。
  • 決定您的應用程式需要哪些效能特性。
  • 設定您的執行個體以提高儲存空間效能。

以下各節說明可以附加到 Compute Engine 執行個體的可用區塊儲存空間選項。如需 Google Cloud Platform 儲存空間選項的完整清單,請參閱 Cloud Storage 產品

區塊儲存空間效能比較

請考慮您的儲存空間大小和效能需求,以便判斷適合您執行個體的正確磁碟類型和大小。特定應用程式的效能需求一般可分成兩種不同的 I/O 模式。

  • 小型檔案的讀寫作業
  • 大型檔案的讀寫作業

針對小型檔案的讀寫作業,限制條件是每秒隨機輸入/輸出作業數 (IOPS)。

針對大型檔案的讀寫作業,限制條件則是總處理量

每 GB 的 IOPS 和總處理量數字代表單一磁碟上的總計資料匯總效能,無論磁碟已連結至單一執行個體,或是由多個執行個體共用都一樣。在多個執行個體讀取同一個磁碟的情況下,磁碟的總計匯總處理量和 IOPS 效能會由這些執行個體共用。為了進行規劃,建議您使用下列每 GB 的 IOPS 和總處理量費率:

區域性
標準
永久磁碟
地區性
標準
永久磁碟
區域性
SSD
永久磁碟
地區性
SSD
永久磁碟
本機 SSD (SCSI) 本機 SSD (NVMe)
最大持續 IOPS
每 GB 的讀取 IOPS 0.75 0.75 30 30 266.7 453.3
每 GB 的寫入 IOPS 1.5 1.5 30 30 186.7 240
每執行個體的讀取 IOPS 3,000* 3,000* 15,000–60,000* 15,000–60,000* 400,000 680,000
每執行個體的寫入 IOPS 15,000* 15,000* 15,000–30,000* 15,000–30,000* 280,000 360,000
最大持續總處理量 (MB/秒)
每 GB 的讀取總處理量 0.12 0.12 0.48 0.48 1.04 1.77
每 GB 的寫入總處理量 0.12 0.12 0.48 0.48 0.73 0.94
每執行個體的讀取總處理量 240* 240* 240–1,200* 240–1,200* 1,560 2,650
每執行個體的寫入總處理量 76 到 240** 38 到 200** 76–400* 38–200* 1,090 1,400

* 永久磁碟 IOPS 和總處理量效能取決於執行個體 vCPU 數量和 IO 區塊大小。如要進一步瞭解 SSD 永久磁碟,請參閱 SSD 永久磁碟效能限制一節;如要進一步瞭解標準永久磁碟,請參閱標準永久磁碟效能限制一節。

** SSD 和標準永久磁碟在 vCPU 數量更多的執行個體上可以達成更高的總處理量效能。詳情請參閱寫入總處理量的網路輸出上限一節。

永久磁碟與實體硬碟的比較

指定永久磁碟的大小時,請考慮這類磁碟相較於傳統實體硬碟的表現。下表將標準/SSD 永久磁碟與 7200 RPM SATA 硬碟應有的效能進行比較,後者的效能一般可達 75 IOPS 或 120 MB/秒。

I/O 類型 I/O 模式 要達到 7200 RPM SATA 硬碟的效能所需的大小
標準永久磁碟 SSD 永久磁碟
小型檔案隨機讀取 75 次小型檔案隨機讀取 100 GB 3 GB
小型檔案隨機寫入 75 次小型檔案隨機寫入 50 GB 3 GB
串流大型檔案讀取 120 MB/秒串流讀取 1,000 GB 250 GB
串流大型檔案寫入 120 MB/秒串流寫入 1,000 GB 250 GB

大小、價格和效能摘要

為應用程式選取磁碟區類型和大小時有許多因素要考量,但您不必考慮磁碟區的使用價格。永久磁碟不會對每次 I/O 收取費用,因此您不需要推估每月 I/O 來計算磁碟方面的預算。不過,針對以 IOPS 為導向的工作負載,為了進行比較,您可以拆分每月 IOPS 的費用來查看 IOPS 的單價。

下列價格計算範例使用的是美國的永久磁碟定價。在這些範例中,請考慮標準永久磁碟相較於 SSD 永久磁碟的相對成本。標準永久磁碟的定價為每 GB $0.040 美元,SSD 永久磁碟的定價則是每 GB $0.170 美元。效能上限會隨著磁碟區大小而提高,無需額外費用。

如要確認永久磁碟的 IOPS 單價,請將每月每 GB 的價格除以每 GB 的 IOPS 數量。下表列出每 GB 每次隨機讀取 IOPS 的價格。您也可以使用相同的方式來計算每次寫入 IOPS 的價格。

磁碟類型 每月每 GB 價格 每 GB 的讀取 IOPS 每 GB 每 IOPS 的價格
標準永久磁碟 $0.040 0.75 $0.040 / 0.75 = $0.0533
SSD 永久磁碟 $0.170 30 $0.170 / 30 = $0.2267

SSD 永久磁碟會在 2000 GB 時達到隨機讀取 IOPS 上限 (60,000),並在 1000 GB 時達到隨機寫入 IOPS 上限 (30,000)。相較之下,標準永久磁碟會在 4TB 時達到隨機讀取 IOPS 上限 (3,000),並在 10 TB 時達到隨機寫入 IOPS 上限 (15,000)。

SSD 永久磁碟是專為個位數毫秒的延遲設計,每個應用程式觀察到的延遲情形都不同。

標準永久磁碟

標準永久磁碟的效能可線性擴充至 VM 效能上限。如果執行個體有 4 個以上的 vCPU,標準永久磁碟的效能就不會受到限制。

如果執行個體的 vCPU 少於 4 個,則 IOPS 寫入上限會較低,因為網路輸出上限與 vCPU 的數量成比例。寫入上限也取決於 IO 大小 (在相同的 IOPS 等級,16 KB IO 會耗用比 8 KB IO 更多的頻寬)。

標準永久磁碟 IOPS 和總處理量效能會隨著磁碟大小線性提高,直到達到下列每個執行個體的上限為止:

  • 讀取總處理量:磁碟大小為 2 TB 時最高可達 240 MB/秒。
  • 寫入總處理量:磁碟大小為 2 TB 時最高可達 240 MB/秒。
  • 讀取 IOPS:磁碟大小為 4 TB 時最高可達 3,000 IOPS。
  • 寫入 IOPS:磁碟大小為 10 TB 時最高可達 15,000 IOPS。

如要讓現有的執行個體受惠於永久磁碟的效能,請調整永久磁碟的大小來提高每個永久磁碟的 IOPS 和總處理量。

磁碟區大小 (GB) 持續隨機 IOPS 持續總處理量 (MB/秒)
讀取
(<=16 KB/IO)
寫入
(<=8 KB/IO)
寫入
(16 KB/IO)
讀取 寫入
10 * * * * *
32 24 48 48 3 3
64 48 96 96 7 7
128 96 192 192 15 15
256 192 384 384 30 30
512 384 768 768 61 61
1,000 750 1,500 1,500 120 120
1,500 1,125 2,250 2,250 180 180
2,048 1,536 3,072 3,072 240 240
4,000 3,000 6,000 6,000 240 240
5,000 3,000 7,500 7,500 240 240
8,192 3,000 12,288 7,500 240 240
10,000 3,000 15,000 7,500 240 240
16,384 3,000 15,000 7,500 240 240
32,768 3,000 15,000 7,500 240 240
65,536 3,000 15,000 7,500 240 240

* 上述磁碟區大小僅適用於啟動磁碟區。I/O 爆發功能為開機磁碟區所提供的性能,會高於此處所述的線性資源配置。

SSD 永久磁碟

SSD 永久磁碟的 IOPS 效能不但取決於磁碟大小,同時也取決於執行個體中的 vCPU 數量。

由於寫入總處理量的網路輸出上限,較低的核心 VM 會有較低的寫入 IOPS 和總處理量上限。詳情請參閱寫入總處理量的網路輸出上限

SSD 永久磁碟效能可線性擴充,直到達到磁碟區上限或各個 Compute Engine 執行個體的上限為止。接近上限時,SSD 讀取頻寬和 IOPS 一致性主要取決於網路輸入使用率,如有變化係屬正常,尤其是接近 IOPS 上限的 16 KB I/O 容易有所改變。

執行個體 vCPU 數量 持續隨機 IOPS 持續總處理量 (MB/秒)
讀取
(<=16 KB/IO)
寫入
(<=8 KB/IO)
寫入
(16 KB/IO)
讀取* 寫入
1 個 vCPU15,000 9,000 4,500 240 72
2 到 3 個 vCPU15,000 15,000 4,500/vCPU 240 72/vCPU
4 到 7 個 vCPU 15,000 15,000 15,000 240 240
8 到 15 個 vCPU 15,000 15,000 15,000 800 400
16 到 31 個 vCPU 25,000 25,000 25,000 1,200 400
32 到 63 個 vCPU 60,000 30,000 25,000 1,200 400
64 個以上的 vCPU** 60,000 30,000 25,000 1,200 400

* 最大總處理量取決於大小在 256 KB 以上的 I/O 區塊。

** 完整 CPU 使用率下可能無法達到最高效能。

如要提高現有執行個體的 SSD 永久磁碟效能,請變更執行個體的機器類型來提高每個 VM 的上限,並調整永久磁碟的大小來提高每個永久磁碟的 IOPS 和總處理量。

磁碟區大小 (GB) 持續隨機 IOPS 持續總處理量 (MB/秒)
讀取
(<=16 KB/IO)
寫入
(<=8 KB/IO)
寫入
(16 KB/IO)
讀取 寫入
10 300 300 300 4.8 4.8
32 960 960 960 15 15
64 1,920 1,920 1,920 30 30
128 3,840 3,840 3,840 61 61
256 7,680 7,680 7,680 122 122
500 15,000 15,000 15,000 240 240
834 25,000 25,000 25,000 400 400
1,000 30,000 30,000 25,000 480 400
1,334 40,000 30,000 25,000 640 400
1,667 50,000 30,000 25,000 800 400
2,048 60,000 30,000 25,000 983 400
4,096 60,000 30,000 25,000 1,200 400
8,192 60,000 30,000 25,000 1,200 400
16,384 60,000 30,000 25,000 1,200 400
32,768 60,000 30,000 25,000 1,200 400
65,536 60,000 30,000 25,000 1,200 400

C2 磁碟上限

運算最佳化機器類型的每個 vCPU 的特定永久磁碟上限與其他機器類型的上限不同。這些限制列於下表之中。

請注意,依磁碟區大小而定的效能資訊仍應參照標準磁碟效能SSD 磁碟效能章節。

標準永久磁碟
執行個體 vCPU 數量 持續隨機 IOPS 持續總處理量 (MB/秒)
讀取
(<=16 KB/IO)
寫入
(<=8 KB/IO)
寫入
(16 KB/IO)
讀取* 寫入
4 個 vCPU 3,000 4,000 4,000 240 240
8 個 vCPU 3,000 4,000 4,000 240 240
16 個 vCPU3,000 4,000 4,000 240 240
30 個 vCPU 3,000 8,000 8,000 240 240
60 個 vCPU 3,000 15,000 15,000 240 240
SSD 永久磁碟
執行個體 vCPU 數量 持續隨機 IOPS 持續總處理量 (MB/秒)
讀取
(<=16 KB/IO)
寫入
(<=8 KB/IO)
寫入
(16 KB/IO)
讀取* 寫入
4 個 vCPU 4,000 4,000 4,000 240 240
8 個 vCPU 4,000 4,000 4,000 240 240
16 個 vCPU8,000 4,000 4,000 320 240
30 個 vCPU 15,000 8,000 8,000 600 240
60 個 vCPU 30,000 15,000 15,000 1,200 400

同步讀取和寫入

針對標準永久磁碟,同步讀取和同步寫入的資源為共用。隨著執行個體使用的讀取總處理量或 IOPS 提高,其所能執行的寫入作業也會減少。相反地,隨著執行個體使用的寫入總處理量提高,其所能執行的讀取作業也會減少。

SSD 永久磁碟可同時達到讀取和寫入總處理量的上限。但是,IOPS 並非如此;也就是說,SSD 永久磁碟無法同時達到最大讀取和寫入限制。如要在同步讀取和寫入時發揮最大總處理量,請將 I/O 調整到最佳大小,讓磁碟區能夠在不遇到 IOPS 瓶頸的情況下達到總處理量上限。

同步讀取和寫入的執行個體 IOPS 上限如下:

下表所提供的是 8 KB I/O 的 IOPS 數字。其他 I/O 大小 (例如 16 KB) 可能會有不同的 IOPS 數字,但會維持相同的讀取/寫入分布。

標準永久磁碟 SSD 永久磁碟 (8 個 vCPU) SSD 永久磁碟 (32 個以上的 vCPU)
讀取 寫入 讀取 寫入 讀取 寫入
3,000 IOPS 0 IOPS 15,000 IOPS 0 IOPS 60,000 IOPS 0 IOPS
2,250 IOPS 3,750 IOPS 11,250 IOPS 3,750 IOPS 45,000 IOPS 7,500 IOPS
1,500 IOPS 7,500 IOPS 7,500 IOPS 7,500 IOPS 30,000 IOPS 15,000 IOPS
750 IOPS 11,250 IOPS 3750 IOPS 11,250 IOPS 15,000 IOPS 22,500 IOPS
0 IOPS 15,000 IOPS 0 IOPS 15,000 IOPS 0 IOPS 30,000 IOPS

同步讀取和寫入的執行個體總處理量上限如下:

標準永久磁碟 SSD 永久磁碟 (8 個 vCPU) SSD 永久磁碟 (16 個以上的 vCPU)
讀取 寫入 讀取 寫入 讀取 寫入
240 MB/秒 0 MB/秒 800 MB/秒* 400 MB/秒* 1,200 MB/秒* 400 MB/秒*
180 MB/秒 60 MB/秒
120 MB/秒 120 MB/秒
60 MB/秒 180 MB/秒
0 MB/秒 240 MB/秒

* 針對 SSD 永久磁碟,讀取總處理量上限和寫入總處理量上限並不相關,因此這些上限會保持不變。由於效能持續改進,您可能會發現各執行個體的 SSD 永久磁碟總處理量已增加至超出本文所述的上限。

寫入總處理量的網路輸出上限

每個永久磁碟的寫入作業都會計入虛擬機器 (VM) 執行個體的累積網路輸出上限

如要計算 VM 執行個體可發出的永久磁碟寫入流量上限,請將執行個體的其他網路輸出流量從其 2 Gbit/s/vCPU 網路上限中扣除,剩下的總處理量就是可用於永久磁碟寫入流量的總處理量。

Compute Engine 永久磁碟提供內建的備援功能。執行個體會同時將資料寫入永久磁碟三次以提供備援功能。此外,每項寫入要求都會使用輸出頻寬並造成一定程度的負擔。

每個執行個體都有永久磁碟寫入上限,此限制取決於 VM 的網路輸出上限。在永久磁碟與 IP 流量競爭使用網路輸出的情況下,60% 的網路輸出會提供給永久磁碟流量使用,而 40% 則是供 IP 流量使用。下表詳列包含及不包含額外 IP 流量時的預計永久磁碟寫入頻寬:

標準永久磁碟 固態永久磁碟
vCPU 數量 標準永久磁碟寫入上限 (MB/秒) 標準永久磁碟寫入分配量 (MB/秒) 達到上限所需的標準磁碟區大小 (GB) SSD 永久磁碟寫入上限 (MB/秒) SSD 永久磁碟寫入分配量 (MB/秒) 達到上限所需的 SSD 永久磁碟大小 (GB)
1 72 43 600 72 43 150
2 144 86 1,200 144 86 300
4 240 173 2,000 240 173 500
8+ 240 240 2,000 400 346 834

為了讓您瞭解上表中資料值的計算方式,以下用 1 個 vCPU 和標準永久磁碟做為範例。在此範例中,我們推估每項寫入要求的頻寬倍數大約是 3.3 倍,表示該資料的寫入速度為 3 倍,總負擔為 10%。如要計算輸出上限,請將網路輸出上限 (2 Gbit/秒,相當於 238 MB/秒) 除以 3.3:

對於標準永久磁碟而言,一個 vCPU 的寫入頻寬上限 = 238 / 3.3 = ~72 MB/秒

根據前列效能表中的每 GB 標準永久磁碟寫入總處理量數據,您也可以推算達到此效能所需的磁碟容量:

1 個 vCPU 達到寫入寬頻上限所需的磁碟容量 = 72 / 0.12 = ~600 GB

地區性永久磁碟的寫入流量會計入 VM 執行個體的累積網路輸出上限,這點與區域性永久磁碟相同。如要計算地區永久磁碟可用的輸出網路,請使用 6.6 做為倍數。

對於標準複製永久磁碟而言,一個 vCPU 的寫入頻寬上限 = 238 / 6.6 = ~36 MB/秒。

最佳化永久磁碟和本機 SSD 的效能

您可以最佳化永久磁碟和本機 SSD 的效能以提高資料處理效率。

最佳化永久磁碟

永久磁碟可提供磁碟類型表所述的效能,但虛擬機器必須產生足夠用量才能達到效能上限。根據效能需求將永久磁碟的磁碟區調整大小後,應用程式和作業系統可能需要經過微調。

在下節中,我們將說明幾個可微調以提高效能的重要元素,及如何將其中幾種元素應用於特定類型的工作負載。

停用延遲初始化並啟用 DISCARD 指令

永久磁碟支援 DISCARD 或 TRIM 指令,這類指令可讓作業系統在區塊無法再使用時通知磁碟。有了對 DISCARD 指令的支援,OS 就能將磁碟區塊標示為不再需要,而不會因為將區塊零化而產生費用。

在大部分的 Linux 作業系統上,您必須在將永久磁碟掛接至執行個體時啟用 DISCARD。Windows 2012 R2 執行個體則會在您掛接永久磁碟時預設啟用 DISCARD。Windows 2008 R2 不支援 DISCARD。

啟用 DISCARD 可提高一般執行階段效能,同時還可提高磁碟首次掛接時的效能。將磁碟的整個磁碟區格式化可能相當費時,所以常見的做法是「延遲格式化」。延遲格式化的缺點是您往往得在首次掛接磁碟區時支付費用。只要停用延遲初始化並啟用 DISCARD 指令,您就能快速進行格式化及掛接。

  • 在格式化過程中將下列參數傳送至 mkfs.ext4,即可停用延遲初始化並啟用 DISCARD:

    -E lazy_itable_init=0,lazy_journal_init=0,discard
    

    lazy_journal_init=0 參數不支援含有 CentOS 6RHEL 6 映像檔的執行個體。針對這類執行個體,將永久磁碟格式化時請不要使用該參數。

    -E lazy_itable_init=0,discard
    
  • 在掛接時啟用 DISCARD 指令,將下列標記傳送至掛接指令:

    -o discard
    

永久磁碟在啟用 discard 選項時可順利運作。不過除了使用 discard 選項外,您還可以選擇或改為定期執行 fstrim。如果您不使用 discard 選項,請先執行 fstrim 再建立磁碟快照。修整作業系統可讓您建立較小的快照映像檔,進而減少儲存快照的費用。

I/O 佇列深度

許多應用程式可調整 I/O 佇列深度。佇列深度越大,IOPS 就越高,但延遲也可能因此增加。佇列深度越小,每次 I/O 延遲就越低,但可能會降低最大 IOPS。

提前讀取快取

為改善 I/O 效能,作業系統會採用提前讀取這類技巧,在這種情況下,記憶體中讀入的檔案數量比所要求的還多,因為系統會假設後續的讀取作業可能需要這些資料。提前讀取量越多,總處理量就越高,但記憶體和 IOPS 會受影響。提前讀取量越少,IOPS 就越高,但總處理量會受影響。

在 Linux 系統上,您可以透過 blockdev 指令取得及設定提前讀取值:

$ sudo blockdev --getra /dev/[DEVICE_ID]
$ sudo blockdev --setra [VALUE] /dev/[DEVICE_ID]

提前讀取值為 <desired_readahead_bytes>/512 個位元組。

舉例來說,假設需要 8 MB 的提前讀取量,而 8 MB 是 8388608 個位元組 (8 * 1024 * 1024)。

8388608 bytes / 512 bytes = 16384

因此,blockdev 應設為 16384

$ sudo blockdev --setra 16384 /dev/[DEVICE_ID]

釋出 CPU

讀取和寫入永久磁碟時需要 VM 的 CPU 週期。如要達到高度且一致的 IOPS 等級,則必須釋出 CPU 來處理 I/O。

IOPS 導向的工作負載

SQL 或 NoSQL 資料庫都有隨機存取資料的使用模式。Google建議對於 IOPS 導向的工作負載使用下列值:

  • 每 400 到 800 IOPS 的 I/O 佇列深度值設為 1,如果是大型磁碟區則最多可提高到 64

  • 針對每 2,000 隨機讀取 IOPS 使用 1 個空閒的 CPU,並針對每 2,500 隨機寫入 IOPS 使用 1 個空閒的 CPU

MongoDBApache Cassandra 和其他資料庫應用程式的最佳做法文件一般會建議使用較低的提前讀取值。

總處理量導向的工作負載

串流作業 (例如 Hadoop 工作) 受惠於快速的循序讀取能力,而較大的 I/O 可提高串流效能。就以總處理量為導向的工作負載而言,建議您使用大小在 256 KB 以上的 I/O。

最佳化 SSD 永久磁碟效能

各個磁碟類型的效能表說明了固態永久磁碟應可達到的效能。如要最佳化應用程式和 VM 執行個體以達到此速度,請使用下列最佳做法:

  • 確保應用程式產生足夠的 I/O

    如果應用程式產生的 IOPS 少於先前表中所述的上限,就無法達到該 IOPS 等級。舉例來說,在 500 GB 的磁碟上,IOPS 上限應為 15,000 IOPS。不過,如果產生的 IOPS 少於這個值,或 I/O 作業大於 8 KB,就無法達到 15,000 IOPS。

  • 確保提供給 I/O 的平行運作數充足

    請使用夠大的佇列深度,以便利用 OS 的平行運作功能。如果您提供 1,000 IOPS,但是在佇列深度為 1 的情況下以同步方式進行,所達到的 IOPS 就會遠低於表中所列的上限。應用程式每 400 到 800 IOPS 的佇列深度應至少要有 1。

  • 確保產生 I/O 的執行個體上有足夠的可用 CPU

    如果 VM 執行個體的 CPU 不足,應用程式將無法達到先前所述的 IOPS。我們建議每 2,000 到 2,500 IOPS 的預期流量應要有 1 個可用 CPU。

  • 確保應用程式已經過最佳化,在大型磁碟上有合理的暫時資料本地性

    如果應用程式會在短時間內存取分散在磁碟中不同部分的資料 (每個 vCPU 數百 GB),就無法達到最佳 IOPS。如要獲得最佳效能,請針對暫時資料本地性進行最佳化,要考量的因素包括磁碟片段化和所存取磁碟部分的隨機性。

  • 確保您已根據自己的特定需求設定 OS 中的 I/O 排程器

    在 Linux 系統上,您可以將 I/O 排程器設為 noop,以便在採用 SSD 的裝置上達到最高的 IOPS。

基準化 SSD 永久磁碟效能

下列指令假設您使用裝置大小為 2,500 GB 的 SSD 永久磁碟。如果您的裝置大小不同,請修改 --filesize 引數。必須使用此磁碟大小才能達到 32 vCPU VM 總處理量上限。

    # Install dependencies
    sudo apt-get update
    sudo apt-get install -y fio
  1. 為磁碟填充非零資料。空白區塊與含資料區塊的永久磁碟讀取作業有不同的延遲狀況。建議您執行任何讀取延遲基準前先填充磁碟。

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=fill_disk \
      --filename=/dev/sdb --filesize=2500G \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=128K --iodepth=64 --rw=randwrite
    
  2. 測試寫入頻寬。搭配多個平行串流 (8 個以上) 使用循序寫入,且 I/O 大小為 1MB,I/O 深度則為 64 以上。

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=write --numjobs=8 --offset_increment=100G
    
  3. 測試寫入 IOPS。如要達到永久磁碟 IOPS 上限,請務必維持夠深的 I/O 佇列。舉例來說,如果寫入延遲為 1 毫秒,則針對每項傳輸中的 I/O,VM 最高可達到 1,000 IOPS。如要達到 15,000 IOPS,VM 必須維持至少 15 個傳輸中的 I/O。如果您的磁碟和 VM 能夠達到 30,000 IOPS,則至少要有 30 個傳輸中的 I/O。如果 I/O 大小超過 4 KB,VM 可能會在達到 IOPS 上限前先達到頻寬上限。

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=64 --rw=randwrite
    
  4. 測試寫入延遲。測試 I/O 延遲時,請確保 VM 未達到頻寬或 IOPS 上限,否則觀察到的延遲無法反映出實際的永久磁碟 I/O 延遲狀況。舉例來說,如果 I/O 深度為 30 時會達到 IOPS 上限,且 fio 指令會產生兩倍的值,則總 IOPS 會維持不變,回報的 I/O 延遲時間則會加倍。

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    sudo fio --name=write_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randwrite
    
  5. 測試讀取頻寬。搭配多個平行串流 (8 個以上) 使用循序讀取,且 I/O 大小為 1MB,I/O 深度則為 64 以上。

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=1M --iodepth=64 --rw=read --numjobs=8 --offset_increment=100G
    
  6. 測試讀取 IOPS。如要達到永久磁碟 IOPS 上限,請務必維持夠深的 I/O 佇列。如果 I/O 大小超過 4 KB,VM 可能會在達到 IOPS 上限前先達到頻寬上限。

    sudo fio --name=read_iops_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=64 --rw=randread
    
  7. 測試讀取延遲。請務必為磁碟填充資料,這樣才能測出真實的延遲時間。此外,請確保 VM 在測試期間未達到 IOPS 或總處理量上限,因為永久磁碟達到飽和上限後,就會拒絕連入 I/O,導致 I/O 延遲出現人為增加的情況。

    sudo fio --name=read_latency_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --bs=4K --iodepth=4 --rw=randread
    
  8. 測試循序讀取頻寬。

    sudo fio --name=read_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=read
    
  9. 測試循序寫入頻寬。

    sudo fio --name=write_bandwidth_test \
      --filename=/dev/sdb --filesize=2500G \
      --time_based --ramp_time=2s --runtime=1m \
      --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
      --numjobs=4 --thread --offset_increment=500G \
      --bs=1M --iodepth=64 --rw=write
    

最佳化本機 SSD

各個磁碟類型的效能表說明了本機 SSD 裝置可達到的效能上限。如要最佳化應用程式和 VM 執行個體以達到此速度,請使用下列最佳做法:

針對本機 SSD 使用訪客環境最佳化

根據預設,Compute Engine 提供的 Linux 映像檔大多會自動執行最佳化指令碼,設定執行個體以獲得最佳本機 SSD 效能。該指令碼會啟用特定 queue sysfs 設定以提高機器的整體效能,並為特定虛擬 CPU (vCPU) 套用中斷要求 (IRQ) 遮罩。這個指令碼只會最佳化 Compute Engine 本機 SSD 裝置的效能。

Ubuntu、SLES 和較舊的映像檔可能不包含這類效能最佳化設定。如果您使用任何這些映像檔或比 v20141218 更早的映像檔,您可以安裝訪客環境,改為啟用這些最佳化。

針對 NVMe 或 SCSI 介面選擇最適合的映像檔

本機 SSD 在搭配 NVMe 或 SCSI 介面類型使用時效能最佳,而適合的介面類型取決於您在執行個體的開機磁碟中使用的映像檔。 請為本機 SSD 裝置選擇最適合與您開機磁碟映像檔搭配使用的介面。如果執行個體是使用 SCSI 介面連結至本機 SSD,您可以在訪客 OS 中啟用多佇列 SCSI,以針對 SCSI 介面達到最佳效能。

透過自訂映像檔和本機 SSD 在執行個體上啟用多佇列 SCSI

某些公開映像檔支援多佇列 SCSI。如果待匯入專案的自訂映像檔需要多佇列 SCSI 功能,您必須自行啟用。匯入的 Linux 映像檔必須包含 3.19 以上核心版本才能使用多佇列 SCSI。

如要在自訂映像檔上啟用多佇列 SCSI,請啟用 VIRTIO_SCSI_MULTIQUEUE 訪客 OS 功能並匯入映像檔,然後在 GRUB 設定中新增相關項目:

CentOS

僅適用於 CentOS7。

  1. 使用 API 匯入自訂映像檔,並加入 type 值為 VIRTIO_SCSI_MULTIQUEUEguestOsFeatures 項目。

  2. 使用自訂映像檔建立執行個體,並連接一或多個本機 SSD

  3. 透過安全殼層 (SSH) 連結至您的執行個體

  4. 查看 /sys/module/scsi_mod/parameters/use_blk_mq 檔案的值。

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    如果該檔案的值為 Y,表示匯入的映像檔已啟用多佇列 SCSI。如果該檔案的值為 N,請在 GRUB 設定檔的 GRUB_CMDLINE_LINUX 項目中加入 scsi_mod.use_blk_mq=Y,然後重新啟動系統。

    1. 在文字編輯器中開啟 /etc/default/grub GRUB 設定檔。

      $ sudo vi /etc/default/grub
      
    2. GRUB_CMDLINE_LINUX 項目中新增 scsi_mod.use_blk_mq=Y

      GRUB_CMDLINE_LINUX=" vconsole.keymap=us console=ttyS0,38400n8 vconsole.font=latarcyrheb-sun16 scsi_mod.use_blk_mq=Y"
      
    3. 儲存設定檔。

    4. 執行 grub2-mkconfig 指令來重新產生 GRUB 檔案,然後完成設定。

      $ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      
    5. 重新啟動執行個體。

      $ sudo reboot
      

Ubuntu

  1. 使用 API 匯入自訂映像檔,並加入 type 值為 VIRTIO_SCSI_MULTIQUEUEguestOsFeatures 項目。

  2. 使用自訂映像檔建立執行個體,並使用 SCSI 介面連接一或多個本機 SSD

  3. 透過安全殼層 (SSH) 連結至您的執行個體

  4. 查看 /sys/module/scsi_mod/parameters/use_blk_mq 檔案的值。

    $ cat /sys/module/scsi_mod/parameters/use_blk_mq
    

    如果該檔案的值為 Y,表示匯入的映像檔已啟用多佇列 SCSI。如果該檔案的值為 N,請在 GRUB 設定檔的 GRUB_CMDLINE_LINUX 項目中加入 scsi_mod.use_blk_mq=Y,然後重新啟動系統。

    1. 在文字編輯器中開啟 sudo nano /etc/default/grub GRUB 設定檔。

      $ sudo nano /etc/default/grub
      
    2. GRUB_CMDLINE_LINUX 項目中新增 scsi_mod.use_blk_mq=Y

      GRUB_CMDLINE_LINUX="scsi_mod.use_blk_mq=Y"
      
    3. 儲存設定檔。

    4. 執行 update-grub 指令來重新產生 GRUB 檔案,然後完成設定。

      $ sudo update-grub
      
    5. 重新啟動執行個體。

      $ sudo reboot
      

停用寫入快取清除功能

檔案系統、資料庫和其他應用程式會使用快取清除功能,確保資料在不同檢查點皆可長久保存。對於大部分的儲存裝置而言,這項預設設定很合理。不過在本機 SSD 上,快取清除作業的速度相當緩慢。如要提高部分應用程式的寫入效能,您可以在這些應用程式中停用自動清除指令,或在檔案系統層級停用清除選項。

無論您為檔案系統和應用程式設定的清除指令為何,本機 SSD 一律會在兩秒內清除快取寫入資料,因此即使發生暫時性的硬體錯誤,您最多也只會遺失兩秒的快取寫入資料。永久性的硬體錯誤仍可能會導致裝置上的資料全部遺失,無論資料是否已遭清除皆然,因此您仍應將重要資料備份至永久磁碟Cloud Storage 值區

如要停用 ext4 檔案系統的寫入快取清除功能,請在掛接選項或 /etc/fstab 項目中加入 nobarrier,例如:

$ sudo mount -o discard,defaults,nobarrier /dev/[LOCAL_SSD_ID] /mnt/disks/[MNT_DIR]

其中:[LOCAL_SSD_ID] 是要掛接的本機 SSD 裝置 ID,[MNT_DIR] 則代表您要掛接至哪個目錄。

基準化本機 SSD 效能

效能一節中提供的本機 SSD 效能數據是使用本機 SSD 執行個體的特定設定時達成的。如果您的執行個體無法達到這些效能上限,且執行個體已採用建議的本機 SSD 設定,您可以複製 Compute Engine 小組使用的設定,藉此將您的效能上限與本文所列的上限進行比較。

  1. 為每個裝置建立含有四或八個 vCPU (視工作負載而定) 的本機 SSD 執行個體。舉例來說,如果您想將四個本機 SSD 裝置連接至執行個體,請使用含有 16 或 32 個 vCPU 的機器類型。

    下列指令會建立含有 8 個 vCPU 的虛擬機器和一個本機 SSD:

    gcloud compute instances create ssd-test-instance \
    --machine-type "n1-standard-8" \
    --local-ssd interface="SCSI"
    
  2. 在 VM 上執行下列指令碼。此指令碼所複製的設定,是用來達成在效能一節中 SSD 效能數據的設定。請注意,--bs 參數定義的是區塊大小,會影響不同類型讀寫作業的結果。

    # install dependencies
    sudo apt-get update -y
    sudo apt-get install -y build-essential git libtool gettext autoconf \
    libgconf2-dev libncurses5-dev python-dev fio bison autopoint
    
    # blkdiscard
    git clone https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
    cd util-linux/
    ./autogen.sh
    ./configure --disable-libblkid
    make
    sudo mv blkdiscard /usr/bin/
    sudo blkdiscard /dev/disk/by-id/google-local-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile --size=100G --filesize=100G \
    --filename=/dev/disk/by-id/google-local-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --refill_buffers --end_fsync=1 \
    --iodepth=200 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark --size=100G --runtime=30 \
    --filename=/dev/disk/by-id/google-local-ssd-0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件