介绍
基准测试是一种发现基础组件性能的方式。Sysbench 是对 PostgreSQL 服务器进行基准测试的一个优秀工具。在本文中,我们将向您展示如何使用 sysbench 生成测试负载。我们将使用双节点的主从流复制设置。这也会帮助我们在集群上产生一些活动,以检查复制是否能按预期工作。
我们将安装最新版本的 sysbench,该项目目前在此处维护。我们将使用 Github 项目页面中提供的更新包,来安装 sysbench。我们还将使用 PostgreSQL 下载页面中标准的 PostgreSQL 16 二进制软件包。
安装 sysbench
安装 sysbench 非常简单。对于 Debian/Ubuntu:
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
$ sudo apt -y install sysbench
对于 RHEL/CentOS:
$ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
$ sudo yum -y install sysbench
安装 sysbench 软件包:
$ yum install sysbench
验证软件版本:
$ sysbench --version
sysbench 1.0.15
我们现在已经安装了 sysbench。
初始化测试数据
如果您熟悉 sysbench,对于 PostgreSQL 的参数会使用以下默认值:
- • pgsql-host=localhost
- • pgsql-port=5432
- • pgsql-user=sbtest
- • pgsql-password=password
- • pgsql-db=sbtest
首先,在 PostgreSQL 中创建数据库和用户:
CREATE USER sbtest WITH PASSWORD 'password';
CREATE DATABASE sbtest;
GRANT ALL PRIVILEGES ON DATABASE sbtest TO sbtest;
然后,编辑基于主机的访问控制文件pg_hba.conf:
$ vim /var/lib/pgsql/16/data/pg_hba.conf
并添加下面的行,以允许用户 sbtest 从192.168.55.0网络下的所有主机连接到数据库 sbtest:
host sbtest sbtest 192.168.55.0/24 md5
重新加载服务器,以应用更改:
$ /usr/pgsql-16/bin/pg_ctl --reload
使用 psql 命令行客户端,验证用户身份验证是否正常工作:
$ psql -U sbtest -h 192.168.55.61 -p 5432 -d sbtest -W
您应该能够进入到服务器中的 sbtest 数据库。运行 “q” 退出终端。我们现在可以执行下面命令,使用 sysbench 初始化数据库:
$ sysbench \
--db-driver=pgsql \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=1 \
--pgsql-host=192.168.55.61 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua \
run
上面命令在数据库 'sbtest' 中,为 24 个表(sbtest1 到 sbtest24)中的每个表生成 100,000 行。模式名称为 “public”,这是默认值。数据由名为parallel_prepare.lua的脚本准备,该脚本位于/usr/share/sysbench/tests/include/oltp_legacy下面。
执行下面的命令,验证生成的表:
$ psql -U sbtest -h 192.168.55.61 -p 5432 -W -c 'dt+'
Password for user sbtest:
List of relations
Schema | Name | Type | Owner | Size | Description
--------+----------+-------+--------+-------+-------------
public | sbtest1 | table | sbtest | 21 MB |
public | sbtest10 | table | sbtest | 21 MB |
public | sbtest11 | table | sbtest | 21 MB |
public | sbtest12 | table | sbtest | 21 MB |
public | sbtest13 | table | sbtest | 21 MB |
public | sbtest14 | table | sbtest | 21 MB |
public | sbtest15 | table | sbtest | 21 MB |
public | sbtest16 | table | sbtest | 21 MB |
public | sbtest17 | table | sbtest | 21 MB |
public | sbtest18 | table | sbtest | 21 MB |
public | sbtest19 | table | sbtest | 21 MB |
public | sbtest2 | table | sbtest | 21 MB |
public | sbtest20 | table | sbtest | 21 MB |
public | sbtest21 | table | sbtest | 21 MB |
public | sbtest22 | table | sbtest | 21 MB |
public | sbtest23 | table | sbtest | 21 MB |
public | sbtest24 | table | sbtest | 21 MB |
public | sbtest3 | table | sbtest | 21 MB |
public | sbtest4 | table | sbtest | 21 MB |
public | sbtest5 | table | sbtest | 21 MB |
public | sbtest6 | table | sbtest | 21 MB |
public | sbtest7 | table | sbtest | 21 MB |
public | sbtest8 | table | sbtest | 21 MB |
public | sbtest9 | table | sbtest | 21 MB |
(24 rows)
现在,测试数据已加载完成。
生成测试负载
您可以使用 sysbench 生成不同类型的数据库工作负载,如以下部分所示。
读/写负载
对于读写负载的测试,您可以使用下面的命令,指定 PostgreSQL 相关参数:
$ sysbench \
--db-driver=pgsql \
--report-interval=2 \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=64 \
--time=60 \
--pgsql-host=192.168.55.61 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
run
上面的命令会使用名为/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua的 LUA 脚本生成 OLTP 工作负载,在主机 192.168.55.61(主)上,使用 64 个工作线程对 24 个表中的 100,000 行,持续操作 60 秒。sysbench 会每 2 秒报告一次中间的统计信息(--report-interval=2)。
执行完后,您将获得如下内容:
sysbench 1.0.15 (using bundled LuaJIT 2.1.0)
Running the test with following options:
Number of threads: 16
Report intermediate results every 2 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 2s ] thds: 64 tps: 0.00 qps: 466.69 (r/w/o: 406.55/28.33/31.81) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
[ 4s ] thds: 64 tps: 30.55 qps: 525.38 (r/w/o: 335.56/128.72/61.10) lat (ms,95%): 3639.94 err/s: 0.00 reconn/s: 0.00
[ 6s ] thds: 64 tps: 39.55 qps: 718.41 (r/w/o: 496.13/142.68/79.60) lat (ms,95%): 4128.91 err/s: 0.00 reconn/s: 0.00
[ 8s ] thds: 64 tps: 35.98 qps: 840.95 (r/w/o: 604.11/163.89/72.95) lat (ms,95%): 2198.52 err/s: 0.50 reconn/s: 0.00
[ 10s ] thds: 64 tps: 65.57 qps: 1314.94 (r/w/o: 912.00/271.80/131.14) lat (ms,95%): 3040.14 err/s: 0.00 reconn/s: 0.00
...
当测试正在进行时,我们可以使用pg_activity或pg_top来监控 PostgreSQL 的活动,以确认 sysbench 报告的中间统计数据。在另一个终端中,执行下面操作:
$ su - postgres
$ pg_activity
PostgreSQL 16.2 - postgres1.local - postgres@localhost:5432/postgres - Ref.: 2s
Size: 654.62M - 7.67K/s | TPS: 74
Mem.: 39.10% - 382.72M/979.68M | IO Max: 3395/s
Swap: 0.20% - 3.57M/2.00G | Read : 8.36M/s - 2141/s
Load: 20.20 6.02 2.44 | Write: 2.54M/s - 650/s
RUNNING QUERIES
PID DATABASE USER CLIENT CPU% MEM% READ/s WRITE/s TIME+ W IOW state Query
5130 sbtest sbtest 192.168.55.61 1.0 2.8 791.57K 3.84K 0.788732 N N active SELECT c FROM sbtest7 WHERE id BETWEEN 33195 AND 33294
...
还可以通过查看主服务器上的 pg_stat_replication 视图,监控复制流的状态:
$ su - postgres
$ watch -n1 'psql -xc "select * from pg_stat_replication"'
Every 1.0s: psql -xc "select * from pg_stat_replication" Tue Jul 31 13:12:08 2024
-[ RECORD 1 ]----+------------------------------
pid | 3792
usesysid | 16448
usename | slave
application_name | walreceiver
client_addr | 192.168.55.62
client_hostname |
client_port | 44654
backend_start | 2024-07-30 13:41:41.707514+08
backend_xmin |
state | streaming
sent_location | 0/60933D78
write_location | 0/60933D78
flush_location | 0/60933D78
replay_location | 0/60933D78
sync_priority | 0
sync_state | async
上面的 “watch” 命令每 1 秒运行一次 psql 命令。您应该会在复制进行时看到 “*_location” 列相应地更新。
在测试结束时,您应该会看到总结的报告:
SQL statistics:
queries performed:
read: 67704
write: 19322
other: 9682
total: 96708
transactions: 4830 (79.34 per sec.)
queries: 96708 (1588.53 per sec.)
ignored errors: 6 (0.10 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 60.8723s
total number of events: 4830
Latency (ms):
min: 4.52
avg: 799.70
max: 8082.70
95th percentile: 2279.14
sum: 3862532.62
Threads fairness:
events (avg/stddev): 75.4688/7.39
execution time (avg/stddev): 60.3521/0.20
上面的总结告诉我们,我们的 PostgreSQL 数据库服务器,在 64 个工作线程下,平均每秒可以处理大约 80 个事务,和每秒大约 1588 个查询。
只读负载
对于只读负载的测试,您可以使用相同的命令,但应将 LUA 脚本更改为select.lua、select_random_points.lua、select_random_ranges.lua或oltp_simple.lua:
$ sysbench \
--db-driver=pgsql \
--report-interval=2 \
--oltp-table-size=100000 \
--oltp-tables-count=24 \
--threads=64 \
--time=60 \
--pgsql-host=192.168.55.62 \
--pgsql-port=5432 \
--pgsql-user=sbtest \
--pgsql-password=password \
--pgsql-db=sbtest \
/usr/share/sysbench/tests/include/oltp_legacy/select.lua \
run
上面的命令,访问 PostgreSQL 流复制中的备用服务器192.168.55.62,使用select.lua脚本,通过 64 个工作线程,运行一次只读负载的测试。
其他负载
您还可以使用 sysbench 生成许多其他 OLTP 工作负载,正如/usr/share/sysbench/tests/include/oltp_legacy目录下所列出的:
$ ls -1 /usr/share/sysbench/tests/include/oltp_legacy/
bulk_insert.lua
common.lua
delete.lua
insert.lua
oltp.lua
oltp_simple.lua
parallel_prepare.lua
select.lua
select_random_points.lua
select_random_ranges.lua
update_index.lua
update_non_index.lua
您可以使用类似的命令来测试,只需更改命令行中的 LUA 脚本路径。
最后的思考
使用 sysbench,我们可以为 PostgreSQL 服务器生成测试负载。请注意,最佳的基准测试是,使用您的真实数据和应用程序,但这可能并不总是可行的。它也可能是一个将会快速演进的新应用程序。尽管 sysbench 生成的负载可能无法代表您实际的 OLTP 工作负载,但它也可能已经足够好了。