如何增加pgbouncer的连接吞吐量?

时间:2014-12-11 01:35:26

标签: postgresql pgbouncer

我在交易模式中使用pgbouncer&试图允许接近500活跃的交易。 目的只是压力测试设置

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

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

对于同一套交易(通过pgbench)

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

  • pgbouncer connection => 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台机器充当客户端向数据库服务器运行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);

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

2 个答案:

答案 0 :(得分:1)

如果您在与PostgreSQL相同的主机上运行PgBouncer,则应使用pgbouncer增加renice进程的CPU优先级。

renice -10 -p `pidof pgbouncer`

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

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

即使是renice也无法做到魔法:如果你的运行速度超过10k + TPS,你可能不得不在(多个)PgBouncer前面考虑一些负载均衡(HAProxy?)。

答案 1 :(得分:1)

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