關於自動記憶體管理

選取文件版本:

AlloyDB Omni 使用可自動調整的演算法來管理記憶體。

啟動 AlloyDB Omni 時,您可以決定共用緩衝區的上限。如果您未設定上限,AlloyDB Omni 會自動將共用緩衝區備份大小設為系統記憶體的 80%。共用緩衝區的初始備份大小可能與上限不同。

AlloyDB Omni 包含智慧型記憶體工作站,可持續監控記憶體狀態,並調整共用緩衝區備份大小,在快取資料時達到最佳效能。

自動記憶體

根據預設,shared_buffers 參數會設為 0,這個特殊值會將 shared buffers 快取大小上限設為系統記憶體的 80%。AlloyDB Omni 的起價為上限的 10%。shared_buffers如果 shared_buffers 遭自訂值覆寫,AlloyDB Omni 會將該值視為 shared_buffers 大小的上限,並從指定的自訂大小開始。

如要指定自訂大小,請將 shared_buffers 設為 1GB。具體方法會因部署類型而異:

如果是以 Linux 為基礎的安裝作業 (包括 RPM),您可以使用下列任一方法設定 shared_buffers 參數。套用變更後,您必須重新啟動服務。

  • 方法 1:編輯設定檔

    1. 開啟 postgresql.conf 檔案進行編輯。

    2. 新增或修改下列程式碼:

      shared_buffers = 1GB
      
    3. 儲存檔案並重新啟動 AlloyDB Omni 服務:

      sudo systemctl restart alloydbomniMAJOR_VERSION

      MAJOR_VERSION 替換為 AlloyDB Omni 安裝的主要版本,例如 18

  • 方法 2:使用 ALTER SYSTEM 指令

    1. 使用 SQL 用戶端連線至資料庫執行個體。

    2. 執行下列指令:

      ALTER SYSTEM SET shared_buffers = '1GB';
      
    3. 重新啟動 AlloyDB Omni 服務:

      sudo systemctl restart alloydbomniMAJOR_VERSION

      MAJOR_VERSION 替換為 AlloyDB Omni 安裝的主要版本,例如 18

盡可能提高查詢效能

shared_buffers 參數的預設值適用於一般情境。

不過,您可以調整值來獲得最佳成效。如果您選擇依賴 shared_buffers 的預設值來推斷共用緩衝區上限,請使用 cgroup memory.max 值來影響計算。

資料欄引擎記憶體

動態 shared_buffers資料欄引擎記憶體無關。啟用資料欄引擎後,動態 shared_buffers 大小可透過下列方式計算:從系統或 cgroup 可用的總記憶體 80% 中,扣除資料欄引擎使用的記憶體量。

大型分頁

巨頁可提升資料庫效能。AlloyDB Omni 會盡可能明確管理巨頁,否則會依賴作業系統的透明巨頁 (THP) 功能。如果系統不支援任何一種大型分頁類型,AlloyDB Omni 會改用 4k 頁面,並在資料庫記錄中列印警告,以及設定大型分頁的具體操作說明。

警告訊息類似於下列內容:


HINT:  Please manually execute:
          echo within_size | sudo tee /sys/kernel/mm/transparent_hugepage/shmem_enabled
          sudo sysctl -w vm.nr_overcommit_hugepages="$(/usr/bin/awk '/MemTotal/ { printf "%.0f", $2/1024 }' /proc/meminfo)"

在執行階段自動管理記憶體

AlloyDB Omni 會持續監控系統負載,並調整記憶體用量,以提升效能。具體來說,您可能會發現以下情況:

動態 shared_buffers 大小變更
當系統記憶體用量偏低時,AlloyDB Omni 會增加動態 shared_buffers 大小;當系統記憶體用量偏高時,則會減少大小。AlloyDB Omni 發行版本內含 `g_memory` 擴充功能。如要啟用這項功能並監控動態 `shared_buffers` 大小,請執行下列指令:
CREATE EXTENSION IF NOT EXISTS g_memory;
SELECT g_dynamic_shared_size();
系統記憶體極低時終止 PostgreSQL 連線
當 AlloyDB Omni 偵測到系統記憶體嚴重不足時,會嘗試刪除最耗用記憶體的 PostgreSQL 連線,直到負載降回合理程度為止。發生這類事件時,AlloyDB Omni 會在資料庫記錄中記錄類似下列範例的項目:
WARNING: Sending SIGTERM to pid=12345 NSpid=67890 (VA size = 1024MB) (RSS size = 512MB)