我正在尝试最大化池化器和数据库资源以确保最高吞吐量。
规格:
Postgres DB: 8CPUs 64GB Memory
VM for PGbouncer: 16CPU 64GB Memory
Both servers are on the same location.
由于我使用的是 GCP SQL,
max_connections
和 shared_buffers
已设置为最佳值 800
和 22GB
PG 保镖配置:
[databases]
reader = host=ip dbname=noname password=nopassword
[pgbouncer]
max_client_conn = 100000
default_pool_size = 40
max_db_connections = 43
pool_mode = "transaction"
每个 PGbouncer 最多可与数据库建立 43 个连接,所有 16 个实例的最大连接数为 688 个,远低于最大数据库连接数。
我的 PGbouncer VM 在
16
端口上运行 1001-1016
pgbouncer 实例,并且我有 haproxy 将负载分配给所有 pgbouncer 实例。
PG 工作台输入文件 select.sql
SELECT 1;
当我运行 pgbench 时,我得到以下结果:
max_client_conn=10000
-c | -T | TPS
---------------+-------
500 | 120 | 60k
1000 | 120 | 56k
1500 | 120 | 55k
max_client_conn=100000(increased from 10,000 to 100,000)
-c | -T | TPS
---------------+-------
500 | 120 | 47k
1000 | 120 | 62k
1500 | 120 | 63k
2000 | 120 | 44k
2500 | 120 | 38k
3000 | 120 | 46k
4000 | 120 | 46k
5000 | 120 | 44k
increased DB max_buffer size from 21GB to 40GB
-c | -T | TPS
---------------+-------
2000 | 120 | 69k
5000 | 120 | 62k
7000 | 120 | 60k
10000| 120 | 64k
注意:没有失败
我的 TPS 在 40-60k 左右饱和。还有什么可以提高 TPS 的吗? 水平扩展 pgbouncer 实例是一种选择,但您很快就会遇到 max_connections 限制,即 800。
Pg 保镖持有所有数据库连接,这解释了恒定的内存。仅当我运行压力测试时,CPU 才会出现峰值。 运行压力测试时,我的 PG Bouncer 虚拟机的 CPU 使用率最多为 50%,但内存不多。 因为这只是
SELECT 1
将 pool_mode 从 transaction
更改为 statement
并不重要。
问题:
在 docker 内运行 pgbouncer 会导致 tps 降低吗?