基准测试一般的衡量指标主要关注的是 吞吐量(TPS),响应时间,并发量;常见的开源数据库的基准测试工具有benchmarksql,sysbench等,PostgreSQL自带基准测试程序pgbench,在bin目录下就可以找到。
不需要安装,直接在你安装完postgresql之后,在bin目录下就可以看到pgbench程序的身影。
pgbench程序会创建4张表:pgbench_branches,pgbench_tellers,pgbench_accounts,pgbench_history
选项参数介绍:
-i, --initialize,
进入初始化模式
-F, --fillfactor=NUM,
设置填充因子,默认值为100
-n, --no-vacuum
, 初始化结束后不执行VACUUM操作,(注:VACUUM操作其实就是整理磁盘碎片空间)
-q, --quiet,
开启静默模式,打印少量信息
-s, --scale=NUM,
生成数据的比例因子,默认值1,值越大,表里初始化的数据就越多。当值为k时,各个表的数据量如下所示:
pgbench_branches 1K
pgbench_tellers 10K
pgbench_accounts 100000*K
pgbench_history 0
-T,
测试执行的时间,单位是秒
-t,
设定每个客户端运行多少数量的事务后结束
-c,
模拟客户端的数量,也就是连接数量
-C,
为每个事务创建new connection
--foreign-keys,
在初始化的表之间创建外键
--index-tablespace=TABLESPACE,
指定索引表空间
--tablespace=TABLESPACE,
指定表空间
注:
在初始化过程中,如果数据库存在同名的表,pgbench会删除同名表重新进行初始化
$ ./pgbench -i -s 2 -F 80 -h 127.0.0.1 -p 5432 -U root -d mydb
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data...
100000 of 200000 tuples (50%) done (elapsed 0.02 s, remaining 0.02 s)
200000 of 200000 tuples (100%) done (elapsed 0.05 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done.
因为pgbench默认是使用内置脚本进行各种场景的测试,当然我们也可以自定义脚本测试
$ pgbench -b list
Available builtin scripts:
tpcb-like
--默认模式,包含select,update,insert的事务,涉及多表updatesimple-update
--简单模式,包含select,update,insert的操作,仅涉及单表的updateselect-only
--只读模式$ ./pgbench -b tpcb-like -h 127.0.0.1 -p 5432 -U root -d mydb
运行结果:
starting vacuum...end.
client 0 executing script ""
。。。
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 2
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
latency average = 3.859 ms
tps = 259.105827 (including connections establishing)
tps = 293.511528 (excluding connections establishing)
注:
-b参数用来更换内置脚本
内置脚本的混合使用
$ ./pgbench -b tpcb-like@2 -b simple-update@80 -h 127.0.0.1 -p 5432 -U root -d mydb
注:
@2, @8表示该内置脚本运行比例的权重值,是以2:8的比例混合测试
创建测试表:
mydb=# create table tb1(id serial primary key, ival int);
自定义insert脚本:
[postgres@wqdcsrv090 script]$ cat bench_for_insert.sql
\sleep 500ms
\set ival random(1,100000)
insert into tb1(ival) values(:ival);
执行自定义脚本测试:
$ /usr/pgsql-12/bin/pgbench -f bench_for_insert.sql -h 127.0.0.1 -p 5432 -U root -d mydb -T 20
注:
-T 20 表示执行测试20秒时间, -f 调用自定义脚本文件
模拟4个客户端连接,并且每个事务都创建新的连接
/usr/pgsql-12/bin/pgbench -f bench_for_insert.sql@100 -h 127.0.0.1 -p 5432 -U root -d mydb -c 4 -C
注:-c 4 表示开4个客户端, -C表示每个事务都新建connection
按测试运行时间或事务数量
-T 和 -t 参数不能同时被使用,两个参数都没指定的情况下,默认使用-t 10;
/usr/pgsql-12/bin/pgbench -f bench_for_insert.sql@100 -h 127.0.0.1 -p 5432 -U root -d mydb -t 300 -c 2 -C
将超出阈值的事务计算一下:
使用参数-L
设置一个阈值,单位是毫秒,将超过此阈值的事务计数
/usr/pgsql-12/bin/pgbench -f bench_for_insert.sql@100 -h 127.0.0.1 -p 5432 -U root -d mydb -T 10 -c 40 -C -L 50
执行结果:
number of transactions actually processed: 3946
number of transactions above the 50.0 ms latency limit: 3458/3946 (87.633 %) --超过阈值的事务有3458个,占比87.633 %
latency average = 72.518 ms
latency stddev = 17.598 ms
tps = 394.188445 (including connections establishing)
tps = 404.033284 (excluding connections establishing)