PostgreSQL测试工具PGbench

pgbench 是一个简单的给 PostgreSQL 做性能测试的程序。它反复运行同样的 SQL 命令序列,可能是在多个并发数据库会话上头,然后检查平均的事务速度(每秒的事务数 tps)。缺省的时候,pgbench 测试一个(松散的)接近 TPC-B 的情况,每个事务包括五个 SELECT,UPDATE,和 INSERT命令。不过,我们可以很轻松地使用自己的事务脚本文件来实现其它情况。

典型的输出看上去会是这样:

transaction type: TPC-B (sort of)
scaling factor: 10
number of clients: 10
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)

头四行只是报告一些最重要的参数设置。跟着的一行报告完成的事务数和期望完成的事务数(后者只是客户端数乘以事务数);这两个会相等,除非在完成之前运行就失败了。最后两行报告 TPS 速率,分别有计算启动数据库会话时间和不计算启动会话时间的。

使用环境:

在比较新的9.1,9.2,9.3数据库的发行版本中,pgbench是在安装contrib包时直接编译的,可以在postgres的bin目录下找到该命令,如果没有发现该命令可以在安装contrib的目录下找到pgbench的源码文件包,编译一下就可以使用。

1. pgbench测试库初始化

postgres$ pgbench --help                 # 和postgres其他命令的使用方式一样,--help获取命令使用方式的简单介绍
postgres$ createdb pgbench               # 创建测试库
postgres$ pgbench -i pgbench             # 初始化测试库

默认会在测试库中建4张表pgbench_accountspgbench_branchespgbench_historypgbench_tellers 。当然也可以自己建表,自己写测试脚本,这四张表只是默认的测试脚本会用到。

pgbench在建默认库时 -s 参数设定测设表的大小,默认参数是1 。pgbench_accounts 总行数是10W,-s后面接具体数值如100,则pgbench_accounts中的测试数据将达到1千万行

2. 默认的测试脚本介绍

默认的测试脚本可以在官方文档中找到(新的版本中不指定模板就会使用默认模板)

$ cat test.sql
\set nbranches 1 * :scale
\set ntellers 10 * :scale
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
\setrandom bid 1 :nbranches
\setrandom tid 1 :ntellers
\setrandom delta -5000 5000
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;

脚本说明:

可以看到脚本中的一个事物包含了update,select,insert操作,不同的操作起到不同的测试目的

  • (1)UPDATE pgbench_accounts:作为最大的表,起到促发磁盘I/O的作用。
  • (2)SELECT abalance:由于上一条UPDATE语句更新一些信息,存在于缓存内用于回应这个查询。
  • (3)UPDATE pgbench_tellers:职员的数量比账号的数量要少得多,所以这个表也很小,并且极有可能存在于内存中。
  • (4)UPDATE pgbench_branches:作为更小的表,内容被缓存,如果用户的环境是数量较小的数据库和多个客户端时,对其锁操作可能会成为性能的瓶颈。
  • (5)INSERT INTO pgbench_history:history表是个附加表,后续并不会进行更新或查询操作,而且也没有任何索引。相对于UPDATE语句,对其的插入操作对磁盘的写入成本也很小。

3. 测试结果说明

postgres$ pgbench -c 15 -t 300 pgbench -r -f test.sql             #执行命令
starting vacuum...end.
transaction type: Custom query
scaling factor: 1
query mode: simple
number of clients: 15                                            #-c参数控制并发量
number of threads: 1
number of transactions per client: 300                           #每个客户端执行事务的数量
number of transactions actually processed: 4500/4500             #总执行量
tps = 453.309203 (including connections establishing)            #tps每秒钟处理的事务数包含网络开销
tps = 457.358998 (excluding connections establishing)            #不包含网络开销
statement latencies in milliseconds:                             #带-r的效果,每个客户端事务具体的执行时间,单位是毫秒
0.005198 \set nbranches 1 * :scale
0.001144 \set ntellers 10 * :scale
0.001088 \set naccounts 100000 * :scale
0.001400 \setrandom aid 1 :naccounts
0.000814 \setrandom bid 1 :nbranches
0.000929 \setrandom tid 1 :ntellers
0.000981 \setrandom delta -5000 5000
0.613757 BEGIN;
1.027969 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.754162 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
14.167980 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
13.587156 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.582075 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
1.628262 END;

默认的基准测试给出了一个指标TPS,同样的测试参数,tps的值越高,相对来说服务器的性能越好。上面的测试由于数据量的问题,表的内容全部缓存进了内存,磁盘io对上面的结果影响较小。

