【问题标题】:How to increase the connection throughput for pgbouncer?如何增加 pgbouncer 的连接吞吐量?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您在与 PostgreSQL 相同的主机上运行 PgBouncer,则应将 pgbouncer 进程的 CPU 优先级提高到 renice

    renice -10 -p `pidof pgbouncer`
    

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

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

    即使 renice 也不能变魔术:如果你运行的 TPS 超过 10k+,你可能必须在(多个)PgBouncer 之前考虑一些负载平衡(HAProxy?)。

    【讨论】:

    • 你不能使用不同的调度器吗?我知道我在 Android 手机上经常使用调度程序,但之前没有为这样的事情切换过调度程序。不同的调度程序肯定会产生巨大的性能差异
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多