pgbench是基于tpc-b模型的postgresql测试工具。它属于开源软件,主要为数据管理人员提供性能测试使用。

pgbench 是对 PostgreSQL 进行压力测试的一款简单程序, SQL 命令可以在一个连接中顺序地
执行,通常会开多个数据库 Session, 并且在测试最后形成测试报告,得出每秒平均事务数,pgbench
可以测试 select,update,insert,delete 命令,用户可以编写自己的脚本进行测试。

安装:

在postgresql安装源包中,进入源码的contrib目录,进入pgbench目录,通过make all  ;make install单独安装。

先创建一个数据库,名字为:pgbench
createdb pgbench
初使用pgbench的数据:
pgbench -i pgbench
pgbehch的使用帮助:
pgbehch --help
 
测试命令:
pgbench -c 10 -t 100 pgbench

osdba@osdba:~$ pgbench -c 10 -t 100 pgbench
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: simple
number of clients: 10
number of transactions per client: 100
number of transactions actually processed: 1000/1000
tps = 80.658281 (including connections establishing)
tps = 81.499400 (excluding connections establishing)

-c clients 模拟的客户数,也就是并发数据库会话数目。缺省是 1。
-t transactions 每个客户端跑的事务数目。缺省是 10。

pgbench命令具体参数如下

 pgbench [OPTIONS]... [DBNAME]

初始化操作参数如下:
  -i           初始化模式

  -F NUM       fill factor
  -s NUM       销售端个数

测试参数:
  -c NUM       测试时模拟客户端个数,不指定默认为1

  -C           设置为每一个事务建立一个新的连接

  -D VARNAME=VALUE
               传递测试脚本中变量值

  -f FILENAME  测试脚本位置,不指定默认pgbench自带脚本

  -j NUM       启动线程数默认为1

  -l          定向输出日志文件

  -M {simple|extended|prepared}
               protocol for submitting queries to server (default: simple)
  -n           测试前不执行vacuum操作

  -N          不对"pgbench_tellers" 和"pgbench_branches"表进行update操作
  -r           在测试结果中显示脚本中每条指令的平均延时

  -s NUM       在测试结果中显示销售端个数

  -S           perform SELECT-only transactions
  -t NUM      每个客户端执行事务次数,默认为10

  -T NUM      测试时间设置,单位为秒

  -v           执行测试前对库中四个基准表进行vacuum操作

命令参数:
  -d           在测试过程中输出debug信息

  -h HOSTNAME  数据库服务器ip

  -p PORT      数据库端口

  -U USERNAME  连接数据库用户名

  --help       显示命令帮助

  --version    输出pgbench版本信息

   -F NUM     和 -M {simple|extended|prepared}这两个参数含义不太了解


pgbench测试脚本如下

默认

static char *tpc_b = {
 "\\set nbranches :scale\n"
 "\\set ntellers 10 * :scale\n"
 "\\set naccounts 100000 * :scale\n"
 "\\setrandom aid 1 :naccounts\n"
 "\\setrandom bid 1 :nbranches\n"
 "\\setrandom tid 1 :ntellers\n"
 "\\setrandom delta -5000 5000\n"
 "BEGIN;\n"
 "UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;\n"
 "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
 "UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;\n"
 "UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;\n"
 "INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
 "END;\n"
};

/* -N case */
static char *simple_update = {
 "\\set nbranches :scale\n"
 "\\set ntellers 10 * :scale\n"
 "\\set naccounts 100000 * :scale\n"
 "\\setrandom aid 1 :naccounts\n"
 "\\setrandom bid 1 :nbranches\n"
 "\\setrandom tid 1 :ntellers\n"
 "\\setrandom delta -5000 5000\n"
 "BEGIN;\n"
 "UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;\n"
 "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
 "INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);\n"
 "END;\n"
};

/* -S case */
static char *select_only = {
 "\\set naccounts 100000 * :scale\n"
 "\\setrandom aid 1 :naccounts\n"
 "SELECT abalance FROM pgbench_accounts WHERE aid = :aid;\n"
};

这些在源码文件夹的pgbench.c中可以看到。我们也可以自己写脚本文件,然后在运行pgbench的时候加参数-f指定脚本。

由此可见,其实pgbench的测试脚本还是很简单的,也有许多局限性。以后我们还会介绍另一个工具——pgbench-tool。它在一定程度上对pgbench进行了完善,虽然他也是调用pgbench。


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