最佳化永久磁碟效能

如果 Compute Engine 執行個體驅動的用量足以達到效能上限,Persistent Disks 就能提供磁碟類型圖表中所述的效能。調整 Persistent Disk 磁碟區大小以符合效能需求後,您可能需要調整工作負載和作業系統。

以下各節說明會影響磁碟效能的運算執行個體和工作負載特徵,並討論可調整的幾個重要元素,以提升效能。部分建議,以及如何將其中一些建議套用至特定類型的工作負載。

影響磁碟效能的因素

以下各節說明影響運算執行個體磁碟效能的因素。

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

運算執行個體的網路輸出上限取決於執行個體的機型。

Compute Engine 會透過多個平行寫入作業將資料儲存在 Persistent Disk,確保內建備援功能。此外,每個寫入要求都有一些額外負荷,會使用額外的寫入頻寬。

運算執行個體可發出的最大寫入流量為網路輸出上限,除以考量複製和額外負荷的頻寬乘數。

如要查看網路輸出上限,請參閱一般用途、運算最佳化、儲存空間最佳化、記憶體最佳化和加速器最佳化機型系列的機型表,並查看「預設輸出頻寬 (Gbps)」欄。

網路用量達到上限時,頻寬乘數約為 1.16 倍,也就是說,寫入的位元組有 16% 是額外負擔。如果是區域永久磁碟,頻寬乘數約為 2.32 倍,以因應額外的複製負擔。

如果永久磁碟讀取和寫入作業與網路輸出頻寬競爭,系統會將機器類型定義的網路輸出頻寬上限的 60% 分配給永久磁碟寫入作業。其餘 40% 則可用於所有其他網路輸出流量。如要進一步瞭解其他網路輸出流量,請參閱「輸出頻寬」。

以下範例說明如何計算 N1 運算執行個體上,永久磁碟的最大寫入頻寬。頻寬分配是指分配給永久磁碟的網路輸出頻寬部分。寫入頻寬上限是經過調整的 Persistent Disk 寫入頻寬上限,已考量額外負荷。

vCPU 數量 網路輸出上限 (MB/秒) 頻寬分配 (MB/秒) 寫入頻寬上限 (MB/秒) 網路使用率達到上限時的寫入頻寬上限 (MB/秒)
1 250 150 216 129
2-7 1,250 750 1,078 647
8-15 2,000 1,200 1,724 1,034
16+ 4,000 2,400 3,448 2,069

您可以使用下列公式計算永久磁碟的最大頻寬:

搭載 1 個 vCPU 的 N1 執行個體

網路輸出上限為:

2 Gbps / 8 位元 = 每秒 0.25 GB = 每秒 250 MB

網路使用率達到上限時,系統會分配以下永久磁碟頻寬:

每秒 250 MB * 0.6 = 每秒 150 MB。

在沒有網路爭用的情況下,永久磁碟的寫入頻寬上限為:

  • 區域磁碟:250 MB/秒 / 1.16 ~= 216 MB/秒
  • 區域性磁碟:每秒 250 MB / 2.32 ~= 每秒 108 MB

網路使用率達到上限時,永久磁碟的寫入頻寬上限為:

  • 可用區磁碟:每秒 150 MB / 1.16 ~= 每秒 129 MB
  • 區域性磁碟:150 MB/秒 / 2.32 ~= 65 MB/秒

網路輸出限制會提供效能上限。 其他因素可能會導致成效低於這個水準。如要瞭解其他效能限制,請參閱下列各節。

同步讀取和寫入

如果是標準永久磁碟,同時讀取和寫入作業會共用相同資源。當運算執行個體使用更多讀取輸送量或 IOPS 時,可執行的寫入次數就會減少。反之,如果執行個體使用較多的寫入輸送量或 IOPS,可執行的讀取次數就會減少。

永久磁碟區無法同時達到讀取和寫入作業的處理量和 IOPS 上限。

處理量的計算方式為 IOPS * I/O size。如要充分運用 SSD 永久磁碟的讀取和寫入作業最大處理量限制,請使用適當的 I/O 大小,確保讀取和寫入 IOPS 總和不會超過 IOPS 限制。

下表列出每個運算執行個體同時讀取和寫入的 IOPS 限制。

