postgreSQL pgbench
初始化
# 初始化测试数据
./pgbench -i -s 80 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
pgbench内置脚本
查看内置测试脚本
./pgbench -b list
tpcb-like
# 包含select、update、insert的事物
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET bbalance = 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;
simple-update
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid,:aid,:delta,CURRENT_TIMESTAMP);
END;
select-only
BEGIN;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
END;
# 使用simple-update测试
./pgbench -b simple-update -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
# 3种内置脚本混合进行测试
./pgbench -b simple-update@2 -b select-only@8 -b tpcb@0 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
使用自定义脚本
# 创建表
create table tbl
(
id serial primary key,
ival int
);
# 写入sql脚本
echo "select id,ival from tbl order by id desc limit 10;" > bench_script_for_select.sql
# 执行脚本
./pgbench -f /usr/data/sql/bench_script_for_select.sql -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
vim bench_script_for_insert.sql
\sleep 500ms
\set ival random(1,100000)
insert into tbl(ival) values(:ival);
./pgbench -f /usr/data/sql/bench_script_for_insert.sql -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
select count(*) from tbl;
./pgbench -T 60 -f /usr/data/sql/bench_script_for_insert.sql@10 -f /usr/data/sql/bench_script_for_insert.sql@3 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
其他选项
模拟客户端数量和连接方式
-c 模拟客户端连接数(并发)
指定模拟客户端的数量,也就是并发数据库的连接数量,默认值为1。用于测试连接池性能。
# 模拟4个客户端连接
./pgbench -c 4 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
# 模拟4个客户端连接,每个事物创建新的连接 -C
./pgbench -c 4 -C -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
# 模拟4个客户端连接,每个事物创建新的连接 -C,-j 使用4个线程
./pgbench -c 4 -C -j 4 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
-T (time)单次测试的运行时间
# 1分钟
-T 60
-t (transactions)指定事物
指定每个客户端运行多少个固定数量的事务就结束本次测试,默认10个
# 每个客户端执行20次事物
- t 20
-T -t 同时只能使用一种方式,要么指定时间,要么指定事务指定多少次
-R 用固定速率运行测试脚本
单位TPS
-L 超出阈值的事务报告
单位毫秒
./pgbench -T 10 -L 1 -c 8 -j 8 -f /usr/data/sql/bench_script_for_insert.sql@10 -f /usr/data/sql/bench_script_for_insert.sql@3 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
输出选项
-d 参数可以输出debug信息,通常不用
-P 参数,可以每隔一段时间输出一次测试结果,例如每隔2秒输出一次测试结果
/usr/local/postgres/postgresql-12.5/src/bin/pgbench/pgbench -P 2 -T 7200 -c 8 -j 8 -f /usr/data/sql/bench_script_for_insert.sql@10 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy
-l或–log 将每一个事物执行的时间记入一个名称为“pgbench_log.n“的日志文件中,如果使用-j 参数指定使用多线程,则会生成名称为“pgbench_log.n.m”的日志文件。
如果希望使用自定义前缀,使用–log-prefix prefix_name
/usr/local/postgres/postgresql-12.5/src/bin/pgbench/pgbench -T 10 -l --log-prefix=custom -c 6 -j 2 -f /usr/data/sql/bench_script_for_insert.sql@10 -h 192.168.1.253 -p 5432 -U postgres -d dzzh_db_copy