全部產品
Search
文件中心

PolarDB:Resource Manager

更新時間:Jul 06, 2024

本文介紹了PolarDB PostgreSQL版的Resource Manager功能。

前提條件

支援的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 14(核心小版本14.5.1.0及以上)

  • PostgreSQL 11(核心小版本1.1.1及以上)

說明

您可通過如下語句查看PolarDB PostgreSQL版的核心小版本的版本號碼:

  • PostgreSQL 14

    select version();
  • PostgreSQL 11

    show polar_version;

背景資訊

PolarDB PostgreSQL版的記憶體可以分為以下三部分:

  • 共用記憶體

  • 進程間動態共用記憶體

  • 進程私人記憶體

進程間動態共用記憶體和進程私人記憶體是動態分配的,其使用量隨著叢集承載的業務運行情況而不斷變化。過多使用動態記憶體,可能會導致記憶體使用量量超過作業系統限制,觸發核心記憶體限制機制,造成叢集進程異常退出,叢集重啟,引發叢集停用問題。

進程私人記憶體MemoryContext管理的記憶體可以分為以下兩部分:

  • 工作計算地區記憶體:業務運行所需的記憶體,此部分記憶體會影響業務的正常運行。

  • Cache記憶體:資料庫會將部分內部中繼資料存放在進程內,此部分記憶體只會影響資料庫效能。

為瞭解決以上問題,PolarDB PostgreSQL版增加了Resource Manager資源限制機制,能夠在叢集運行期間,周期性的檢測資源使用方式。對於超過資源限制閾值的進程,強制進行資源限制,降低叢集停用風險。

Resource Manager主要的限制資源有:記憶體、CPU、I/O。當前僅支援對記憶體資源進行限制。

原理介紹

記憶體限制依賴Cgroup,如果不存在Cgroup,則無法有效進行資源限制。Resource Manager作為PolarDB PostgreSQL版的一個後台輔助進程,會周期性讀取Cgroup的記憶體使用量資料作為記憶體限制的依據。當發現存在進程超過記憶體限制閾值後,Resource Manager會讀取核心的使用者進程記憶體記賬,按照記憶體大小排序,依次對記憶體使用量量超過閾值的進程發送中斷進程訊號(SIGTERM)或取消操作訊號(SIGINT)。

記憶體限制方式

Resource Manager守護進程會隨著叢集啟動而建立,同時對RW、RO以及Standby節點起作用。可以通過修改以下參數改變Resource Manager的行為。

當前Resource Manager限制記憶體的方式為:在叢集記憶體使用量超過Resource Manager參數設定的記憶體水位線後,會對使用記憶體較多的進程發送SIGTERM訊號,終止進程以釋放記憶體。具體參數說明如下:

參數

說明

enable_resource_manager

是否啟動Resource Manager。預設值為on,取值如下:

  • on:啟動Resource Manager。

  • off:不啟動Resource Manager。

stat_interval

資源使用量周期檢測的間隔。單位為毫秒,取值範圍為10~10000,預設值為500。

total_mem_limit_rate

限制叢集記憶體使用量的百分比,當叢集記憶體使用量超過該百分比後,開始強制對記憶體資源進行限制,預設值為95。

total_mem_limit_remain_size

叢集記憶體預留值,當叢集空閑記憶體小於預留值後,開始強制對記憶體資源進行限制,單位為KB,取值範圍為131072~MAX_KILOBYTES(整型數值最大值),預設值為524288。

mem_release_policy

記憶體資源限制的策略。取值如下:

  • none:無動作。

  • default:預設策略(預設值),優先中斷空閑進程,然後中斷活躍進程。

  • cancel_query:中斷活躍進程。

  • terminate_idle_backend:中斷空閑進程。

  • terminate_any_backend:中斷所有進程。

  • terminate_random_backend:中斷隨機進程。

樣本

當使用者會話進程接收到SIGTERM訊號後,會終止當前進程,並將終止資訊寫入到日誌中。日誌內容如下:

2022-11-28 14:07:56.929 UTC [18179] LOG:  [polar_resource_manager] terminate process 13461 release memory 65434123 bytes
2022-11-28 14:08:17.143 UTC [35472] FATAL:  terminating connection due to out of memory
2022-11-28 14:08:17.143 UTC [35472] BACKTRACE:
        postgres: primary: postgres postgres [local] idle(ProcessInterrupts+0x34c) [0xae5fda]
        postgres: primary: postgres postgres [local] idle(ProcessClientReadInterrupt+0x3a) [0xae1ad6]
        postgres: primary: postgres postgres [local] idle(secure_read+0x209) [0x8c9070]
        postgres: primary: postgres postgres [local] idle() [0x8d4565]
        postgres: primary: postgres postgres [local] idle(pq_getbyte+0x30) [0x8d4613]
        postgres: primary: postgres postgres [local] idle() [0xae1861]
        postgres: primary: postgres postgres [local] idle() [0xae1a83]
        postgres: primary: postgres postgres [local] idle(PostgresMain+0x8df) [0xae7949]
        postgres: primary: postgres postgres [local] idle() [0x9f4c4c]
        postgres: primary: postgres postgres [local] idle() [0x9f440c]
        postgres: primary: postgres postgres [local] idle() [0x9ef963]
        postgres: primary: postgres postgres [local] idle(PostmasterMain+0x1321) [0x9ef18a]
        postgres: primary: postgres postgres [local] idle() [0x8dc1f6]
        /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f888afff445]
        postgres: primary: postgres postgres [local] idle() [0x49d209]