標準永久磁碟 SSD 永久磁碟 (8 個 vCPU) SSD 永久磁碟 (32 個以上 vCPU) SSD 永久磁碟 (64 個以上 vCPU)
讀取 寫入 讀取 寫入 讀取 寫入 讀取 寫入
7,500 0 15,000 0 60,000 0 100,000 0
5,625 3,750 11,250 3,750 45,000 15,000 75,000 25,000
3,750 7,500 7,500 7,500 30,000 30,000 50,000 50,000
1875 11,250 3,750 11,250 15,000 45,000 25,000 75,000
0 15,000 0 15,000 0 60,000 0 100,000

本表中的 IOPS 數字是以 8 KB 的 I/O 大小為準。 其他 I/O 大小 (例如 16 KB) 可能會有不同的 IOPS 數量,但讀取和寫入分配情形相同。

下表列出每個執行個體同時讀取和寫入的處理量上限 (每秒 MiB)。

標準永久磁碟 SSD 永久磁碟 (6 至 14 個 vCPU) SSD 永久磁碟 (16 個以上 vCPU)
讀取 寫入 讀取 寫入 讀取 寫入
1200 0 800* 800* 1,200* 1,200*
900 100
600 200
300 300
0 400

* 如果是 SSD 永久磁碟,最大讀取總處理量和最大寫入總處理量互不相干,因此這些限制是固定的。

邏輯磁碟區大小

永久磁碟的大小上限為 64 TiB,您可以在運算執行個體中使用邏輯磁區管理,建立大小上限為 257 TiB 的單一邏輯磁區。磁碟區越大,對效能的影響就越大,原因如下:

  • 並非所有本機檔案系統都能在這樣的規模下運作。常見作業 (例如掛接和檔案系統檢查) 可能會比預期久。
  • 永久磁碟在較小的大小就能達到最高效能。如果單一運算執行個體上的儲存空間這麼大,磁碟需要較長時間才能完全讀取或寫入資料。如果應用程式支援,建議使用多個運算執行個體,以提高系統總輸送量。
  • 如果需要建立大量 Persistent Disk 的快照,完成時間可能會比預期長,而且如果沒有與應用程式仔細協調,邏輯磁碟區的檢視畫面可能會不一致。

連接至單一運算執行個體的多個磁碟

如果將多個磁碟連結至運算執行個體,磁碟的效能限制取決於磁碟類型是否相同。

多個相同類型的磁碟

如果有多個相同類型的磁碟以相同模式 (例如讀寫) 連接至運算執行個體,效能限制與單一磁碟的限制相同,但磁碟大小為這些磁碟的總和。如果所有磁碟的使用率都達到 100%,系統會將匯總效能上限平均分配給各個磁碟,不論磁碟相對大小為何。

舉例來說,假設您有 200 GB pd-standard 磁碟和 1,000 GB pd-standard 磁碟。如果您未使用 1,000 GB 磁碟,200 GB 磁碟的效能上限可達到 1,200 GB 標準磁碟的效能上限。如果兩個磁碟都達到 100% 的使用率,則每個磁碟的效能上限為 600 GB pd-standard 磁碟 (1,200 GB / 2 個磁碟 = 600 GB 磁碟)。

多個不同類型的磁碟

如果將不同類型的磁碟連結至運算執行個體,最高效能會是運算執行個體支援的最快磁碟效能上限。附加磁碟的累積效能不會超過運算執行個體支援的最快磁碟效能上限。

針對 IOPS 或處理量導向的工作負載,最佳化磁碟

效能建議取決於您要盡量提高 IOPS 還是輸送量。

IOPS 導向的工作負載

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

  • 每 400 到 800 個 IOPS 的 I/O 佇列深度值為 1,大型磁碟區的上限為 64

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

  • 如果運算執行個體的機型支援這些磁碟,請使用 Hyperdisk Extreme 或 Hyperdisk Balanced 磁碟,以便變更佈建 IOPS。

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

總處理量導向的工作負載

