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

永久磁碟的價格實惠、效能優異且具可預測性,因此是最常用的儲存空間選項。不過,您可以透過本機 SSD 建立執行個體,以更進一步提高效能及減少延遲,只是這樣就無法享有永久磁碟提供的資料備援功能和資料耐用性。如要為透過執行個體運作的應用程式設定儲存空間選項,請使用下列流程:

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

本文件將討論您可連接到 Compute Engine 執行個體的區塊儲存空間選項。如需完整的 Google Cloud Platform 儲存空間選項清單,請參閱選擇儲存空間選項一文。

區塊儲存空間效能比較

請考慮您的儲存空間大小和效能需求,以便判斷適合您執行個體的正確磁碟類型和大小。特定應用程式的效能需求一般可分成兩種不同的 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 到 1200* 240 到 1200* 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/秒串流讀取 1000 GB 250 GB
串流大型檔案寫入 120 MB/秒串流寫入 1000 GB 250 GB

大小、價格和效能摘要

為應用程式選取磁碟區類型和大小時有許多因素要考量,但您不必考慮磁碟區的使用價格。Persistent Disk 不會針對每次 I/O 產生費用,因此您不需要推估每月 I/O 來計算磁碟方面的預算。

下列價格計算範例使用的是美國的永久磁碟定價。在這些範例中,請只考慮標準永久磁碟相較於 SSD 永久磁碟的相對成本。標準永久磁碟的定價為每 GB $0.040 美元,SSD 永久磁碟的定價則是每 GB $0.170 美元。不過,效能上限會隨著磁碟區大小而提高,因此如果是 IOPS 導向的工作負載,請查看每個 IOPS 的價格。

標準永久磁碟的約略定價為每個隨機讀取 IOPS $0.053 美元和每個隨機寫入 IOPS $0.0266 美元。SSD 永久磁碟的定價為每個隨機讀取 IOPS $0.0057 美元和每個隨機寫入 IOPS $0.0057 美元。針對 SSD 永久磁碟,如果達到執行個體的 IOPS 上限或該執行個體的 vCPU 數量,則每個 IOPS 的價格會有所改變。

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

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

標準永久磁碟

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

