pgbench是PostgreSQL自带的一个数据库压力测试工具,
支持TPC-B测试模型, 或自定义测试模型.
自定义测试模型支持元命令, 调用shell脚本, 设置随机数, 变量等等.
支持3种异步接口[simple|extended|prepared]
参数详解列表
// TPC-B测试模型的初始化数据参数. Initialization options: -i invokes initialization mode //初始化参数 -F NUM fill factor -n do not run VACUUM after initialization // 使用自定义测试模型时, 请带上这个参数. -q quiet logging (one message each 5 seconds) -s NUM scaling factor --foreign-keys create foreign key constraints between tables //表之间添加主外键;更加贴近线上环境 -index-tablespace=TABLESPACE create indexes in the specified tablespace --tablespace=TABLESPACE create tables in the specified tablespace --unlogged-tables create tables as unlogged tables // 压力测试相关参数 Benchmarking options: -c NUM number of concurrent database clients (default: 1) // 指定pgbench连接到数据库的连接数 -C establish new connection for each transaction // 是否使用短连接 -D VARNAME=VALUE // 设置变量, 在自定义脚本中使用:varname 引用. 可使用多个-D设置多个变量. -f FILENAME read transaction script from FILENAME // 指定自定义的测试文件(由元命令和SQL组成), 可使用多个-f 指定多个文件, 每个文件作为一个事务, 每次执行事务时随机选择一个文件执行. -j NUM number of threads (default: 1) // pgbench的工作线程. 为-c一起用;为-c的约数 -l write transaction times to log file // 开启事务统计, 输出文件名格式pgbench_log.$PID.$threadID , (当-j >= 2时, threadID从1开始) -M simple|extended|prepared // libpq接口 default: simple -n do not run VACUUM before tests // vacuum开关, 使用自定义文件时, 使用-n关闭vacuum. -N do not update tables "pgbench_tellers" and "pgbench_branches" // TPC-B 非默认测试模式, 少两个表的更新. -r report average latency per command // 报告测试文件中每条命令(包括元命令和SQL)的平均执行延迟. -s NUM report this scale factor in output // 使用自定义脚本测试时, 指定scale的输出. 没有实质意义. -S perform SELECT-only transactions // TPC-B 非默认测试模式, 只查询. -t NUM number of transactions each client runs (default: 10) // 指定每个连接的执行事务数. -T NUM duration of benchmark test in seconds // 指定总的压力测试时间. 与-t不能同时使用. -v vacuum all four standard tables before tests // 测试前先vacuum 4个和tpc-b相关的表. --aggregate-interval=NUM // 输出聚合后的事务统计信息. 与-l连用 //Common options: -d, --debug print debugging output -h, --host=HOSTNAME database server host or socket directory -p, --port=PORT database server port number -U, --username=USERNAME connect as specified database user -V, --version output version information, then exit -?, --help show this help, then exit
一 初始化;这里我使用了自己的数据库mydb;数据用户lottu
pgbench -i -s --foreign-keys --unlogged-tables -U lottu mydb
操作之后会在数据库里面生成下面的表
mydb=> \dt pgbench* List of relations Schema | Name | Type | Owner --------+------------------+-------+------- public | pgbench_accounts | table | lottu public | pgbench_branches | table | lottu public | pgbench_history | table | lottu public | pgbench_tellers | table | lottu ( rows)
二 压力测试演示
-U lottu mydb starting vacuum...end. --默认是非n模式 transaction type: TPC-B (sort of) scaling factor: --跟上面初始化-s 10一致的 query mode: prepared -- -M prepared 默认为simple --客户端连接有10个 -c 10 --线程为2个 -j2 duration: s --时间为10s -T 10 latency average: 0.681 ms tps = 14687.531247 (including connections establishing) tps = 14690.762892 (excluding connections establishing) statement latencies in milliseconds: * :scale * :scale * :scale :naccounts :nbranches :ntellers 0.034427 BEGIN; 0.094350 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; 0.064211 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; 0.110995 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; 0.154680 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 0.155552 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 0.052141 END; --使用-l参数结合 --aggregate-interval 演示 [postgres@sdserver40_210 ~]$ pgbench -M extended --aggregate-interval 2 -l -c 2 -j 2 -T 10 -U lottu mydb starting vacuum...end. transaction type: TPC-B (sort of) scaling factor: query mode: extended duration: s latency average: 0.884 ms tps = 2261.073893 (including connections establishing) tps = 2261.413071 (excluding connections establishing) --这样会生成文件 * -rw-rw-r-- 1 postgres postgres 211 Jun 28 16:37 pgbench_log.5160 -rw-rw-r-- 1 postgres postgres 210 Jun 28 16:37 pgbench_log.5160.1 查看文件内容可以判断测试结果! 这5列分别代表 interval_start // epoch时间, 指这个统计段的开始时间. num_of_transactions // 这个统计段运行了多少个"事务", 指独立的文件运行次数. latency_sum // 这个统计段的事务执行总耗时, 单位微秒. latency_2_sum // 这个统计段的事务执行耗时平方的总和, 单位微秒. min_latency // 这个统计段内, 单个事务的最小耗时. max_latency // 这个统计段内, 单个事务的最大耗时.
--参考德哥视频讲解