当前位置:   article > 正文

postgresql性能测试工具pgbench的使用教程_pg性能测试

pg性能测试

一、简介

pgbench 是 PostgreSQL 数据库的官方性能测试工具,它用于模拟数据库工作负载,执行事务和查询,以评估 PostgreSQL 数据库的性能。pgbench 的主要用途是测量数据库的吞吐量、延迟和并发性能。下面是关于 pgbench 的一些重要信息:

pgbench 主要功能和用途

  • 性能测试:pgbench 允许您模拟多个并发用户,执行包含插入、更新、删除和查询等操作的数据库事务,以测量数据库的性能。您可以调整并发用户数、测试时间和事务脚本以适应您的需求。
  • 模拟工作负载:通过提供灵活的事务脚本,pgbench 可以模拟不同类型的数据库工作负载,包括读取密集型、写入密集型和混合型。这使您能够评估数据库在不同负载下的性能表现。
  • 测量吞吐量和延迟:pgbench 输出包括每秒事务数(TPS)、每秒查询数(QPS)以及平均事务响应时间等性能指标,使您能够评估数据库的性能表现。
  • 并发性测试:您可以通过配置并发用户数来测试数据库的并发性能。这有助于确定数据库在多个客户端同时访问时的表现。

默认情况下,pgbench会测试一种基于 TPC-B 但是要更宽松的场景,其中在每个事务中涉及五个SELECT、UPDATE以及INSERT命令。但是,可以通过编写自己的事务脚本文件很容易用来测试其他情况。测试的目的是了解硬件的处理能力;通过调整参数优化数据库事务处理性能。

二、使用内置脚本测试

1. 创建测试数据库

新建一个空白数据库,用于测试

postgres=# create database <dbname>;
  • 1

2. 初始化数据库

pgbench -i -U <user> -d <dbname> -h <host>
  • 1

pgbench -i会创建四个表pgbench_accounts、 pgbench_branches、pgbench_history以及pgbench_tellers,如果同名表已经存在会被先删除。

pgbench=# \dt
              List of relations
 Schema |       Name       | Type  |  Owner   
--------+------------------+-------+----------
 public | pgbench_accounts | table | postgres
 public | pgbench_branches | table | postgres
 public | pgbench_history  | table | postgres
 public | pgbench_tellers  | table | postgres
(4 rows)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

初始化选项

Initialization options:
  -i           invokes initialization mode
  -F NUM       fill factor
  -s NUM       scaling factor
  --index-tablespace=TABLESPACE
               create indexes in the specified tablespace
  --tablespace=TABLESPACE
               create tables in the specified tablespace
  --unlogged-tables
               create tables as unlogged tables
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • -F: 填充因子,用给定的百分比填充4个表,默认是100。
  • -s: 比例因子,将生成的行数乘以给定的数,例如,在默认情况下,比例因子为1,pgbench_accounts表会创建100,000行,当-s 100 即会创建10,000,000行。
  • --index-tablespace: 在给定的表空间而不是默认空间中创建索引。
  • --tablespace:在指定的表空间而不是默认表空间中创建表。
  • --unlogged-tables:把所有的表创建为非日志记录表而不是永久表。

-F-s两者都用于控制初始化操作的数据规模,选择使用哪一个取决于测试的需求,但通常来说,-s 更常见。

3. 基准测试

基准选项:

Benchmarking options:
  -c NUM       number of concurrent database clients (default: 1)
  -C           establish new connection for each transaction
  -D VARNAME=VALUE
               define variable for use by custom script
  -f FILENAME  read transaction script from FILENAME
  -j NUM       number of threads (default: 1)
  -l           write transaction times to log file
  -M simple|extended|prepared
               protocol for submitting queries to server (default: simple)
  -n           do not run VACUUM before tests
  -N           do not update tables "pgbench_tellers" and "pgbench_branches"
  -r           report average latency per command
  -S           perform SELECT-only transactions
  -t NUM       number of transactions each client runs (default: 10)
  -T NUM       duration of benchmark test in seconds
  -v           vacuum all four standard tables before tests
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • -c: 模拟的客户端数量,也就是并发数据库会话数量。默认为 1。
  • -C:为每一个事务建立一个新连接,而不是只为每个客户端会话建立一个连接。这对于度量连接开销有用。
  • -D: 为用户自定义脚本传递参数VARNAME=VALUE,可传递多组。
  • -f: 自定义脚本名称
  • -j: pgbench中的工作者线程数量。在多 CPU 机器上使用多于一个线程会有用。客户端会尽可能均匀地分布到可用的线程上。默认为 1。
  • -l:把与每一个事务相关的信息写到一个日志文件中。
  • -M:要用来提交查询到服务器的协议:
      simple:使用简单查询协议。
      extended使用扩展查询协议。
      prepared:使用带预备语句的扩展查询语句。
  • -n:运行性能测试之前不执行 VACUUM 操作。VACUUM 是 PostgreSQL 数据库中的一项维护任务,用于清理和重新组织表中的数据以提高性能。
  • -N:默认情况下,pgbench 在性能测试期间会更新pgbench_tellerspgbench_branches这两个表,以模拟数据库的写入操作。然而,有时在性能测试中,您可能希望禁止对这两个表的更新,以更好地模拟只读操作的性能场景,-N正是此作用。
  • -r:在基准结束后,报告平均的每个命令的每语句等待时间(从客户端的角度来说是执行时间)。
  • -S:执行内建的只有选择的脚本。是-b select-only简写形式。
  • -t :每个客户端运行的事务数量。默认为 10。
  • -T :运行测试这么多秒,而不是为每个客户端运行固定数量的事务。-t和-T是互斥的。
  • -v:在运行测试前清理所有四个标准的表。在没有用-n以及-v时, pgbench将只清理pgbench_tellers 和pgbench_branches表,并且截断pgbench_history。

