16 KB 永久磁碟和 MySQL 的最佳做法

本文件說明如何使用 16 KB實體區塊大小的永久磁碟來改善 MySQL 資料庫效能。

一般來說,停用 InnoDB doublewrite 緩衝區有利於寫入密集的 MySQL 工作負載。MySQL 的 InnoDB 能在中途分頁清除程序期間執行 doublewrite,以便復原可能出現的損毀頁。

不過,如果有端對端 16 KB 整體寫入路徑,能用以確保 16 KB 資料頁面不會部分認可到磁碟或損毀寫入作業,就不需要執行 doublewrite。基本上如果停用 doublewrite,資料庫的中途頁面清除功能就會加倍,藉此降低資料庫進入同步清除狀態的頻率,這樣一來就能達到更穩定甚至更高的效能。

事前準備

建構從資料庫到區塊裝置的 16 KB 整體寫入路徑

您可以利用 16 KB 永久磁碟,建構從資料庫到區塊裝置的端對端 16 KB 整體寫入路徑,這樣就能放心停用 MySQL/InnoDB 中的重複寫入 (doublewrite) 功能,進而讓寫入密集負載達到更好、更穩定的效能。

透過 Google Cloud Platform 主控台gcloud 工具API 建立和連結永久磁碟。

  1. 建立 16 KB 區塊大小永久磁碟並連結到您的 VM。16 KB 永久磁碟能在實體區塊層級提供不可部分完成的 16 KB 寫入能力。建議您將 MySQL 執行個體設為只將資料檔案儲存到 16 KB 永久磁碟 (非必要設定,請自行決定是否採用)。請將記錄檔 (尤其是重做記錄檔和 binlog) 儲存到連結至同一個 VM 的 4 KB 永久磁碟。這能確保記錄檔的寫入作業維持高效能,因為將小型記錄檔寫入 16 KB 永久磁碟的可能會觸發讀取-修改-寫入程序,反而會降低速度。

  2. 透過 BigAlloc 選項來格式化使用 ext4 檔案系統的 16 KB 磁碟,並將叢集大小設為 16 KB。以下例子是指定 BigAlloc 選項的 mkfs 指令:

    mkfs.ext4 -O bigalloc -C 16384 [...other options…]
    

    使用叢集大小設為 16 KB 的 BigAlloc,確保檔案系統能根據磁碟的 16 KB 邊界來分配檔案。

  3. 建立 VM 執行個體時,請從 cos-cloud 專案中的 Google Container-Optimized OS 映像檔系列選擇 OS 映像檔。

    使用 gcloud 指令查看所有可用 cos 映像檔的清單:

    gcloud compute images list --project cos-cloud --no-standard-images
    

    選取版本 67 或更高版本。如要獲得更好的效能,建議您從 cos-stable 系列選擇映像檔。

    選擇 cos 映像檔可確保寫入作業不會在檔案系統和實體區塊裝置層級之間,按層級不當分割到多個 16 KB 邊界。cos 映像檔資格認證程序具有內建測試,可避免發生上述結果。

  4. 確保在 OS 中已正確設定 max_segmentsmax_sectors_kb

    max_segments >= max_sectors_kb/4
    

    所有 Google Compute Engine VM 都已經設定好這兩個變數,如果您的指令碼在 VM 建立後並未變更這兩個變數,代表這裡不需要執行任何操作。

    您可以按照以下路徑來查詢 OS 中的這兩個常數。

    /sys/block/sd<drive letter>/queue/
    
  5. InnoDB 設為使用 O_DIRECT。在 innodb_flush_method 資料庫中設定 (或新增) O_DIRECT

現在您可以放心關閉 innodb_doublewrite 選項

除了這個方式,還有其他做法能讓您使用 16 KB 區塊裝置,以確保端對端 16 KB 整體寫入。舉例來說,如果您將資料庫設為直接使用區塊裝置當做原始裝置,而不使用檔案系統,則您可略過以上描述檔案系統設定的相關步驟。

後續步驟

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

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

這個網頁
Compute Engine 說明文件