本专题
- postgresql使用(一):TPC-H tools生成数据集并导入至postgre的数据库
- postgresql使用(二):在TPC-H的数据库上pgbench 压力测试
- postgresql使用(三):收集Postgresql数据库统计信息
一、准备工作
首先来熟悉一下Postgresql自带的pgbench工具:
Postgresql pgbench:
- pgbench支持tpc-b测试和自定义模型测试。
- pgbench在多个并发的数据库会话中反复运行一系列相同的SQL命令,并计算事务执行的平均速率(每秒执行的事务个数)。
- tps 显示的是每秒完成的事务数量(包含连接建立时间和不包含连接建立时间分别计算出的平均值)。
内部脚本测试:
准备命令(自定义初始化):
pgbench -i -s 20 pgbenchdb
测试命令
pgbench -r -j 2 -c 4 -T 60 pgbenchdb
一些参数说明:
- -r :在基准结束后,报告平均的每个命令的每语句等待时间(从客户端的角度来说是执行时间)。
- -j threads: pgbench中的工作者线程数量。在多 CPU 机器上使用多于一个线程会有用。客户端会尽可能均匀地分布到可用的线程上。默认为 1。
- -c clients:模拟的客户端数量,也就是并发数据库会话数量。默认为 1。
- -T seconds:测试执行时间,而不是为每个客户端运行固定数量的事务。-t和-T是互斥的。
程序自带的脚本如下,包括一条插入语句,三条更新语句和一条查询语句。
\set nbranches :scale
\set ntellers 10 * :scale
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
\setrandom bid 1 :nbranches
\setrandom tid 1 :ntellers
\setrandom delta -5000 5000
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;
可以使用自己的脚本进行独立测试,准备一个sql文件,命名为test.sql文件。
\set nbranches :scale
\set ntellers 10 * :scale
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
\setrandom bid 1 :nbranches
\setrandom tid 1 :ntellers
\setrandom delta -5000 5000
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
运行自己的脚本:
pgbench -rf test.sql -c 4 -j 2 -T 60 pgbenchdb
-l 记录日志log,记录的日志在test.sql所在的文件夹内。
因为 -j 选项为2,多个工作者进程都有自己的日志文件。
日志的格式是:
client_id | transaction_no | time | script_no | time_epoch | time_us [schedule_lag]
- time 是以微秒计的总共用掉的事务时间
- script_no 标识了要使用哪个脚本文件(当用-f或者-b指定多个脚本时有用)
- time_epoch 是一个 Unix 纪元格式的时间戳
- time_us 是一个显示事务完成时间的以微秒计的偏移量(适合于创建一个带有分数秒的 ISO 8601 时间戳)
- schedule_lag 是事务的预定开始时间和实际开始时间之间的差别,以微秒计。只有使用--rate选项时它才存在。
二、在TPC-H的数据库testdb上做压力测试pgbench
pgbench -rf try.sql -c 4 -j 2 -T 60 -n testdb
注意:一定要加 -n ,否则会遇到如下报错,因为testdb不是由pgbench -i 初始化自动生成的。
starting vacuum...
ERROR: relation "pgbench_branches" does not exist(ignoring this error and continuing anyway)
ERROR: relation "pgbench_tellers" does not exist(ignoring this error and continuing anyway)
ERROR: relation "pgbench_history" does not exist(ignoring this error and continuing anyway)
try.sql
实际是tpc-h内置模板 query 6自动生成的。
参考资料:
https://www.postgresql.org/docs/9.5/pgbench.html
https://blog.csdn.net/enzesheng/article/details/42720691
https://blog.phpgao.com/how_to_use_pgbench.html(参数说明)
https://blog.csdn.net/ctypyb2002/article/details/78910990