本頁面說明如何在 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 擴大支援範圍,可使用串流讀取功能,從 AlloyDB Omni 磁碟快取讀取資料,並透過 AIO 提升讀取效能。 這種做法可讓查詢從儲存空間將緩衝區有效預先讀取至共用記憶體集區,而不必在每次需要時從儲存空間讀取這些區塊。
事前準備
檢查作業系統和檔案系統支援。
如要確保核心支援
RWF_ATOMIC,請檢查核心版本。在下列範例中,您使用執行 Linux 6.14 核心的 Ubuntu 24.10 機器,該核心支援不可分割寫入。> sudo hostnamectl ... Operating System: Ubuntu 24.10 Kernel: Linux 6.14.0-061400rc5-generic ...如果核心不支援
RWF_ATOMIC,建議您更新至支援RWF_ATOMIC的核心版本。
如要使用 AlloyDB Omni I/O 加速功能測試效能提升幅度,並啟用損毀寫入防護機制,請啟用
alloydb_omni_atomicGrand 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_writes、io_combine_limit和debug_io_direct設定會自動設定。您可以使用選用的on/on_unsafe設定覆寫這些設定。
設定 AlloyDB Omni I/O 加速功能
為資料目錄設定 XFS 檔案系統。使用 XFS 是因為它支援大於頁面大小的檔案系統區塊大小。AlloyDB Omni 可以使用 XFS,以完整的
RWF_ATOMIC支援,不可分割地寫入 8KiB 區塊。建立區塊大小為 8KiB 的 XFS 檔案系統,並掛接至所需的資料目錄 (
DATA_DIR) 位置。sudo mkfs.xfs -f -b size=8k /dev/$DEVICE sudo mount /dev/$DEVICE DATA_DIR
請進行下列替換:
DATA_DIR:資料目錄位置。
檢查核心記錄,確認是否使用 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 ...
選用:設定 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 加速功能的最佳效能。詳情請參閱「使用磁碟快取提升資料庫效能」。
下載並執行 AlloyDB Omni。
- 下載最新的 AlloyDB Omni Docker 容器。詳情請參閱「在 VM 上安裝 AlloyDB Omni」。
- 如要使用磁碟快取,請按照「使用磁碟快取提升資料庫效能」一文的說明操作。
如要允許
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 發布至該通訊埠。
設定 AlloyDB Omni 使用不可分割的 I/O。
將
alloydb_omni_atomicGUC 設為適當值,然後重新啟動容器。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可能會發生記憶體配置問題。