205、pgbench压测工具

前言:

基准测试一般的衡量指标主要关注的是 吞吐量(TPS),响应时间,并发量;常见的开源数据库的基准测试工具有benchmarksql,sysbench等,PostgreSQL自带基准测试程序pgbench,在bin目录下就可以找到。

1.如何安装pgbench

不需要安装,直接在你安装完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    10
K
    pgbench_accounts   100000*K
    pgbench_history    0
-T,测试执行的时间,单位是秒
-t,设定每个客户端运行多少数量的事务后结束
-c,模拟客户端的数量,也就是连接数量
-C,为每个事务创建new connection
--foreign-keys, 在初始化的表之间创建外键
--index-tablespace=TABLESPACE,指定索引表空间
--tablespace=TABLESPACE, 指定表空间

开始使用

2.初始化测试数据

注:在初始化过程中,如果数据库存在同名的表,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.

3.查看内置脚本

因为pgbench默认是使用内置脚本进行各种场景的测试,当然我们也可以自定义脚本测试
$ pgbench -b list
Available builtin scripts:

  • tpcb-like           --默认模式,包含select,update,insert的事务,涉及多表update
  • simple-update  --简单模式,包含select,update,insert的操作,仅涉及单表的update
  • select-only          --只读模式

4.使用内置脚本进行测试

$ ./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的比例混合测试

5.使用自定义脚本测试

创建测试表:
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 调用自定义脚本文件

6.其他测试方案

模拟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)

你可能感兴趣的:(PostgreSQL笔记,PostgreSQL,pgbench,压测工具)