4. 自定义测试环境

在实际的应用中测试可以自己定义测试环境,模拟生产需求。

测试举例

pgbench=# create table pg_test (a1 serial,a2 int,a3 varchar(20),a4 timestamp);                        #创建测试表
postgres$cat pg_test.sql
pgbench=# insert into pg_test(a2,a3,a4) select (random()*(2*10^5)),substr('abcdefghijklmnopqrstuvwxyz',1, (random()*26)::integer),now();
                                                                                                      #每个事务插入一条数据
postgres$pgbench -c 90 -T 10 pgbench -r -f pg_test.sql                                                   #90个并发测试每秒插入的数据量

测试结果截取:

number of transactions actually processed: 20196             #10秒钟90并发用户共插入20196条数据,每条数据插入费时42ms,平均每秒插入2000条数据
tps = 1997.514876 (including connections establishing)
tps = 2119.279239 (excluding connections establishing)
statement latencies in milliseconds:
42.217948

pgbench=# select count(*) from pg_test;
count
-------
20196

5. pgbench在参数调节上的辅助使用

简单举例:work_mem

postgres=# show work_mem ;                                              #数据库当前的work_mem
work_mem
----------
1MB

查询样本:

postgres$cat select.sql
SELECT customerid FROM customers ORDER BY zip;                          #orders表是一张postgres样例表,样例库全名dellstore2
postgres$pgbench -c 90 -T 5 pgbench -r -f select.sql                    #多用户并发做单表排序操作单个事务执行的时间可能会很大,但是平均事务执行时间和单个用户的执行时间差距没那么明显。

执行结果截取

number of clients: 90
number of threads: 1
duration: 5 s
number of transactions actually processed: 150
tps = 26.593887 (including connections establishing)
tps = 27.972988 (excluding connections establishing)
statement latencies in milliseconds:
3115.754673 SELECT customerid FROM customers ORDER BY zip;

测试环境相同调节work_mem参数为2M试试

number of clients: 90
number of threads: 1
duration: 5 s
number of transactions actually processed: 243
tps = 44.553026 (including connections establishing)
tps = 47.027276 (excluding connections establishing)
statement latencies in milliseconds:
1865.636761 SELECT customerid FROM customers ORDER BY zip;             #5s内事务执行的总量明显增加一共做了243次单表排序

原因分析,由于排序操作会关系到work_mem,排序操作能全在缓存中进行当然速度会明显加快,查看执行计划

postgres=# explain analyze SELECT customerid FROM customers ORDER BY zip;
QUERY PLAN 

--------------------------------------------------------------------------------------------
Sort (cost=2116.77..2166.77 rows=20000 width=8) (actual time=42.536..46.117 rows=20000 loo
ps=1)
Sort Key: zip
Sort Method: external sort Disk: 352kB
-> Seq Scan on customers (cost=0.00..688.00 rows=20000 width=8) (actual time=0.013..8.9
42 rows=20000 loops=1)
Total runtime: 48.858 ms

由上面的执行计划可以看出在work_mem大小为1M的时候排序一共需要1.352M空间做排序,所以加大work_mem参数排序速度明显增加。

这只是个简单的例子,work_mem的大小调节还有很多其他方面要考虑的,比如在高并发的情况下,需要为每个用户分配同样大小的排序空间,会占用大量的内存空间。参数调节在任何时候保持一个均衡才是应该考虑的。

时间: 2024-09-20 06:29:45

PostgreSQL测试工具PGbench的相关文章

最好用的17个渗透测试工具

本文讲的是 最好用的17个渗透测试工具, 渗透测试,是专业安全人员为找出系统中的漏洞而进行的操作.当然,是在恶意黑客找到这些漏洞之前.而这些业内安全专家各自钟爱的工具各种各样,一些工具是公开免费的,另一些则需要支付费用,但这篇文章向你保证,值得一看. 1. Nmap 2017年9月1日是Nmap的20岁生日.从诞生之初,Nmap就一直是网络发现和攻击界面测绘的首选工具.从主机发现和端口扫描,到操作系统检测和IDS规避/欺骗,Nmap是大大小小黑客行动的基本工具. 与Nmap类似,Aircrack

测试工具-后台数据库入侵|后台数据库渗透测试。后台数据库导入!!

