数据库压测
压测的定义
基于一些工具模拟一个系统每秒发出一定数量的请求到数据库上去,观察它的 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 | pgbench -i connection_string_to_coordinator |
为 pgbench 创建 SQL 文件
Pgbench 重复运行给定的 SQL 命令并报告结果。对于这个基准测试运行,我们将使用 pgbench 附带的 INSERT 命令。
要创建相关的 SQL 命令,请创建一个名为 insert.sql 的文件,并将以下代码行粘贴到该文件中
1 | \set naccounts 100000 * :scale |
基准插入命令
默认情况下,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 | pgbench -i connection_string_to_coordinator |
为 pgbench 创建 SQL 文件
Pgbench 重复运行给定的 SQL 命令并报告结果。对于这个基准测试运行,我们将使用 pgbench 附带的一个 UPDATE 命令。
要创建相关的 SQL 命令,请创建一个名为 update.SQL 的文件,并将以下代码行粘贴到该文件中
1 | \set naccounts 100000 * :scale |
基准更新命令
默认情况下,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