Resource Manager

更新时间:2024-04-22 08:31

本文介绍了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]

  • 本页导读 (1)
  • 前提条件
  • 背景信息
  • 原理介绍
  • 内存限制方式
  • 示例
文档反馈