pgbench是一种在PostgreSQL上运行基准测试的简单程序。它可能在并发的数据库会话中一遍一遍地运行相同序列的 SQL 命令,并且计算平均事务率(每秒的事务数)。默认情况下,pgbench会测试一种基于 TPC-B 但是要更宽松的场景,其中在每个事务中涉及五个SELECT、UPDATE以及INSERT命令。但是,通过编写自己的事务脚本文件很容易用来测试其他情况。
创建数据库
$ psql
create database pgbenchdb
准备命令
$ pgbench -i -s 20 pgbenchdb
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 2000000 tuples (5%) done (elapsed 0.25 s, remaining 4.70 s)
200000 of 2000000 tuples (10%) done (elapsed 0.53 s, remaining 4.73 s)
300000 of 2000000 tuples (15%) done (elapsed 0.80 s, remaining 4.51 s)
400000 of 2000000 tuples (20%) done (elapsed 1.02 s, remaining 4.09 s)
500000 of 2000000 tuples (25%) done (elapsed 1.24 s, remaining 3.71 s)
600000 of 2000000 tuples (30%) done (elapsed 1.53 s, remaining 3.58 s)
700000 of 2000000 tuples (35%) done (elapsed 1.84 s, remaining 3.42 s)
800000 of 2000000 tuples (40%) done (elapsed 2.07 s, remaining 3.10 s)
900000 of 2000000 tuples (45%) done (elapsed 2.38 s, remaining 2.90 s)
1000000 of 2000000 tuples (50%) done (elapsed 2.71 s, remaining 2.71 s)
1100000 of 2000000 tuples (55%) done (elapsed 2.92 s, remaining 2.39 s)
1200000 of 2000000 tuples (60%) done (elapsed 3.24 s, remaining 2.16 s)
1300000 of 2000000 tuples (65%) done (elapsed 3.58 s, remaining 1.93 s)
1400000 of 2000000 tuples (70%) done (elapsed 3.84 s, remaining 1.64 s)
1500000 of 2000000 tuples (75%) done (elapsed 4.18 s, remaining 1.39 s)
1600000 of 2000000 tuples (80%) done (elapsed 4.45 s, remaining 1.11 s)
1700000 of 2000000 tuples (85%) done (elapsed 4.83 s, remaining 0.85 s)
1800000 of 2000000 tuples (90%) done (elapsed 5.17 s, remaining 0.57 s)
1900000 of 2000000 tuples (95%) done (elapsed 5.42 s, remaining 0.29 s)
2000000 of 2000000 tuples (100%) done (elapsed 5.73 s, remaining 0.00 s)
vacuum...
set primary keys...
done.
-i 要求调用初始化模式。
-s 将生成的行数乘以比例因子。例如,-s 100将在pgbench_accounts表中创建 10,000,000 行。默认为 1。当比例为 20,000 或更高时,用来保存账号标识符的列(aid列)将切换到使用更大的整数(bigint),这样才能足以保存账号标识符。
其实就是插入的倍数,默认是1,即插入1 * 100000条;设置为n,则插入的行数为 n * 100000条。示例设置为20,则插入的行数为 20 * 10W=200W。
测试命令
$ pgbench -r -j 2 -c 4 -T 60 pgbenchdb
starting vacuum...end.
transaction type:
scaling factor: 20
query mode: simple
number of clients: 4
number of threads: 2
duration: 60 s
number of transactions actually processed: 80976
latency average = 2.964 ms
tps = 1349.466570 (including connections establishing)
tps = 1349.564883 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
0.003 \set aid random(1, 100000 * :scale)
0.001 \set bid random(1, 1 * :scale)
0.001 \set tid random(1, 10 * :scale)
0.001 \set delta random(-5000, 5000)
0.073 BEGIN;
0.207 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.193 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
0.233 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
0.332 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.173 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
1.746 END;
tps = 1349.466570 (including connections establishing)
tps = 1349.564883 (excluding connections establishing)
-r 在基准结束后,报告平均的每个命令的每语句等待时间(从客户端的角度来说是执行时间)。
-j pgbench中的工作者线程数量。在多 CPU 机器上使用多于一个线程会有用。客户端会尽可能均匀地分布到可用的线程上。默认为 1。
-c 模拟的客户端数量,也就是并发数据库会话数量。默认为 1。其中 -c = -j *n。
-T 运行测试这么多秒,而不是为每个客户端运行固定数量的事务。-t和-T是互斥的。
使用自定义脚本
$ pgbench -M simple -n -P 1 -f /tmp/f4.sql -r -c 20 -j 4 -T 60 peiybdb
progress: 1.0 s, 35356.7 tps, lat 0.545 ms stddev 1.147
progress: 2.0 s, 37536.9 tps, lat 0.532 ms stddev 1.252
progress: 3.0 s, 37001.8 tps, lat 0.539 ms stddev 1.168
progress: 4.0 s, 39644.4 tps, lat 0.505 ms stddev 1.356
$ pgbench -M extended -n -P 1 -f /tmp/f4.sql -r -c 20 -j 4 -T 60 peiybdb
progress: 1.0 s, 32421.4 tps, lat 0.598 ms stddev 1.484
progress: 2.0 s, 31532.2 tps, lat 0.634 ms stddev 1.310
progress: 3.0 s, 32415.3 tps, lat 0.615 ms stddev 1.347
progress: 4.0 s, 32889.0 tps, lat 0.609 ms stddev 1.392
$ pgbench -M prepared -n -P 1 -f /tmp/f4.sql -r -c 20 -j 4 -T 60 peiybdb
progress: 1.0 s, 39417.6 tps, lat 0.494 ms stddev 1.001
progress: 2.0 s, 40348.3 tps, lat 0.495 ms stddev 0.838
progress: 3.0 s, 40277.9 tps, lat 0.496 ms stddev 0.969
progress: 4.0 s, 40950.9 tps, lat 0.488 ms stddev 0.906
-M querymode
–protocol=querymode
要用来提交查询到服务器的协议:
simple:使用简单查询协议。
extended使用扩展查询协议。
prepared:使用带预备语句的扩展查询语句。
-n
–no-vacuum
初始化以后不执行清理
-P sec
–progress=sec
每sec秒显示进度报告。该报告包括运行了多长时间、从上次报告以来的 tps 以及从上次报告以来事务延迟的平均值和标准偏差。如果低于限流值(-R),延迟会相对于事务预定的开始时间(而不是实际的事务开始时间)计算,因此其中也包括了平均调度延迟时间。
参考:
http://postgres.cn/docs/9.6/pgbench.html