最大化数据库池TPS

问题描述 投票:0回答:1

我正在尝试最大化池化器和数据库资源以确保最高吞吐量。

规格:

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 实例。

enter image description here

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。

enter image description here

Pg 保镖持有所有数据库连接,这解释了恒定的内存。仅当我运行压力测试时,CPU 才会出现峰值。 运行压力测试时,我的 PG Bouncer 虚拟机的 CPU 使用率最多为 50%,但内存不多。 因为这只是

SELECT 1
将 pool_mode 从
transaction
更改为
statement
并不重要。

问题:

  1. 我可以做些什么来进一步提高TPS吗?我知道我可以添加只读副本和更多 pgbouncer 实例。但在扩大规模之前我能做些什么吗?
  2. 为什么当我增加 max_buffer 大小时 RPS 会提高?
  3. 我有 16 个pgbouncer 实例,每个实例有 43 个后端连接(16 * 43 = 688)。我可以再添加 2 个 pgbouncer 实例,或者将后端连接增加到 49 个。这是我唯一的选择吗?
postgresql database-performance scaling pgbouncer
1个回答
0
投票

在 docker 内运行 pgbouncer 会导致 tps 降低吗?

© www.soinside.com 2019 - 2024. All rights reserved.