为什么Postgres空闲事务没有终止?

问题描述 投票:0回答:2

我有一个长时间运行的空闲查询,该查询不会自动终止。

我已将两个最大超时设置为 2 小时(我知道很长)

> select name,setting from pg_settings where name='statement_timeout' OR name='idle_in_transaction_session_timeout';

                name                 | setting
-------------------------------------+---------
 idle_in_transaction_session_timeout | 7200000
 statement_timeout                   | 7200000

但是我有这个

idle
查询(不是
idle_in_transaction
),它是崩溃的应用程序留下的

> SELECT pid, age(clock_timestamp(), query_start), state, usename, query
FROM pg_stat_activity
WHERE  query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;

17117 | 02:11:40.795487 | idle  | ms1-user | select distinct ....

在 AWS Aurora 上运行的 Postgres 11.13

任何人都可以解释为什么/缺少什么吗?

postgresql amazon-web-services transactions
2个回答
1
投票

顾名思义,

idle_in_transaction_session_timeout
不会终止空闲会话,而是终止“事务中空闲”的会话。对于后者,您可以使用 PostgreSQL v14 中引入的
idle_session_timeout

就您而言,问题出在 TCP keepalive 设置上。使用 Linux 上的默认 keepalive 设置,服务器需要大约 2 小时 14.5 分钟才能确定连接的另一端不再存在。所以再等几分钟:^)

如果您想减少时间,您可以设置 PostgreSQL 参数

tcp_keepalives_idle
tcp_keepalives_interval
tcp_keepalives_count
(如果 Amazon 允许)。如果他们不这样做,请投诉。


0
投票

我建议你使用像 pgbouncer 这样的数据库池并制作

pool_mode=transaction
了解更多详情 https://www.pgbouncer.org/features.html

如何安装 https://medium.com/swlh/pgbouncer-installation-configuration-and-use-cases-for-better-performance-1806316f3a22

© www.soinside.com 2019 - 2024. All rights reserved.