本頁面說明如何在 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_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_writes
、io_combine_limit
和debug_io_direct
設定會自動設定。您可以使用選用的on
/on_unsafe
設定覆寫這些設定。
設定 AlloyDB Omni 的 I/O 加速功能
為資料目錄設定 XFS 檔案系統。使用 XFS 是因為它支援大於頁面大小的檔案系統區塊大小。AlloyDB Omni 可以使用 XFS,以完整
RWF_ATOMIC
支援功能,以原子方式寫入 8 KiB 區塊。建立區塊大小為 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_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
可能會發生記憶體配置問題。