使用pgbench对PostgreSQL进行压力测试

1、安装pgbench

yum install postgresql10-contrib

 

2、初始化pgbench使用的库

首先将shell切换到postgres用户下,使用psql新建一个测试用的数据库pgbench。

postgres=# CREATE DATABASE pgbench;
CREATE DATABASE
postgres=# \q

然后执行如下命令初始化pgbench库

# pgbench -i [option...] [dbname]
pgbench -i pgbench

默认会在pgbench库中初始化四张表:

table                   # of rows
---------------------------------
pgbench_branches        1
pgbench_tellers         10
pgbench_accounts        100000
pgbench_history         0

初始数据只有10万行,我们可以使用-s参数增加初始化时候的数据量

pgbench -i pgbench -s 100

3、使用默认的测试脚本

完成了测试库的初始化后,就可以使用不加-i参数的pgbench命令进行测试了。

# pgbench [options] dbname
pgbench pgbench

结果输出如下:

starting vacuum 表示清理缓存

transaction type 表示测试用的事务脚本类型(TPC-B measures throughput in terms of how many transactions per second a system can perform,TPC-B类型表示测试每秒处理事务个数)

scaling factor 表示比例因子,使用pgbench内建测试脚本的时候不需要理会该参数

query mode 表示查询协议,我也不知道什么意思=。=

number of clients 表示客户端数量

number of threads 表示工作线程数量

number of transactions per client 表示每个客户端执行的测试事务数量

number of transations actually processed 表示实际执行完成的事务数量(= 客户端数 * 每客户端执行事务数)

tps 表示每秒能处理多少个事务(transactions per second)

3.1 参数

-c clients
  模拟客户端的数量,也就是并发数据库会话的数量。缺省是1。

-C
  为每个事务建立一个新的连接,而不是每客户端会话只执行一次。 这对于测量连接开销是有用的。

-d
  打印调试输出。

-D varname=value
  定义一个自定义脚本使用的变量(见下文)。允许使用多个-D选项。

-f filename
  从filename中读取事务脚本,而不使用内建事务脚本。见下文获取细节。 -N、-S、和-f是互相排斥的。

-j threads
  pgbench中工作线程的数量。在多CPU的机器上使用多个线程会很有帮助。 客户端的数量必须是线程数量的倍数,因为每个线程都有相同数量的客户端会话管理。 缺省是1。

-l
  记录每个事务写入日志文件的时间。见下文获取细节。

-M querymode
  提交查询到服务器使用的协议:
    simple:使用简单的查询协议。
    extended:使用扩展的查询协议。
    prepared:使用带有预备语句的扩展查询协议。
  缺省是简单的查询协议。(参阅第 48 章获取更多信息。)

-n
  运行测试时不执行清理。如果你正在运行一个不包含标准表pgbench_accounts、 pgbench_branches、pgbench_history、和 pgbench_tellers的自定义测试,那么该选项是必需的。

-N
  不要更新pgbench_tellers和pgbench_branches。 这将避免争用这些表,但是它使得测试用例更不像TPC-B。

-r
  在benchmark完成后报告每个命令的平均每语句延迟(从客户的角度看的执行时间)。 见下文获取细节。

-s scale_factor
  在pgbench的输出中报告指定的比例因子。在内建的测试中,这不是必需的; 正确的比例因子将通过计数pgbench_branches表中的行数检测到。 不过,在测试自定义benchmark(-f选项)时,比例因子将报告为1,除非使用了该选项。

-S
  执行只有select的事务,替代类似TPC-B的测试。

-t transactions
  每个客户端运行的事务数量。缺省是10。

-T seconds
  运行测试这么多秒,而不是每客户端固定数量的事务。-t 和-T是互相排斥的。

-v
  在运行测试之前清理四个标准表。既不用-n也不用-v, pgbench将清理pgbench_tellers和pgbench_branches表, 截断pgbench_history表。

--aggregate-interval=seconds
  汇总时间间隔的长度(以秒计)。可能只与-l选项一起使用, 日志包含每间隔的总结(事务的数量、最小/最大延迟和可用于方差估计的两个额外字段)。
  目前在Windows上不支持这个选项。

--sampling-rate=rate
  采样率,在写入数据到日志时使用,以减少生成日志的数量。如果给出了这个选项, 则只记录指定比例的事务。1.0意味着记录所有事务,0.05意味着只记录了5%的事务。
  在处理日志文件时记得计算上采样率。例如,计算tps值时,需要乘以相应的数字 (比如,0.01的采样率,将只得到1/100的实际tps)。
# 测试10w个事务
pgbench pgbench -t 100000

# 测试300秒
pgbench pgbench -T 300

3.2 默认的事务脚本

pgbench默认使用内建的事务脚本进行测试,每个事务包括如下七个命令:

1. BEGIN;

2. UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;

3. SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

4. UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;

5. UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;

6. INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);

7. END;

如果你声明了-N,那么不包含步骤4和5。如果你声明了-S, 那么只发出SELECT

 

参考:http://www.postgres.cn/docs/10/pgbench.html

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top