tencent cloud

云数据库 PostgreSQL

高内存会话或长事务自动 Kill

Download
聚焦模式
字号
最后更新时间: 2026-08-12 11:22:11
本文为您介绍云数据库 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_ageautovacuum_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)

配置参数

登录 云数据库 PostgreSQL 控制台,进入实例管理页,在参数设置中分别配置以下两个参数:
参数说明:
参数名
类型
默认值
取值范围
说明
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_intervaltencentdb_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_agetencentdb_system_stat.* 系列参数均不支持会话级 SET 命令修改,请在腾讯云控制台参数设置页面进行操作。

Q:被 Kill 的会话能否自动重连?

A:自动 Kill 只终止对应会话的后端进程,不涉及应用侧的重连逻辑。建议应用侧配置连接池和自动重连机制,以便在会话被终止后自动恢复。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