pgbench 性能测试工具介绍与使用

news/2024/7/9 22:14:32 标签: 数据库, postgresql

一、概括

pgbench是一种在PostgreSQL上运行基准测试的简单程序, 它是pg自带的工具;pgbench是一种在PostgreSQL上运行基准测试的简单程序。它可能在并发的数据库会话中一遍一遍地运行相同序列的 SQL 命令,并且计算平均事务率(每秒的事务数)。默认情况下,pgbench会测试一种基于 TPC-B 但是要更宽松的场景,其中在每个事务中涉及五个SELECT、UPDATE以及INSERT命令。但是,通过编写自己的事务脚本文件很容易用来测试其他情况。测试的目的是了解硬件的处理能力;通过调整参数优化数据库事务处理性能。

二、初始化

1、初始化测试数据

pgbench -i [ other-options ] dbname
pgbench -i会创建四个表pgbench_accounts、 pgbench_branches、pgbench_history以及pgbench_tellers,如果同名表已经存在会被先删除。如果你已经有同名表,一定注意要使用另一个数据库


pgbench -i testdb

table_name    counts
pgbench_accounts    100000
pg_branches    1
pgbench_history    0
pg_tellers    10


如果指定 -s 参数可以放大数据量: pgbench -i -s 500 testdb

table_name    counts
pgbench_accounts    50000000
pg_branches    50
pgbench_history    0
pg_tellers    500

2、初始化选项

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
把所有的表创建为非日志记录表而不是永久表。

三、基准测试

1、基准选项

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 的实际代码,并立即退出。

2、测试案例

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 互斥

3、自定义测试

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: <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、多运行几次测试是一个好主意,这样可以看看你的数字是不是可以重现;

2、注意自动清理进程autovacuum对测试的影响

3、初始化的比例因子(-s)应该至少和你想要测试的最大客户端数量一样大(-c),否则你将主要在度量更新争夺;因为在pgbench_branches表中只有-s行,并且每个事务都想更新其中之一,因此-c值超过-s将毫无疑问地导致大量事务被阻塞来等待其他事务。

4、pgbench的一个限制是在尝试测试大量客户端会话时,它自身可能成为瓶颈。 可以通过在数据库服务器之外的一台机器上运行pgbench来缓解,不过必须是具有低网络延迟的机器。甚至可以在多个客户端机器上针对同一个数据库服务器并发地运行多个pgbench实例。


http://www.niftyadmin.cn/n/5391432.html

相关文章

【Vue3】‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

问题 今天拿到别人项目的时候&#xff0c;我平时比较习惯用pnpm&#xff0c;我就使用pnpm i先下载依赖包&#xff0c;下载完成后&#xff0c;启动项目&#xff0c;就开始报以下错误&#xff01; 但是当我执行pnpm i的时候&#xff0c;vite不应该就已经被我下载下来了吗 研究了…

vue3 #组件通信#父传子#defineProps

//在父组件中 <template> <h1>父组件</h1> <Son :car"car" :money"money" /> //将数据传递给子组件 </template> <script setup lang"ts"> import { ref } from vue import Son from ./components/So…

2278. 企鹅游行(最大流,拆点)

活动 - AcWing 在南极附近的某个地方&#xff0c;一些企鹅正站在一些浮冰上。 作为群居动物&#xff0c;企鹅们喜欢聚在一起&#xff0c;因此&#xff0c;它们想在同一块浮冰上会合。 企鹅们不想淋湿自己&#xff0c;所以它们只能利用自己有限的跳跃能力&#xff0c;在一块块…

idea 打jar包、lib文件夹

idea目录文件 idea四层级结构 idea操作Java文件的基本单位&#xff1a;项目&#xff08;Project&#xff09;。对应四级结构 第1层级架构&#xff1a;项目&#xff08;project&#xff09; 在 IntelliJ IDEA 中Project是最顶级的结构单元&#xff0c;然后就是Module&#xf…

Android java中包的使用

一.包的使用 为了更好的实现项目中类的管理&#xff0c;提供包的概念。 package语句作为Java源文件的第一条语句&#xff0c;指明该文件中定义的类所在的包。(若缺省该语句&#xff0c;则指定为无名包)。 它的格式为&#xff1a;package 顶层包名.子包名 ; 二.java中主要的包…

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#x…

绘图机器(C 语言)

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目 绘图机器的绘图笔初始位置在原点(0,0) 机器启动后按照以下规则来进行绘制直线 尝试沿着横线坐标正…

chrome闪退后打不开问题 打开立即闪退

今天刚遇到&#xff0c;大概率是某些网站引起的闪退&#xff0c;重启和清理也不能解决问题 网上到处都是答非所问&#xff0c;还有什么打开chrome再进行设置这种回答 在此解决下 注意该方法根据我测试&#xff0c;唯一会损失的是chrome扩展&#xff0c;可以提前去 C:\Users…