测试示例:

pgbench -i -s 500 -p 5432 -U postgres -d postgres   // 初始化,放大倍数500

pgbench -c 256 -j 10  -M extended -n -T 600 -r -h 10.229.89.212 -p 5678 -U postgres -d postgres
// 256 客户端连接, 每个客户端 10个线程, extended查询协议,不清理, 运行时间 600s,报告用时

pgbench -c 256 -j 10  -M extended -v -t 10000 -r -h 10.229.89.212 -p 5678 -U postgres 
-d postgres
// 256 客户端连接, 每个客户端 10个线程, extended查询协议,清理,运行事务数 10000,报告用时
// -T-t 互斥
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. 测试数据分析

[root@bolin-postgresql ~]# pgbench -c 10 -j 2  -M extended -v -t 100 -r -h localhost -U postgres -d pgbench
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: extended
number of clients: 10
number of threads: 2
number of transactions per client: 100
number of transactions actually processed: 1000/1000
tps = 45.268234 (including connections establishing)
tps = 45.289643 (excluding connections establishing)
statement latencies in milliseconds:
	7.734936	\set nbranches 1 * :scale
	0.008262	\set ntellers 10 * :scale
	6.142559	\set naccounts 100000 * :scale
	6.582939	\setrandom aid 1 :naccounts
	0.006482	\setrandom bid 1 :nbranches
	0.006836	\setrandom tid 1 :ntellers
	0.006862	\setrandom delta -5000 5000
	0.110211	BEGIN;
	0.179985	UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
	0.115581	SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
	72.071510	UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
	125.667481	UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
	0.165142	INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
	1.431625	END;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. transaction type: TPC-B (sort of):事务类型。这里指明测试使用了 TPC-B 类似的事务,表明测试是模拟了一种类似于 TPC-B 基准测试的工作负载。
  2. scaling factor: 1:比例因子。这是数据库规模的指标,通常用于模拟数据库的大小。1 表示数据库规模是原始大小,没有扩展。
  3. query mode: extended:查询模式。这是指 pgbench 使用的查询模式,这里是扩展查询模式,表示测试中包含了较复杂的查询。
  4. number of clients: 10:客户端数量。测试中模拟的并发客户端数量,即同时连接到数据库的客户端数。
  5. number of threads: 2:线程数量。每个客户端使用的线程数量,这里是每个客户端使用 2 个线程。
  6. number of transactions per client: 100:每个客户端执行的事务数。每个客户端模拟执行的事务数量。
  7. number of transactions actually processed: 1000/1000:实际处理的事务数量。这表示测试成功执行了 1000 个事务,与预期的 1000 个事务相符。
  8. tps = 45.268234 (including connections establishing):每秒事务数(TPS),包括连接建立。这是测试期间数据库处理的平均事务数量,包括连接建立的时间。在这个数据中,每秒完成了大约 45.27 个事务。
  9. tps = 45.289643 (excluding connections establishing):每秒事务数(TPS),不包括连接建立。这是测试期间数据库处理的平均事务数量,不包括连接建立的时间。在这个数据中,每秒完成了大约 45.29 个事务。
  10. statement latencies in milliseconds: 查询语句的延迟时间(以毫秒为单位)。这部分提供了每个查询语句的平均执行时间,以便您了解查询的性能情况。每个查询语句都有其自己的执行时间。
    例如,第一个查询 \set nbranches 1 * :scale 的执行时间为 7.73 毫秒,而第三个查询 \set naccounts 100000 * :scale 的执行时间为 6.14 毫秒。这些信息对于识别性能瓶颈和查询优化非常有用。

总之,这份报告提供了有关 PostgreSQL 数据库性能的一些关键指标,包括吞吐量(每秒事务数)、查询模式、查询语句延迟时间等信息。通过分析这些数据,您可以更好地了解数据库的性能表现,以便进行优化和改进。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/135312?site
推荐阅读
相关标签
  

闽ICP备14008679号