简介
pgbench是一种在PostgreSQL上运行基准测试的简单程序, 它是pg自带的工具;pgbench是一种在PostgreSQL上运行基准测试的简单程序。它可能在并发的数据库会话中一遍一遍地运行相同序列的 SQL 命令,并且计算平均事务率(每秒的事务数)。默认情况下,pgbench会测试一种基于 TPC-B 但是要更宽松的场景,其中在每个事务中涉及五个SELECT、UPDATE以及INSERT命令。但是,通过编写自己的事务脚本文件很容易用来测试其他情况。测试的目的是了解硬件的处理能力;通过调整参数优化数据库事务处理性能。
pgbench 的测试结果报告
transaction type:<builtin: TPC-B(sort of)>
scaling factor:500
query mode: prepared
number of clients:512
number of threads:10
duration:600 s
number of transactions actually processed:562451
latency average =546.467 ms
initial connection time =176.577 ms
tps =936.927622(without initial connection time)
transaction type 表明本次测试所使用的测试类型
scaling factor 表明pgbench在初始化时设置的数据量的比例因子
query mode 表明指定的查询模式,包括 simple查询模式(默认)、extended查询模式和prepared 查询模式
number of clients表明指定的客户端连接数
number of threads表明测试时每个客户端的线程数
number of transactions actually processed 测试结束时实际处理的事务数
latency average 测试过程的平均响应时间
tps 单位时间内执行的事务数
pgbench工具的使用
1 通过内置脚本进行测试
1.1 初始化测试数据
pgbench -i [ other-options ] dbname
pgbench -i会创建四个表pgbench_accounts、 pgbench_branches、pgbench_history以及pgbench_tellers,如果同名表已经存在会被先删除。如果你已经有同名表,一定注意要使用另一个数据库!
pgbench -i testdb
table_namecountspgbench_accounts100000pg_branches1pgbench_history0pg_tellers10
如果指定 -s 参数可以放大数据量: pgbench -i -s 500 testdb
table_namecountspgbench_accounts50000000pg_branches50pgbench_history0pg_tellers500
pgbench -i -s 500 -F 90 -h 10.229.89.210 -p 9393 -U postgres -d postgres==>典型案例
初始化选项
pgbench接受下列命令行初始化参数:
-i
–initialize
要求调用初始化模式。
-I init_steps
–init-steps=init_steps
只执行选出的一组普通初始化步骤。init_steps指定要被执行的初始化步骤,每一个步骤使用一个字符代表。每一个步骤都以指定的顺序被调用。默认是dtgvp。可用的步骤是:
d(删除)
删除任何已有的pgbench表。
t(创建表)
创建标准pgbench场景使用的表,即pgbench_accounts、pgbench_branches、pgbench_history以及pgbench_tellers。
g或G(生成数据、客户端或服务器端)
生成数据并且装入到标准的表中,替换掉已经存在的任何数据。
使用 g(客户端数据生成),数据在 pgbench 客户端生成,然后发送到服务器。 这通过 COPY 广泛使用客户端/服务器带宽。 使用 g 会导致日志记录每 100,000 行打印一条消息,同时为 pgbench_accounts 表生成数据。
使用G(服务器端数据生成),仅从pgbench客户端发送少量查询,然后在服务器中实际生成数据。 此变体不需要大量带宽, 但服务器将完成更多工作。 使用G会导致日志记录在生成数据时不打印任何进度消息。
默认的初始化行为使用客户端数据生成(相当于g)。
v(清理)
在标准的表上调用VACUUM。
p(创建主键)
在标准的表上创建主键索引。
f(创建外键)
在标准的表之间创建外键约束(注意这一步默认不会被执行)。
-F fillfactor
–fillfactor=fillfactor
用给定的填充因子创建表pgbench_accounts、pgbench_tellers以及pgbench_branches。默认是100。
-n
–no-vacuum
在初始化期间不执行清理(这个选项会抑制v初始化步骤,即便在-I中指定了该步骤)。
-q
–quiet
把记录切换到安静模式,只是每 5 秒产生一个进度消息。默认的记录会每 100,000 行打印一个消息,这经常会在每秒钟输出很多行(特别是在好的硬件上)。
如果在 -I 中指定了 G,则此设置无效。
-s scale_factor
–scale=scale_factor
将生成的行数乘以比例因子。例如,-s 100将在pgbench_accounts表中创建 10,000,000 行。默认为 1。当比例为 20,000 或更高时,用来保存账号标识符的列(aid列)将切换到使用更大的整数(bigint),这样才能足以保存账号标识符。
–foreign-keys
在标准的表之间创建外键约束(如果f在初始化步骤序列中不存在,这个选项会把它加入)。
–index-tablespace=index_tablespace
在指定的表空间而不是默认表空间中创建索引。
–partition-method=NAME
使用 NAME 方法创建一个分区的 pgbench_accounts 表。 预期值为 range 或 hash。 此选项要求 --partitions 设置为非零。 如果未指定,默认值为 range。
–partitions=NUM
创建一个分区 pgbench_accounts 表,其中 NUM 分区的大小与按比例缩放的帐户数几乎相等。 默认为 0,表示没有分区。
–tablespace=tablespace
在指定的表空间而不是默认表空间中创建表。
–unlogged-tables
把所有的表创建为非日志记录表而不是永久表。
基准选项
pgbench接受下列命令行基准参数:
-b scriptname[@weight]
–builtin=scriptname[@weight]
把指定的内建脚本加入到要执行的脚本列表中。@之后是一个可选的整数权重,它允许调节抽取该脚本的可能性。如果没有指定,它会被设置为 1。可用的内建脚本有:tpcb-like、simple-update和select-only。这里也接受内建名称无歧义的前缀缩写。如果用上特殊的名字list,将会显示内建脚本的列表并且立刻退出。
-c clients
–client=clients
模拟的客户端数量,也就是并发数据库会话数量。默认为 1。
-C
–connect
为每一个事务建立一个新连接,而不是只为每个客户端会话建立一个连接。这对于度量连接开销有用。
-d
–debug
打印调试输出。
-D varname=value
–define=varname=value
定义一个由自定义脚本(见下文)使用的变量。允许多个-D选项。
-f filename[@weight]
–file=filename[@weight]
把一个从filename读到的事务脚本加入到被执行的脚本列表中。@后面是一个可选的整数权重,它允许调节抽取该测试的可能性。详见下文。
-j threads
–jobs=threads
pgbench中的工作者线程数量。在多 CPU 机器上使用多于一个线程会有用。客户端会尽可能均匀地分布到可用的线程上。默认为 1。
-l
–log
把与每一个事务相关的信息写到一个日志文件中。
-L limit
–latency-limit=limit
对持续超过limit毫秒的事务进行独立的计数和报告, 这些事务被认为是迟到(late)了的事务。
在使用限流措施时(–rate=…),滞后于计划超过 limit毫秒并且因此没有希望满足延迟限制的事务根本 不会被发送给服务器。这些事务被认为是被跳过(skipped) 的事务,它们会被单独计数并且报告。
-M querymode
–protocol=querymode
要用来提交查询到服务器的协议:
simple:使用简单查询协议。
extended使用扩展查询协议。
prepared:使用带预备语句的扩展查询语句。
在prepared模式中,pgbench重用从第二次查询迭代开始的语法分析结果,因此pgbench运行速度比其他模式快。
-N
–skip-some-updates
运行内建的简单更新脚本。这是-b simple-update的简写。
-P sec
–progress=sec
每sec秒显示进度报告。该报告包括运行了多长时间、从上次报告以来的 tps 以及从上次报告以来事务延迟的平均值和标准偏差。如果低于限流值(-R),延迟会相对于事务预定的开始时间(而不是实际的事务开始时间)计算,因此其中也包括了平均调度延迟时间。
-r
–report-latencies
在基准结束后,报告平均的每个命令的每语句等待时间(从客户端的角度来说是执行时间)。详见下文。
-R rate
–rate=rate
按照指定的速率执行事务而不是尽可能快地执行(默认行为)。该速率 以 tps(每秒事务数)形式给定。如果目标速率高于最大可能速率,则 该速率限制不会影响结果。
-S
–select-only
执行内建的只有选择的脚本。是-b select-only简写形式。
-t transactions
–transactions=transactions
每个客户端运行的事务数量。默认为 10。
-T seconds
–time=seconds
运行测试这么多秒,而不是为每个客户端运行固定数量的事务。-t和-T是互斥的。
-v
–vacuum-all
在运行测试前清理所有四个标准的表。在没有用-n以及-v时, pgbench将清理pgbench_tellers 和pgbench_branches表,并且截断pgbench_history。
–aggregate-interval=seconds
聚集区间的长度(单位是秒)。仅可以与-l选项一起使用。通过这个选项,日志会包含针对每个区间的概要数据,如下文所述。
–log-prefix=prefix
设置–log创建的日志文件的文件名前缀。默认是pgbench_log。
–progress-timestamp
当显示进度(选项-P)时,使用一个时间戳(Unix 时间)取代从运行开始的秒数。单位是秒,在小数点后是毫秒精度。这可以有助于比较多种工具生成的日志。
–show-script=scriptname
在 stderr 上显示内置脚本 scriptname 的实际代码,并立即退出。
测试案例
内置:
create database testdb;
pgbench -i -F 90-s 500 testdb -p 5432-U postgres -d postgres // 初始化,填充率90%,放大倍数500
pgbench -c 256-j 10-M prepared -n -T 600-r -h 10.229.89.212-p 5678-U pg14 -d postgres
// 256 客户端连接, 每个客户端 10个线程, prepared 查询协议, 运行时间 600s,
pgbench -c 256-j 10-M prepared -n -t 10000-r -h 10.229.89.212-p 5678-U pg14
-d postgres >> 、home/postgres/test_data/1000_transaction_test.log
// 256 客户端连接, 每个客户端 10个线程, prepared 查询协议,运行事务数 10000,将结果输出至指定日志-T 与 -t 互斥
自定义测试
1 首先在指定数据库创建测试表
create table test(id int, age int);
2 准备数据
自定义脚本 insert.sql
\sleep 500ms
\set id random(1,100000)
\set age random(18,32)
insert into test(id, age) values(:id, :age);
3 测试结果
pgbench -f insert.sql -c 10 -j 10 -M prepared -n -T 600 -r -h 10.229.89.212 -p 5678 -U wp_pg14 -d postgres
transaction type: insert.sql
scaling factor:1
query mode: prepared
number of clients:10
number of threads:10
duration:600 s
number of transactions actually processed:11980
latency average =501.071 ms
initial connection time =4.248 ms
tps =19.957239(without initial connection time)
statement latencies in milliseconds:501.163 \sleep 500ms
0.065 \set id random(1,100000)0.036 \set age random(18,32)0.453 insert into test(id, age)values(:id,:age);
版权归原作者 Serendipity_Shy 所有, 如有侵权,请联系我们删除。