使用 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_uring 和 libaio 程式庫,提供非同步 I/O (AIO) 功能。建議您使用 io_uring,避免舊版 libaio 程式庫的限制。如果未偵測到 io_uring 支援,AlloyDB Omni 會改用 libaio。這種做法可克服緩衝 I/O 優勢的損失,例如預先讀取和寫入合併,同時確保基礎提供的儲存空間可用的 I/O 頻寬達到最大值。

串流讀取

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

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

事前準備

  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,否則不建議使用這個選項。

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

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

    在 force/force_unsafe 設定中,系統會自動設定 full_page_writes、 io_combine_limit 和 debug_io_direct 設定。您可以使用選用的 on/on_unsafe 設定覆寫這些設定。

設定 AlloyDB Omni I/O 加速功能

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

    1. 建立區塊大小為 8 KiB 的 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 可能會發生記憶體配置問題。