使用 I/O 加速功能提升 AlloyDB Omni 效能

選取說明文件版本:

本頁面說明如何在 AlloyDB Omni 中啟用一組 I/O 加速功能,藉此提升運算和 I/O 資源的使用率,進而加快工作負載和查詢效能。

包括下列功能:

  • 撕開寫入保護貼紙
  • O_DIRECT 支援
  • 非同步 I/O (AIO)
  • 串流讀取

如要啟用這些 I/O 加速功能,請啟用alloydb_omni_atomic「大一統設定 (GUC)」,並設定 AlloyDB Omni,使其能夠使用 GUC。

I/O 加速功能

以下各節說明 alloydb_omni_atomic GUC 啟用的 I/O 加速功能。

撕開寫入保護貼紙

啟用 alloydb_omni_atomic 設定後,系統會關閉整頁寫入,避免產生整頁圖片以供記錄,進而降低效能負擔。

支援 O_DIRECT

O_DIRECT 支援是自動寫入作業的前置條件。O_DIRECT 適用於 PostgreSQL 資料目錄和 AlloyDB Omni 磁碟快取。詳情請參閱「使用磁碟快取提升資料庫效能」。

O_DIRECT 也具備下列優點:

  • 使用 O_DIRECT 可避免 PostgreSQL 中的雙重緩衝區問題。PostgreSQL 會管理自己的緩衝區快取,並略過作業系統核心緩衝區快取。
  • O_DIRECT 可減少作業系統 CPU 和記憶體負擔,維持核心緩衝區快取。

非同步 I/O

alloydb_omni_atomic 設定使用 io_uringlibaio 程式庫提供非同步 I/O (AIO) 功能。建議您使用 io_uring,以免受到舊版 libaio 程式庫的限制。如果系統未偵測到 io_uring 支援,AlloyDB Omni 會改用 libaio。這種做法可克服緩衝 I/O 的優點 (例如預先讀取和寫入合併) 損失,並確保基礎提供的儲存空間可用的 I/O 頻寬達到最大值。

串流讀取

AlloyDB Omni 使用串流讀取,類似於 PostgreSQL 17 的功能,可透過向量化 I/O 將多個區塊讀取至緩衝區快取,進而提升循序掃描、ANALYZEpg_prewarm 的效能。向量式 I/O 是一種方法,單一程序呼叫可從多個緩衝區預先擷取資料,藉此減少內容切換和系統呼叫,進而提升效率。

AlloyDB Omni 擴充支援功能,可使用串流讀取功能,從 AlloyDB Omni 磁碟快取讀取資料,並使用 AIO 提升讀取效能。這種做法可讓查詢從儲存空間將緩衝區有效讀取至共用記憶體集區,而不必在每次需要時從儲存空間讀取這些區塊。

事前準備

  1. 檢查作業系統和檔案系統支援。

    1. 如要確保核心支援 RWF_ATOMIC,請檢查核心版本。在下列範例中,您會使用執行 Linux 6.14 核心的 Ubuntu 24.10 機器,該核心支援不可分割的寫入作業

      > sudo hostnamectl
       ...
       Operating System: Ubuntu 24.10
            Kernel: Linux 6.14.0-061400rc5-generic
      ...
      
    2. 如果核心不支援 RWF_ATOMIC,建議您更新至支援 RWF_ATOMIC 的核心版本。

  2. 如要使用 AlloyDB Omni I/O 加速功能,測試因防止寫入撕裂而帶來的效能提升,請啟用「alloydb_omni_atomic Grand Unification Configuration (GUC)」。如要使用這項 GUC,您必須具備支援的 Kernel 和檔案系統,提供不可分割的 I/O 並防止寫入中斷。

    RWF_ATOMIC 旗標用於支援原子寫入。根據預設,系統會在啟動時檢查 RWF_ATOMIC 的相容性。如果無法確認使用 RWF_ATOMIC 標記的不可分割寫入作業,PostgreSQL 就無法啟動。

    您可以覆寫這項預設行為,但建議使用支援的平台和 force 選項,以免不小心覆寫最佳設定。

    您可以使用 force_unsafe 選項覆寫 RWF_ATOMIC 相容性檢查,但這樣做無法保證資料安全。除非您在無法升級的環境中評估 AlloyDB Omni,否則建議不要使用這個選項,以免無法使用適當的 Kernel 和檔案系統。

    下表列出 alloydb_omni_atomic 設定和對應的相容性檢查。

    alloydb_omni_atomic 啟動相容性檢查 說明
    off
    不適用 這個值會關閉原子模式。這項功能已停用。
    force
    執行啟動相容性檢查。如果 RWF_ATOMIC 寫入失敗,則無法啟動。 設定原子模式設定。
    force_unsafe
    不會執行啟動相容性檢查。如果 RWF_ATOMIC 寫入失敗,系統會傳回警告,但會繼續執行。 設定原子模式設定。

    force/force_unsafe 設定中,full_page_writesio_combine_limitdebug_io_direct 設定會自動設定。您可以使用選用的 on/on_unsafe 設定覆寫這些設定。