Hadoop 工作等串流作業可從快速循序讀取中獲益,而較大的 I/O 大小可提升串流效能。

  • 使用 256 KB 以上的 I/O 大小。

  • 如果運算執行個體的機型支援這些磁碟,請使用 Hyperdisk Throughput 或 Hyperdisk Balanced 磁碟,以便變更佈建的輸送量。

  • 如果是標準 Persistent Disk,請盡可能使用 8 個以上的平行循序 I/O 串流。標準永久磁碟的設計宗旨是針對循序磁碟存取作業,盡可能提升 I/O 效能,與實體 HDD 硬碟類似。

  • 請確保應用程式已針對大型磁碟上的合理資料區域性進行最佳化。

    如果應用程式在短時間內存取分布在磁碟不同部分的資料 (每 vCPU 數百 GB),就無法達到最佳 IOPS。為獲得最佳效能,請針對資料區域性進行最佳化,並考量磁碟片段和磁碟存取部分的隨機性等因素。

  • 如果是 SSD 永久磁碟,請務必設定作業系統中的 I/O 排程器,以符合您的特定需求。

    在 Linux 系統上,檢查 I/O 排程器是否設為 none。這個 I/O 排程器不會重新排序要求,非常適合快速隨機 I/O 裝置。

    1. 在指令列中,確認 Linux 電腦使用的 I/O 排程:

      cat /sys/block/sda/queue/scheduler
      

      輸出結果會與下列內容相似:

      [mq-deadline] none
      

      目前啟用的 I/O 排程器會顯示在方括號 ([]) 中。

    2. 如果 I/O 排程器未設為 none,請執行下列其中一個步驟:

      • 如要將預設的 I/O 排程器變更為 none,請在 GRUB 設定檔的 GRUB_CMDLINE_LINUX 項目中設定 elevator=none。這個檔案通常位於 /etc/default/grub,但如果是較早的發行版本,可能位於其他目錄。
      GRUB_CMDLINE_LINUX="elevator=none vconsole.keymap=us console=ttyS0,38400n8 vconsole.font=latarcyrheb-sun16
      

      更新 GRUB 設定檔後,請設定系統的系統啟動載入程式,以便在 Compute Engine 上啟動。

      • 或者,您也可以在執行階段變更 I/O 排程器:
      echo 'none' | sudo tee /sys/block/sda/queue/scheduler
      

      如果使用這個方法,系統會在重新啟動時切換回預設的 I/O 排程器。再次執行 cat 指令,確認 I/O 排程器。

可提升磁碟效能的工作負載變更

某些工作負載行為可提升附加磁碟的 I/O 作業效能。

使用高 I/O 佇列深度

永久磁碟是透過網路連結的裝置,因此延遲時間比本機連結的磁碟 (例如本機 SSD 磁碟) 長。這些磁碟可提供極高的 IOPS 和輸送量,但您必須確保並行完成足夠的 I/O 要求。並行執行的 I/O 要求數量稱為 I/O 佇列深度。

下表列出建議的 I/O 佇列深度,確保您能達到特定效能等級。這些表格會稍微高估一般延遲時間,以便顯示保守的建議。這個範例假設您使用的 I/O 大小為 16 KB。

使用大型 I/O 大小產生足夠的 I/O

  • 使用大型 I/O 大小

    為確保 IOPS 限制和延遲不會成為應用程式效能的瓶頸,請使用至少 256 KB 的 I/O 大小。

    如為分散式檔案系統應用,請使用較大的分段大小。使用大型條帶大小 (4 MB 以上) 的隨機 I/O 工作負載,在標準永久磁碟上可獲得優異效能,因為工作負載與多個循序串流磁碟存取作業的相似度很高。

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

    請確認應用程式產生的 I/O 數量是否足夠,可充分運用磁碟的 IOPS 和輸送量限制。如要進一步瞭解工作負載 I/O 模式,請查看 Cloud Monitoring 中的磁碟用量和效能指標。

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

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

將大量 I/O 負載限制在最大範圍內

範圍是指單一實體磁碟上連續的邏輯區塊位址範圍。如果 I/O 負載量大,且限制在特定最大跨度內,即可達到最高效能。最大跨度取決於磁碟所連線的運算執行個體機器類型,如下表所示。

機型 建議的最大時距
  • m2-megamem-416
  • C2D VM
25 TB
所有其他機器類型 50 TB

如果多個 Persistent Disk 上的範圍加總為 50 TB 以下,就效能而言,可視為單一 50 TB 範圍。

變更作業系統以提升磁碟效能

在某些情況下,您可以在作業系統層級啟用或停用功能,或是以特定方式設定附加磁碟,藉此提升磁碟效能。

避免在 Linux 中使用 ext3 檔案系統

在 Linux 運算執行個體中使用 ext3 檔案系統,可能會導致寫入負載過重時效能不佳。請盡可能使用 ext4。ext4 檔案系統驅動程式可回溯相容於 ext3 和 ext2,並支援掛接 ext3 檔案系統。在大多數 Linux 作業系統上,ext4 檔案系統是預設檔案系統。

