本文为您介绍云数据库 PostgreSQL 的内核功能:高内存会话/长事务自动 Kill。
支持版本
内核大版本 | 最早支持版本 |
PostgreSQL 14 | v14.19_r1.38及以上 |
PostgreSQL 15 | v15.14_r1.23及以上 |
PostgreSQL 16 | v16.10_r1.18及以上 |
PostgreSQL 17 | v17.6_r1.12及以上 |
PostgreSQL 18 | v18.1_r1.2及以上 |
说明:
您可在控制台实例详情页或执行
SHOW tencentdb_version; 查看当前实例的内核版本。功能概述
云数据库 PostgreSQL 支持两种会话自动终止能力,帮助您在以下场景中无需人工介入即可自动回收异常会话:
长事务自动 Kill:当事务年龄超过设定阈值时,autovacuum 在启动时会自动终止持有过老事务的会话,避免 XID 耗尽风险。
高内存会话自动 Kill:当某个会话的内存占用超过设定阈值时,后台进程会定期扫描并自动终止该会话,避免因单会话内存暴涨导致实例 OOM。
配置参数
登录 云数据库 PostgreSQL 控制台,进入实例管理页,在参数设置中搜索参数
tencentdb_auto_kill_xact_max_age,修改为目标值并保存。参数修改后通过配置热加载(reload)生效,无需重启实例。参数说明:
参数名 | 类型 | 默认值 | 取值范围 | 说明 |
tencentdb_auto_kill_xact_max_age | integer | 2000000000 | [100000, 2000000000] | 自动 Kill 的 XID 年龄阈值。值为2000000000时表示关闭该功能。实际触发阈值取 max(此值, autovacuum_freeze_max_age)。 |
配置建议
建议将
tencentdb_auto_kill_xact_max_age 与 autovacuum_freeze_max_age 设置为相同值(如200000000),让自动 Kill 与 VACUUM 冻结在同一水位线协同工作。如果您希望比
autovacuum_freeze_max_age 更早触发 Kill,需同时调低 autovacuum_freeze_max_age——实际触发阈值不会低于该值。验证效果
设置参数后,您可以通过以下方式验证功能是否生效:
1. 降低阈值为便于测试的值(如100000),然后在某会话中执行一个长事务(如包含
pg_sleep 的 INSERT)。2. 通过 pgbench 生成大量短事务使 XID 计数器快速增长,超过阈值。
3. 等待 autovacuum worker 启动后,长事务会话将被自动终止。可通过
pg_stat_activity 确认该会话已消失。4. 查看数据库日志,可看到如下记录:
autovacuum kill old transaction, sending SIGTERM to PID <PID>, xmin is <XMIN>, xid is <XID>
高内存会话自动 Kill
环境准备
高内存会话自动 Kill 依赖
tencentdb_system_stat 扩展,需要完成以下两步配置:步骤一:加载共享库
登录 云数据库 PostgreSQL 控制台,进入实例管理页,在参数设置中搜索参数
shared_preload_libraries,将 tencentdb_system_stat 添加到值中(多个值以逗号分隔),保存后重启实例生效。步骤二:确认扩展可用
实例重启后,执行以下命令确认扩展已加载:
postgres=> SHOW shared_preload_libraries;shared_preload_libraries--------------------------------------pg_stat_statements,tencentdb_system_stat(1 row)
配置参数
参数说明:
参数名 | 类型 | 默认值 | 取值范围 | 说明 |
tencentdb_system_stat.max_process_memory_limit | integer (MB) | 10000000 | [100, 10000000] | 单个会话允许的最大内存使用量。值为10000000(约10TB)时表示关闭该功能。 |
tencentdb_system_stat.check_process_memory_interval | integer (ms) | 5000 | [100, 2147483] | 内存检查间隔,即每间隔多少毫秒扫描一次所有会话的内存使用量。 |
配置建议
建议根据业务 SQL 内存消耗基线设置
max_process_memory_limit,例如 OLTP 场景可设为1 ~ 2GB(1024 ~ 2048),OLAP 场景可适度放宽。检查间隔建议保持默认值5000ms(5秒),该频率在响应速度与系统开销之间取得平衡,5秒内瞬时内存峰值通常可自然回落。
功能开启后,后台 worker 会定期通过
/proc 文件系统读取会话的 RSS(驻留内存)指标,超过阈值的会话将被发送 SIGTERM 信号终止(效果等价于 pg_terminate_backend)。保护机制
以下类型的会话不会被自动 Kill:
SUPERUSER 会话:以
postgres 用户身份运行的会话不会被自动 Kill。后台进程:autovacuum worker、WAL writer、checkpointer 等数据库内部后台进程不会被自动 Kill。
验证效果
配置完成后,您可以通过以下方式验证功能生效:
1. 执行一个会分配大量内存的查询或操作,使单个会话内存占用超过
max_process_memory_limit 阈值。2. 在下一个检查周期(默认5秒内),该会话将被自动终止。
3. 查看数据库日志,可看到如下记录:
Kill process <PID>, memory usage <bytes> bytes exceed max_allowed_bytes <bytes>kill process <PID> success
常见问题
Q:为什么设置了 tencentdb_auto_kill_xact_max_age 但长事务没有被 Kill?
A:请检查以下条件:
autovacuum 是否为 on。长事务自动 Kill 依赖 autovacuum worker 调度,若 autovacuum 关闭则不会触发。实际触发阈值取
max(tencentdb_auto_kill_xact_max_age, autovacuum_freeze_max_age),如果您设置的值比 autovacuum_freeze_max_age 小,实际生效的仍是后者的值。建议两参数保持一致。Q:高内存自动 Kill 参数修改后为何没有立即生效?
A:
tencentdb_system_stat.check_process_memory_interval 和 tencentdb_system_stat.max_process_memory_limit 均为 SIGHUP 级别参数,通过 pg_reload_conf() 或控制台保存后即可生效,无需重启实例。确保 shared_preload_libraries 中已包含 tencentdb_system_stat(该参数修改需重启)。Q:能否通过 SQL 直接 SET 这些参数?
A:
tencentdb_auto_kill_xact_max_age 和 tencentdb_system_stat.* 系列参数均不支持会话级 SET 命令修改,请在腾讯云控制台参数设置页面进行操作。Q:被 Kill 的会话能否自动重连?
A:自动 Kill 只终止对应会话的后端进程,不涉及应用侧的重连逻辑。建议应用侧配置连接池和自动重连机制,以便在会话被终止后自动恢复。