如果執行個體有少於 4 個 vCPU,則寫入上限會較低 (尤其是 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
1000 750 1500 1500 120 120
1500 1125 2250 2250 180 180
2048 1536 3072 3072 240 240
4000 3000 6000 6000 240 240
5000 3000 7500 7500 240 240
8192 3000 12288 7500 240 240
10000 3000 15000 7500 240 240
16384 3000 15000 7500 240 240
32768 3000 15000 7500 240 240
65536 3000 15000 7500 240 240

* 上述磁碟區大小僅適用於啟動磁碟區。重要的工作都會用到 I/O 爆發功能。

SSD 永久磁碟

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

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

SSD 永久磁碟效能可線性擴充,直到達到磁碟區上限或各個 Compute Engine 執行個體的上限為止。接近上限的 SSD 讀取頻寬和/或 IOPS 一致性主要取決於網路輸入使用率;預計會有一些變化,尤其是接近 IOPS 上限的 16 KB IO。詳情請見下表內容。

執行個體 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 或更多的 IO 區塊大小。

** 完整 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 1920 1920 1920 30 30
128 3840 3840 3840 61 61
256 7680 7680 7680 122 122
500 15000 15000 15000 240 240
834 25000 25000 25000 400 400
1000 30000 30000 25000 480 400
1334 40000 30000 25000 640 400
1667 50000 30000 25000 800 400
2048 60000 30000 25000 983 400
4096 60000 30000 25000 1200 400
8192 60000 30000 25000 1200 400
16384 60000 30000 25000 1200 400
32768 60000 30000 25000 1200 400
65536 60000 30000 25000 1200 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 上限如下:

下表中的 IOPS 數字是根據 8 KB IO 大小。其他 IO 大小 (例如 16 KB) 可能會有不同的 IOPS 數字,但會有相同的讀取/寫入分布。

標準永久磁碟 SSD 永久磁碟 (8 個 vCPU) SSD 永久磁碟 (32 個以上的 vCPU)
讀取 寫入 讀取 寫入 讀取 寫入
3000 IOPS 0 IOPS 15000 IOPS 0 IOPS 60000 IOPS 0 IOPS
2250 IOPS 3750 IOPS 11250 IOPS 3750 IOPS 45000 IOPS 7500 IOPS
1500 IOPS 7500 IOPS 7500 IOPS 7500 IOPS 30000 IOPS 15000 IOPS
750 IOPS 11250 IOPS 3750 IOPS 11250 IOPS 15000 IOPS 22500 IOPS
0 IOPS 15000 IOPS 0 IOPS 15000 IOPS 0 IOPS 30000 IOPS

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

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

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

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

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

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

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

每個虛擬機器執行個體根據虛擬機器的網路輸出上限,都有一個永久磁碟寫入上限。在永久磁碟與 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 1200 144 86 300
4 240 173 2000 240 173 500
8+ 240 240 2000 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

與區域永久磁碟相似,地區永久磁碟的寫入流量會計入虛擬機器執行個體的累積網路輸出上限。如要計算地區永久磁碟可用的輸出網路,請使用 6.6 做為倍數,而不是用於區域永久磁碟的 3.3。

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

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

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

最佳化永久磁碟

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

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

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

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

在大部分的 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

接著您可以採用以下設定:

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

釋出 CPU

讀取和寫入 Persistent Disk 時需要虛擬機器的 CPU 週期。如要達到高度且一致的 IOPS 等級,則必須釋出 CPU 來處理 I/O。

IOPS 導向的工作負載

SQL 或 NoSQL 資料庫都有隨機存取資料的使用模式。針對 IOPS 導向的工作負載,建議您使用下列做法:

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

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

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

總處理量導向的工作負載

串流作業 (例如 Hadoop 工作) 受惠於快速的循序讀取能力,因此較大的 I/O 可提高串流效能。針對總處理量導向的工作負載,建議您使用 256 KB 或更多的 I/O 大小。

最佳化 SSD 永久磁碟效能

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

  • 確保應用程式發出足夠的 I/O

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

  • 確保發出 I/O 時的平行運作數充足

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

  • 確保發出 I/O 的虛擬機器執行個體上有足夠的可用 CPU

    如果虛擬機器執行個體的 CPU 不足,應用程式將無法達到上述 IOPS。根據經驗法則,每 2000 到 2500 IOPS 的預期流量應要有 1 個可用 CPU。

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

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

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

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

基準化 SSD 永久磁碟效能

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

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

    # Running this command will cause you to lose data 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 will cause you to lose data 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
    
  3. 測試寫入 IOPS。如要達到 PD IOPS 上限,請務必維持夠深的 I/O 佇列。舉例來說,如果寫入延遲為 1 毫秒,則針對每項傳輸中的 I/O,VM 最高可達到 1000 IOPS。如要達到 15,000 IOPS,VM 必須維持至少 15 個傳輸中的 I/O。如果您的磁碟和 VM 能夠達到 30,000 IOPS,則至少要有 30 個傳輸中 I/O。如果 I/O 大小超過 4 KB,VM 可能會在達到 IOPS 上限前先達到頻寬上限。

    # Running this command will cause you to lose data 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 will cause you to lose data 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
    
  6. 測試讀取 IOPS。如要達到 PD 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 裝置應可達到的效能上限。如要最佳化應用程式和虛擬機器執行個體以達到此速度,請使用下列最佳做法:

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

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

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

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

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

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

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

如要在自訂映像檔上啟用多佇列 SCSI,請啟用 VIRTIO_SCSI_MULTIQUEUE 訪客作業系統功能並匯入映像檔,然後在 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。

基準化本機 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. 在機器上執行下列指令碼,複製相關設定來達成此速度。請注意,--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 說明文件