问题描述 后台数据库入侵|后台数据库渗透测试.后台数据库导入!! QQ200832005渗透测试方面的单子(可兼职也可接私活) 技能要求 具有至少1年以上的职业黑客攻击经验,并实际操作过各类项目,拒绝理论派.熟悉渗透测试服务器提权方面. 1.掌握MySQL.MSSQL.Oracle.PostgreSQL等一种或多种主流数据库结构以及特殊性. 2.熟悉渗透测试的步骤.方法.流程.熟练掌握各种渗透测试工具. 3.有主机.网络或Web安全渗透测试相关项目实施经验&. 4.对网站/服务器的结构有敏锐的洞

软件测试-linux代码覆盖率测试工具gcov的一些疑问?

问题描述 linux代码覆盖率测试工具gcov的一些疑问? 鄙人是做软件测试的,最近在使用gcov来检查代码覆盖率,我已经成功生成了一份关于touchscreen测试代码的gcov文件,但是领导说这不是他想要的...所以我想请教一下大家:1. 如果我想测试平台上的touchscreen模块,那么目的肯定是这样:首先我要看下我写的测试code是否存在多余的根本跑不到的代码,如果有,那我肯定要优化我的测试代码:其次,我肯定也要看我写的代码在linux kernel里面的覆盖情况,如果我写的测试代码在

IETester中文免费版 – 最佳网页IE浏览器兼容性测试工具

IETester中文免费版 – 最佳网页IE浏览器兼容性测试工具(IE6 IE7 IE8共存) 对于很多拥有自己博客或者接触网页制作的朋友,肯定会遇到自己辛苦写好的页面在不同的浏览器下显示出来的效果截然不同吧,喜欢追求完美的朋友就肯定希望能尽量在不同浏览器下对页面进行测试并保证其正常显示了.当然,像FireFox.Safari.Opera等浏览器还可以随意地安装卸载,然而,最麻烦的莫过于微软的"IE"系列了. 基本上你不能用常规的方法同时在一个系统中安装IE5.IE6.IE7甚至IE8

压力测试工具——Galting

为什么要写Gatling呢?网上已经有一些介绍Gatling的好文章了,比如两位TW同事的文章,可以看这里(我知道Gatling也是因为这位作者介绍的),还有这里.主要是因为最近在使用Gatling做压力测试,感觉这个工具非常好用,所以想结合自己的使用情况也推荐一下.Gatling是基于scala写的一个开源的压力测试工具,它的特点是简单易用,测试报告简洁漂亮,api通俗易懂.   JDK1.7 Gatling是基于jdk1.7开发的,所以还在用jdk1.6的同学需要先下载jdk1.7,才可以启

压力测试工具ab.exe简介

一.介绍在安装apache时其bin目录下可以找到ab.exe文件,也可以单独下载该文件.这是一个小压力测试工具. 二.使用cmd面板中切换到该文件所在路径,输入ab -help查看帮助. 常用命令 ab -n 1000 -c 100  http://127.0.0.1:8080/testDemo 这行命令的含义是: -n 1000发出表示1000个请求, -c 100表示100个并发数去访问该个项目.若运行正常,会显示出运行的相关信息.若没有反应或者无返回,可能要考虑程序的内存处理相关问题了.

windows系统中安装Jmeter压力测试工具

  Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可以用于测试静态和动态资源例如静态文件.Java 小服务程序.CGI 脚本.Java 对象.数据库, FTP 服务器, 等等.JMeter 可以用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能. JMeter的作用 1.能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样

web压力测试工具apache

现在很多web压力测试工具都是收费的,但是apache却自带了一个免费的压力测试工具,即ab工具(命令).具体可在Apache的根目录下的bin目录里面,找到一个ab.exe文件就是.用它可以粗略检测一下自己的程序性能如何. 具体用法如下,摘抄自网上.如有错误,还请指正. 格式 ab [options] [http://]hostname[:port]/path 参数 -n requests     Number of requests to perform //在测试会话中所执行的请求个数.默

硬盘测试工具victoria4.3图文教程

最好的硬盘测试工具,原因1:通吃各种接口硬盘,原因2:可视化的用户界面(MS现在没人这样说了),原因3:可以在WINDOWS下使用,而且其本身也是一款G-list级的坏道修复软件... victoria号称WINDOWS版本的MHDD,虽然4.3版本早在07年就已发布,但还是够资格称为最好的硬盘测试工具,原因1:通吃各种接口硬盘,原因2:可视化的用户界面(MS现在没人这样说了),原因3:可以在WINDOWS下使用,而且其本身也是一款G-list级的坏道修复软件,但现在网上流行的基本都是测试版本,