如果無法遷移至 ext4,可以暫時使用 data=journal 掛接選項掛接 ext3 檔案系統。這會以寫入輸送量為代價,提升寫入 IOPS。遷移至 ext4 後,部分基準的改善幅度最高可達 7 倍。

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

Persistent Disk 支援捨棄作業或 TRIM 指令,可讓作業系統在區塊不再使用時通知磁碟。作業系統可透過捨棄支援功能,將磁碟區塊標示為不再需要,不必支付將區塊歸零的費用。

在大多數 Linux 作業系統中,您可以在運算執行個體上掛接 Persistent Disk 時啟用捨棄作業。掛接 Persistent Disk 時,Windows Server 2012 R2 計算執行個體預設會啟用捨棄作業。

啟用捨棄作業可提升一般執行階段效能,也能加快首次掛接磁碟時的效能。格式化整個磁碟區可能需要一段時間,因此延遲格式化是常見做法。延遲格式化的缺點是您往往得在首次掛接磁碟區時支付費用。停用延遲初始化並啟用捨棄作業,即可快速格式化及掛接。

  • 將下列參數傳遞至 mkfs.ext4,即可在格式化磁碟時停用延遲初始化,並啟用捨棄作業:

    -E lazy_itable_init=0,lazy_journal_init=0,discard
    

    lazy_journal_init=0 參數不支援含有 CentOS 6 或 RHEL 6 映像檔的執行個體。如果運算執行個體使用這些作業系統,請格式化 Persistent Disk,但不要使用該參數。

    -E lazy_itable_init=0,discard
    
  • 掛接磁碟時,將下列旗標傳遞至 mount 指令,即可啟用捨棄作業:

    -o discard
    

啟用捨棄作業後,永久磁碟就能順利運作。不過,除了使用捨棄作業外,您也可以選擇定期執行 fstrim,或改為執行這項作業。如果您未使用捨棄作業,請在建立開機磁碟快照之前執行 fstrim。修剪檔案系統可建立較小的快照圖片,進而降低快照儲存費用。

調整預讀值

為提升 I/O 效能,作業系統會採用readahead等技術,將比要求更多的檔案讀取到記憶體中,假設後續讀取作業可能會需要這些資料。提高預先讀取量可增加處理量,但會耗用更多記憶體和 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

為 xfs 使用 4 KB 的磁區大小

使用 xfs 格式化磁碟時,預設磁區大小為 512 個位元組。為避免讀取-修改-寫入的負擔,並提升效能,請將磁碟格式化為 4 KB 的磁區大小:

$ sudo mkfs.xfs -s size=4096 /dev/DEVICE_NAME

將 DEVICE_NAME 替換為要格式化的磁碟裝置名稱。例如:sdb。

修改運算執行個體或建立新執行個體

每種機型都有相關限制,可能會影響附加磁碟的效能。這些限制包括:

  • 可用的 vCPU 數量越多,Persistent Disk 的效能就越高。
  • 並非所有機型都支援 Hyperdisk。
  • 網路輸出費率會隨著可用 vCPU 數量增加而提高。

確認有閒置的 CPU

讀取及寫入 Persistent Disk 磁碟區需要運算執行個體的 CPU 週期。如要達到非常高且一致的 IOPS 級別,CPU 必須有空閒時間處理 I/O。

如要增加運算執行個體可用的 vCPU 數量,您可以建立新的運算執行個體,或編輯運算執行個體的機型。

考慮使用 Google Cloud Hyperdisk

如要提高 IOPS 和輸送量,如果機器系列支援 Hyperdisk,建議使用 Hyperdisk 磁碟區,而非永久磁碟。

如要判斷機器系列是否支援 Hyperdisk,請參閱「機器系列支援 Hyperdisk」。

如果執行個體的機器系列支援 Hyperdisk,請按照下列步驟使用 Hyperdisk 磁碟區:

  1. 選擇符合工作負載需求的 Hyperdisk 類型。

  2. 如要切換至所選的 Hyperdisk 類型,請參閱「變更磁碟類型」一節中的操作說明。

變更執行個體的機器系列,藉此提升效能

新一代的機器系列通常會採用較新的 CPU,效能優於前代產品。此外,較新的 CPU 可支援其他功能,提升工作負載效能,例如進階矩陣擴充功能 (AMX) 或 Intel 進階向量擴充功能 (AVX-512)。

後續步驟