• pgbench 性能测试工具的使用


    简介

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

    pgbench 的测试结果报告
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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 通过内置脚本进行测试
    1.1 初始化测试数据

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

    table_namecounts
    pgbench_accounts100000
    pg_branches1
    pgbench_history0
    pg_tellers10

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

    table_namecounts
    pgbench_accounts50000000
    pg_branches50
    pgbench_history0
    pg_tellers500

    pgbench -i -s 500 -F 90 -h 10.229.89.210 -p 9393 -U postgres -d postgres ==>典型案例
    初始化选项
    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
    把所有的表创建为非日志记录表而不是永久表。

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

    测试案例

    内置:

    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 互斥
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    自定义测试
    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: insert.sql
    scaling factor: 1
    query mode: prepared
    number of clients: 10
    number of threads: 10
    duration: 600 s
    number of transactions actually processed: 11980
    latency average = 501.071 ms
    initial connection time = 4.248 ms
    tps = 19.957239 (without initial connection time)
    statement latencies in milliseconds:
           501.163  \sleep 500ms
             0.065  \set id random(1,100000)
             0.036  \set age random(18,32)
             0.453  insert into test(id, age) values(:id, :age);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    rmq集群同步复制、异步复制
    ml-dms-dataset实验
    6.2、Flink数据写入到Kafka
    【Oracle APEX开发小技巧2】在不通过类型转换的前提下使用Oracle APEX自带的格式掩码实现数值的精确展现
    RandLA-Net复现S3DIS记录
    力扣面试经典150题详细解析
    一文了解Gin对Cookie的支持
    Node.js| Node.js 修改模块全局安装路径、缓存路径、配置镜像源以及修改完毕后全局安装报错问题
    [HCTF 2018] Hide and seek(buuctf),Unzip(ctfshow)
    leetcode 71. 简化路径
  • 原文地址:https://blog.csdn.net/qq_52668274/article/details/127940157