設定 AlloyDB Omni 的 I/O 加速功能

  1. 為資料目錄設定 XFS 檔案系統。使用 XFS 是因為它支援大於頁面大小的檔案系統區塊大小。AlloyDB Omni 可以使用 XFS,以完整 RWF_ATOMIC 支援功能,以原子方式寫入 8 KiB 區塊。

    1. 建立區塊大小為 8KiB 的 XFS 檔案系統,並掛接至所需的資料目錄 (DATA_DIR) 位置。

      sudo mkfs.xfs -f -b size=8k /dev/$DEVICE
      sudo mount /dev/$DEVICE DATA_DIR
      

      請進行下列替換:

      • DATA_DIR:資料目錄位置。
    2. 查看核心記錄,確認是否使用 8k 區塊:

      > sudo journalctl -f
      ...
      kernel: XFS (sdc): EXPERIMENTAL large block size feature enabled.  Use at your own risk!
      kernel: XFS (sdc): Mounting V5 Filesystem 350aa26a-7555-4566-94c1-74e54ddc9250
      ...
      
  2. 選用:設定 AlloyDB Omni 磁碟快取。

    使用下列範例,透過 ext4, 建立檔案系統,然後掛接檔案系統。

    sudo /sbin/mkfs.ext4 -m 1 -F -E lazy_itable_init=0,lazy_journal_init=0 /dev/DEVICE
    sudo mount --make-shared -o noatime,discard,errors=panic /dev/DEVICE /OMNI_DISK_CACHE_DIRECTORY
    

    請進行下列替換:

    • DEVICE:應用程式與這個實體互動,以執行 I/O 作業 (讀取或寫入資料)。

    如果主要儲存空間無法提供更高的每秒輸入/輸出作業數 (IOPS),建議您設定 AlloyDB Omni 磁碟快取,確保 AlloyDB Omni I/O 加速功能發揮最佳效能。詳情請參閱「使用磁碟快取提升資料庫效能」。

  3. 下載並執行 AlloyDB Omni。

    1. 下載最新的 AlloyDB Omni Docker 容器。詳情請參閱「在 VM 上安裝 AlloyDB Omni」。
    2. 如要使用磁碟快取,請按照「使用磁碟快取提升資料庫效能」一文的說明操作。
    3. 如要允許 io_uring,請新增其他引數: --security-opts="seccomp:unconfined"

      docker run -d --name CONTAINER_NAME \
         -e POSTGRES_PASSWORD=NEW_PASSWORD \
         -v DATA_DIR:/var/lib/postgresql/data \
         -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \  # Only if disk cache is enabled
         -p HOST_PORT:5432 \
         --security-opts="seccomp:unconfined" \
         --restart=always \
         google/alloydbomni:16
      

      請將下列項目改為對應的值:

      • CONTAINER_NAME:主機容器登錄檔中的 AlloyDB Omni 容器名稱。
      • NEW_PASSWORD:指派給容器 PostgreSQL 使用者的密碼。
      • DATA_DIR:資料目錄位置。
      • CACHE_DIRECTORY_PATH_INSIDE_CONTAINER:容器內的磁碟快取目錄路徑。
      • HOST_PORT:主機上的 TCP 通訊埠,容器應將自己的通訊埠 5432 發布至該通訊埠。
  4. 設定 AlloyDB Omni 使用不可分割的 I/O。

    alloydb_omni_atomic GUC 設為適當值,然後重新啟動容器。

    alter system set alloydb_omni_atomic='force';
    sudo docker restart CONTAINER_NAME;
    

    請將下列項目改為對應的值:

    • CONTAINER_NAME:主機容器登錄檔中的 AlloyDB Omni 容器名稱。

限制

  • PostgreSQL 16 包含執行單一區塊 I/O 的路徑,這會O_DIRECT減緩速度。資料庫復原 (重做路徑)、清除掃描和 Omni 磁碟快取預熱期間,讀取速度可能會較慢。
  • 預先發布版不支援唯讀備用資源中的 AlloyDB Omni I/O 加速功能。
  • 在大量工作負載下,ARM 架構系統可能會因架構差異而效能較低。
  • 由於工作負載增加時會受到限制,libaio 容易發生資源無法使用的情況。如果可用系統記憶體不足,io_uring 可能會發生記憶體配置問題。