15

我在事务模式下使用 pgbouncer 并试图允许接近 500 个活动事务。目的只是对设置进行压力测试

当前设置:[ 'n' 个客户端 --->1 pgbouncer ----> 1 postgres ]

我注意到当我使用 pgbouncer 而不是直接连接到 postgres 时,我的事务/秒 (tps) 显着降低。

对于同一组事务(通过 pgbench)

  • 直接连接 => 10k (tps) appx

  • pgbouncer 连接 => 3k (tps) appx

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 测试

pgbench_SchemaScript.sql

\setrandom delta 0 100000
insert into t1.emplog values(nextval('t1.employeeSeq'),:delta);

1 个安装了 pgbouncer 的数据库服务器(16 核,24 Gb RAM)

4

2 回答 2

3

如果你在与 PostgreSQL 相同的主机上运行 PgBouncer,你应该增加pgbouncer进程的CPU 优先级renice

renice -10 -p `pidof pgbouncer`

默认的 Linux 调度程序是循环的,它使 PgBouncer 挨饿,因为它平等地对待所有进程 - 并且数百个postgres进程压倒了单个pgbouncer进程。

在中等负载下这通常不是问题,但在运行大量小事务时它可能是一个非常重要的因素。

甚至 renice 也无法发挥作用:如果您运行的 TPS 超过 10k+,您可能必须在(多个)PgBouncer 之前考虑一些负载平衡(HAProxy?)。

于 2015-10-14T21:22:13.277 回答
3

我知道这是一个老问题,但我们遇到了类似的问题,我们只是在 Docker 中针对同一个数据库在不同端口上运行更多 pgbouncers,它工作正常。这样,您可以在不同的 pgbouncer 实例上拥有来自不同应用程序的不同队列。

于 2017-01-10T14:29:14.207 回答