pgbench
名称
pgbench -- 在PostgreSQL中执行基准线测试
大纲
pgbench -i [option...] [dbname]
pgbench [option...] [dbname]
描述
pgbench是一个用于在PostgreSQL数据库中运行基准测试的简单程序。pgbench在多个并发的数据库会话中反复运行一系列相同的SQL命令,并计算事务执行的平均速率(每秒执行的事务个数)。 pgbench默认测试的是一种基于TPC-B的松散的测试,即一个事务中包括5个SELECT,UPDATE和INSERT语句。同时允许基于开发者自己书写的事务脚本文件进行其他场景的测试。
典型的pgbench输出如下:
transactiontype: TPC-B (sort of)
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
tps = 85.184871 (including connections establishing)
tps = 85.296346 (excluding connections establishing)
前六行显示了一些非常重要的参数。接下来显示的是已经完成的事务和预计应该执行的事务个数。这两个数值应该是相等的,如果不相等说明存在执行失败的情况(如果指定为-T模式,则只打印实际完成的事务数量)。最后两行tps显示的是每秒完成的事务数量(包含连接建立时间和不包含连接建立时间分别计算出的平均值)。
默认的TPC-B-like事务测试需要预先设置特定的表。pgbench调用-i(初始化)选项来创建和填充这些表。在使用一个定制化脚本测试时,不需要调用-i选项初始化,但是需要对这个定制化脚本需要的表进行初始化。初始化过程类似如下:
pgbench -i [ other-options ] dbname
dbname用于指定一个可以用来测试的数据库的数据库名称。你可能需要指定-h,-p,-U等参数来连接数据库服务器。
选项
下面的选项分成三个不同类别,分别是使用在数据库初始化阶段,基准测试运行阶段或两个阶段都可以使用。
初始化选项
pgbench接受以下命令行参数:
-i
--initialize
调用初始化模式.
-F fillfactor
--fillfactor=fillfactor
使用给出的填充因子创建pgbench_accounts,pgbench_tellers,pgbench_branches等表.默认值是100.
-n
--no-vacuum
初始化后不执行vacuum。
-q
--quiet
日志模式切换为静默方式。即每五秒只打印一条进度信息,默认是每10万条记录打印一条日志,这样通常会有很多日志产生。
-s scale_factor
--scale=scale_factor
生成的行数乘以比例因子。比如,-s 100会在pgbench_accounts表中将会生成1000万条记录。默认值是1。当指定的参数超过20000时,为了能够容纳账户标识符的范围,保存这些信息的列字段类型会调整为大整形。
--foreign-keys
在默认创建的表上创建外键。
--index-tablespace=index_tablespace
在指定的表空间上创建索引。
--tablespace=tablespace
在指定的表空间上创建默认表。
--unlogged-tables
Create all tables as unlogged tables, rather thanpermanent tables.(创建临时表?)
基准测试选项
pgbench接受以下命令行基准测试参数参数:
-c clients
--client=clients
模拟的客户数量,具体指并发运行的数据库会话数。默认值为1。
-C
--connect
每个事务都新创建一个连接来执行,而不是仅使用一个客户端连接。这个对于测试连接过载是有意义的。
-d
--debug
打印调试信息
-D varname=value
--define=varname=value
定义一个客户定制脚本适用的变量。允许多个-D选项。
-f filename
--file=filename
从指定文件中读取事务脚本。具体参见下面的详细介绍。-N, -S和-f是互斥的。
-j threads
--jobs=threads
指定工作线程数量。在多核场景下使用多于一个线程是有意义的。由于每个线程会被分配相同数量的客户端数目,所以客户端数量必须设置为线程数目的整数倍。该参数默认值为1。
-l
--log
记录每个线程的耗时到日志文件中。详细内容见下文。
-M querymode
--protocol=querymode
用于向服务器提交查询的协议:
- simple: 使用简单协议.
- extended: 使用扩展协议.
- prepared: 使用扩展协议with prepared statements.
默认值为简单协议. (详细说明参考Chapter 49 。)
-n
--no-vacuum
测试运行前不执行vacuum。如果运行的是一个不包含默认表( pgbench_accounts, pgbench_branches, pgbench_history和pgbench_tellers.
)的定制测试时,这个选项是必要的。
-N
--skip-some-updates
不更新表pgbench_tellers和pgbench_branches.设置后会避免更新着两个表。但是这样返会使该测试与TPC-B测试产生差异。
-P sec
--progress=sec
每秒显示一次进度报告。报告包括已运行时间,上次报告到当前的tps、事务延迟时间、标准误差。节流(-R)模式下,误差是从事务计划开始时间计算,而不是实际的事务开始时间,因此,这个时间还包含了平均执行计划延迟时间。
-r
--report-latencies
基准测试运行完成后报告每个命令的平均延迟时间(从客户角度看到的执行时间)。详细内容见下文。
-R rate
--rate=rate
按执行速率执行事务,而不是尽可能快的运行(默认方式)。这个速率指定的是每秒的事务数。如果指定的速率比最大可能速率还大,则这个速率参数不会对结果产生影响。
速率以沿着Poisson-distributed计划时间线开始的事务为目标。期待的开始时间基于客户第一次启动时间向前,而不是最后一个事务的完成时间。这种方法意味着当事务经过了原先的计划结束时间,后续的事务仍然有可能赶上
The rate is targeted by starting transactions along aPoisson-distributed schedule time line. The expected start time schedule movesforward based on when the client first started, not when the previoustransaction ended. That approach means that when transactions go past theiroriginal scheduled end time, it is possible for later ones to catch up again.
当节流开关是有效的,则运行结束时报告的事务时延是从计划开始时间计算的,因此这个时间是包含了每个事务等待前一个事务完成的这段时间的。等待时间又称为计划延迟时间,并且它的平均时间和最大时间也会被分别输出。因此基于实际事务开始时间的事务时延,也就是,在数据库中执行事务实际花费的时间,可以用减去时延报告中的计划延迟时间来计算。
一个高的计划延迟时间表明系统无法以指定的速率、客户端数量和线程数来处理事务。当平均事务执行时间比事务执行间隔时间要长时,每个连续的事务将会下跌,测试的时间越长,计划延迟时间将会持续越长。当这些事情发生时,你需要降低定制的事务速率。
-s scale_factor
--scale=scale_factor
在pgbench报告中输出定制的比例因子。内置测试不需要设置这个参数。通过计算在pgbench_branches表中的行数,正确的比例因子将会被检测到。但是,如果通过-f运行客户定制的基准测试,比例因子会被报告为1,除非使用了这个参数。
-S
--select-only
运行select-only事务测试而不是TPC-B-like测试。
-t transactions
--transactions=transactions
每个客户端运行的事务数量,默认值为10.
-T seconds
--time=seconds
运行测试这么多秒,而不是每个客户端运行固定数量的事务。-t - t是互相排斥的。
-v
--vacuum-all
运行测试前先对四张基准表做vacuum。如果不指定-n也不执行-v,默认对表pgbench_tellers和pgbench_branches做vacuum并将pgbench_history表truncate掉。
--aggregate-interval=seconds
汇总时间间隔长度。只有-l和这个参数同时使用才有效。日志包含每个间隔的概要(事务数量,最大最小时延和两个额外的用于方差估计的字段)
--sampling-rate=rate
抽样速率,将数据写入日志时使用,用于降低生产的日志数量。如果设置了这个参数,只有指定的事务部分才会被记录。1.0表示所有事务都被记录。0.05表示只有5%的事务会被记录。当处理日志文件时记得考虑采样率。例如,当计算tps值,你需要乘上对应的数量(比如0.01采样率,你实际只是获得了1/100的实际tps)。
通用参数
pgbench接受以下命令行常见参数:
-h hostname
--host=hostname
数据库服务器主机名称
-p port
--port=port
数据库服务器端口号
-U login
--username=login
用来登陆的数据库用户名称
-V
--version
打印pgbench版本
-?
--help
显示pgbench命令帮助信息
说明
在pgbench中运行的所谓的“事务”是什么?
默认的事务脚本在每个事务中执行如下七条语句:
- BEGIN;
- UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
- SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
- UPDATE pgbench_tellers SET tbalance = 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;
如果你指定了-N,第4步和第5步不会执行。如果指定了-S,则只有select语句会执行。
部分示例:
1.初始化:
pgbench -i pgbench
如果端口号有变化,需要先手动创建数据库,再执行。
pgbench -i -s 10 -p 5433 pgbench
重点:主要用到两个参数,-i:初始化模式,-s 插入的倍数,默认是1,即插入100000条;也就是执行多少次generate_series(1,100000)。
2.测试 :
pgbench -T 20 -c 1000 -j 5 -r pgbench -p 5432 -U pgsql