数据库压测

压测的定义
基于一些工具模拟一个系统每秒发出一定数量的请求到数据库上去,观察它的 CPU、磁盘 IO、网络 IO 和内存等负载情况,测试出这个数据库在目前的机器配置下,大致的负载压力如何,性能表现如何,每秒最多可以处理多少请求。

1
create database pgbench;

Pgbench 是 PostgreSQL 提供的标准基准测试工具。Pgbench 重复运行给定的 SQL 命令,并测量每秒完成的事务数。由于 pgbench 本身消耗 CPU 能量,因此我们建议在单独的机器上运行它,而不是在运行 Citus 集群的机器上运行。Pgbench 自己的文档也指出,将其放在与测试数据库相同的机器上可能会影响测试结果。

1
pgbench -i --unlogged-tables -s 2 -U postgres -p 5432 -d pgbench

pgbench 的初始化

pgbench -i [ other-options ] dbname

主要选项
-i:初始化模式
-s:插入的倍数,默认是 1,即插入 100000 十万条;也就是执行多少次 generate_series(1, 100000)

创建四个表,如果同名表已经存在会被先删除,默认的情况下 -s 的比例因子为 1,这些表初始包含的行数为:

pgbench_accounts # 账户表 行数 100000 十万
pgbench_branches # 支行表 行数 1
pgbench_history # 历史信息表 行数 0
pgbench_tellers # 出纳表 行数 10

pgbench -r -T10 ppp

基准 INSERT 吞吐量

初始化和分发表

1
2
pgbench -i connection_string_to_coordinator
psql connection_string_to_coordinator -c "SELECT create_distributed_table('pgbench_history', 'aid');"

为 pgbench 创建 SQL 文件

Pgbench 重复运行给定的 SQL 命令并报告结果。对于这个基准测试运行,我们将使用 pgbench 附带的 INSERT 命令。

要创建相关的 SQL 命令,请创建一个名为 insert.sql 的文件,并将以下代码行粘贴到该文件中

1
2
3
4
5
6
7
8
9
\set naccounts 100000 * :scale
\set nbranches :scale
\set ntellers 10 * :scale
\set aid random(1, :naccounts)
\set bid random(1, :nbranches)
\set tid random(1, :ntellers)
\set delta random(-5000, 5000)
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime)
VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);

基准插入命令

默认情况下,pgbench 打开到数据库的单个连接,并通过此连接发送 INSERT 命令。为了衡量写吞吐量,我们将打开到数据库的并行连接并发出并发命令。特别是,我们将使用 pgbench 的 -j 参数来指定并发线程的数量,使用 -c 参数来指定并发连接的数量。我们还将使用 -T 参数将测试的持续时间设置为 30 秒。

要使用这些参数运行 pgbench,只需输入

1
pgbench connection_string_to_coordinator -j 64 -c 256 -f insert.sql -T 30

基准更新吞吐量

初始化和分发表

在开始之前,我们需要告诉 pgbench 通过创建测试表来初始化基准测试环境。然后,我们需要连接到 Citus 协调器节点,并分发要在其上运行 UPDATE 基准测试的表。

要初始化测试环境并分发相关的表,您需要获取到集群的连接字符串。您可以从 Citus Cloud 仪表板中获得这个连接字符串。然后,您需要运行以下两个命令

1
2
3
4
pgbench -i connection_string_to_coordinator

# INSERT and UPDATE tests run on different distributed tables
psql connection_string_to_coordinator -c "SELECT create_distributed_table('pgbench_accounts', 'aid');"

为 pgbench 创建 SQL 文件

Pgbench 重复运行给定的 SQL 命令并报告结果。对于这个基准测试运行,我们将使用 pgbench 附带的一个 UPDATE 命令。

要创建相关的 SQL 命令,请创建一个名为 update.SQL 的文件,并将以下代码行粘贴到该文件中

1
2
3
4
\set naccounts 100000 * :scale
\set aid random(1, :naccounts)
\set delta random(-5000, 5000)
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;

基准更新命令

默认情况下,pgbench 打开到数据库的单个连接,并通过此连接发送 UPDATE 命令。为了衡量写吞吐量,我们将打开到数据库的并行连接并发出并发命令。特别是,我们将使用 pgbench 的 -j 参数来指定并发线程的数量,使用 -c 参数来指定并发连接的数量。我们还将使用 -T 参数将测试的持续时间设置为 30 秒。

要使用这些参数运行 pgbench,只需输入

1
pgbench connection_string_to_coordinator -j 64 -c 256 -f update.sql -T 30

请注意,这些参数打开了到 Citus 的 256 个并发连接。如果在自己的实例上运行 Citus,则需要增加缺省 max_connect 设置。

查看最大连接数
show max_connections;

参考

Search — Citus 11.2 documentation
https://docs.citusdata.com/en/stable/search.html?q=pgbench&check_keywords=yes&area=default