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

jay*_*h88 13 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
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一应用是使用多个pgbouncers指向同一个数据库服务器.

UPDATE

在执行测试时:

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);
Run Code Online (Sandbox Code Playgroud)

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

fil*_*rem 5

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

renice -10 -p `pidof pgbouncer`
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,PgBouncer 是一个单线程程序。如果您运行的流量超过单个 CPU 核心可以处理的流量(在 2020 年硬件上,该流量约为 10k-30k TPS),您应该考虑在(多个)PgBouncer 实例之前进行一些负载平衡(HAProxy?)。