我在交易模式中使用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)
答案 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的不同实例上拥有来自不同应用程序的不同队列。