一、支持版本
| 内核大版本 | 最早支持版本 |
| 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 依赖 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_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 只终止对应会话的后端进程,不涉及应用侧的重连逻辑。建议应用侧配置连接池和自动重连机制,以便在会话被终止后自动恢复。