【发布时间】:2014-12-11 01:35:26
【问题描述】:
我在事务模式下使用 pgbouncer 并试图允许接近 500 个活动事务。 目的只是对设置进行压力测试
当前设置: [ 'n' 个客户 --->1 pgbouncer ----> 1 postgres ]
我注意到当我使用 pgbouncer 而不是直接连接到 postgres 时,我的事务/秒 (tps) 显着降低。
对于相同的事务集(通过 pgbench)
直接连接 => 10k (tps) appx
pgbouncer 连接 => 3k (tps) appx
pgbouncer 中是否有任何配置需要调整以实现更好的性能?
我了解 pgbouncer 是一个单线程应用程序,但希望将其调优至最佳状态。 以下是我的 pgbouncer 配置:
pgbouncer.ini
pool_mode = transaction
server_reset_query =
# Time outs
server_lifetime=6000
server_idle_timeout=0
server_connect_timeout=30
#pool configuration
max_client_conn=10000
default_pool_size=500
pool_size=500
##other
pkt_buf=4096
server_login_retry=2
我能看到的唯一应用是使用多个 pgbouncers 指向同一个数据库服务器。
更新
在执行测试时:
cpu 利用率:30% appx
磁盘利用率:40% appx
观察:许多交易处于“空闲”状态
测试详情:
10 台机器作为客户端向 DB 服务器运行 pgbench 触发请求。
命令:pgbench -h -p 6541 -c 512 -j 16 -f pgbench_SchemaScript.sql -T 360 -U postgres test
pgbench_SchemaScript.sql
\setrandom delta 0 100000
insert into t1.emplog values(nextval('t1.employeeSeq'),:delta);
1 台安装了 pgbouncer 的数据库服务器(16 核,24 Gb RAM)
【问题讨论】:
-
在更改任何内容之前,我会检查 pgbouncer 的 cpu 使用情况。 10000 个客户端连接很多,对于单线程应用程序来说可能太多了。 PostgreSQL 服务器上的 500 个活动连接也很多,您确实需要一些重要的硬件来获得高性能。
-
执行测试时,此框的 cpu 使用率约为 30%。该盒子有 16 个内核和 24GB RAM。我注意到磁盘利用率也在 40% 左右。在使用 pgbouncer 时,我注意到很多“空闲”交易,我认为这导致了低 tps,但不知道如何避免它们。
-
当您有 10000 个本应忙碌的客户时空闲,这不好。您正在运行哪些测试?完成一项测试后是否所有交易都已关闭?如果不是,这可能会导致延迟,因为该连接对于另一个客户端尚不可用。 cpu 和磁盘都应该达到 100%,或者至少接近 100%。
-
首先尝试检查 pgbouncer 本身。它里面有很多统计信息(SHOW 命令)。您可以通过连接到其虚拟数据库“pgbouncer”(psql -U user -pouncer_port pgbouncer)手动完成。但是最好有一些带有 pgbouncer 集成的监控框架。如前所述,500 个连接非常多,尤其是在事务模式下。您拥有的连接越多,tps 就越慢(IPC、内存共享等,wiki.postgresql.org/wiki/Number_Of_Database_Connections)。我怀疑您是否需要真正的 500 pg 后端 on16 个内核。
-
phbouncer 是如何连接到您的数据库的? pgb 在一台机器上而数据库在另一台机器上吗?它使用 tcp/ip 吗?该连接与您的客户端-> db 直接连接有何不同?您是否在使用 docker a well 并且必须在 1 个配置和另一个配置中通过额外的 IP 堆栈/抽象层?
标签: postgresql pgbouncer