PgBouncer 和空闲连接

PgBouncer and idle connections

我正在尝试扩展我的基础架构。

有一个 Php 7.4 应用程序使用持久连接。

有一个应用程序使用默认参数连接到的 PgBouncer。

/pgbouncer.ini

[databases]
XXXXXXX

[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 4040
unix_socket_dir =
user = postgres
auth_file = /etc/pgbouncer/userlist.txt
auth_type = md5
ignore_startup_parameters = extra_float_digits
logfile = /var/log/pgbouncer/pgbouncer.log
# Log settings
admin_users = postgres

以及云环境中的标准 PostgreSQL。

我遇到了一个 st运行ge 问题,当我用 50 个用户对应用程序进行负载测试时(我目前正在开发环境中的小型服务器上进行测试)很多人都面临这个错误:

pg_query(): Query failed: ERROR: query_wait_timeout server closed the connection unexpectedly 

事实上,当我在 PgBouncer 中使用 SHOW POOLS 时,它显示的是:

       database       |         user         | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us | pool_mode
----------------------+----------------------+-----------+------------+-----------+---------+---------+-----------+----------+---------+------------+-----------
 XXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXX |        20 |         31 |        20 |       0 |       0 |         0 |        0 |     120 |     106966 | session
 pgbouncer            | pgbouncer            |         1 |          0 |         0 |       0 |       0 |         0 |        0 |       0 |          0 | statement

这解释了错误,因为等待的客户太多。但有趣的是,在同一时间(可以肯定的是多次)我 运行 在目标 PostgreSQL 上进行以下查询:

SELECT *
FROM pg_stat_activity
ORDER BY pid desc;

我看到的是一堆空闲的客户端,有时其中一个/两个/三个显示为活跃的处理查询...!我希望所有 20 个客户端都能为所有等待的 PgBouncer 客户端提供服务..

(空闲的在激活之前保持空闲 10 到 20 秒)

此外,重要的是要提到所有服务器都处于 30% CPU 20% RAM 所以,这似乎(?)这不是资源问题。

知道哪里出了问题吗?我觉得有些不正常。

问题已解决,看来 php 的持久连接不能很好地与 PgBouncer 配合使用。只需关闭持久连接,一切都会 运行 顺利进行。 :)