使用 pgbench 进行回归测试
pgbench 与 PostgreSQL 一起发布,可用于测试数据库性能的多个方面。作为主发行版中包含的主要基准测试工具,它提供了一种最简单的方法来运行简单的性能测试,以确认新版本比早期版本快还是慢。这对于回归测试尤其有用,以确认新版本没有因自前一个版本以来的更改而变慢。
设置
如果您从源代码构建 PostgreSQL,请注意默认的“make”目标不会编译 pgbench 或 contrib/ 目录树中的其他模块。您需要自己像这样去做
cd contrib make make install
(或者,您也可以直接进入 contrib/pgbench 并从该目录执行 make/install)
您可以像这样确认您获得了正确的版本
$ pgbench --version pgbench (PostgreSQL) 8.5alpha2
非调试构建
需要注意的一点是,许多 PostgreSQL 的测试构建(包括预发布 RPM 版本)都是用开启断言代码进行编译的。断言有助于查找错误,但会大幅降低 pgbench 测试的速度,尤其是在您将 shared_buffers 增加到一个很大的值时。在启动数据库后,您可以使用 SHOW 命令检查断言是否开启;您应该看到以下内容
postgres=# show debug_assertions; debug_assertions ------------------ off (1 row)
除非此设置关闭,否则您将无法获得有用的回归数据。
postgresql.conf 配置更改
postgresql.conf 的默认设置对于 pgbench 来说性能相当低。您可能需要增加的两个设置是
* shared_buffers: Setting this definitely helps pgbench performance on reads and writes. Using at least 256MB gets you a good sized portion of the improvement possible here. * checkpoint_segments: If you're running the default or other write-heavy tests, you want this to be much larger to get more useful results. At least 16 will improve a lot over the baseline.
许多其他影响总体性能的参数,包括 effective_cache_size 和 work_mem,对 pgbench 运行的简单测试没有影响。
以下是一个创建具有有用初始参数的数据库集群的脚本,假设您已将 PGDATA 和 PGLOG 分别设置为要存放集群和启动日志文件的位置
initdb SHARED_BUFFERS="256MB" WAL_BUFFERS="16MB" CHECKPOINT_SEGMENTS="16" echo \# Changes for pgbench testing >> $PGDATA/postgresql.conf echo shared_buffers=$SHARED_BUFFERS >> $PGDATA/postgresql.conf echo wal_buffers=$WAL_BUFFERS >> $PGDATA/postgresql.conf echo checkpoint_segments=$CHECKPOINT_SEGMENTS >> $PGDATA/postgresql.conf pg_ctl start -l $PGLOG
创建 pgbench 示例数据库
获得有用回归测试的最简单方法是使用一个小的数据库(一个可以放入 shared_buffers 中的数据库),该数据库的规模大于系统上的核心数量,然后在该数据库上运行仅选择测试。
- 设置 shared_buffers='256MB'
- 创建一个规模为 10 的数据库(大约 160MB)
createdb pgbench pgbench -i -s 10 pgbench
基线
以下是一个具有 2 个作业和 4 个客户端的示例,适合 2 核系统,运行 30 秒
pgbench -T 30 -j 2 -S -c 4 pgbench
请注意,客户端必须是核心的倍数,因此使用“-j 2”,我们无法使用单个客户端测试性能。
以下是一个尝试多个客户端负载的脚本
CORES="2" CLIENTS="2 4 8 16 32" for c in $CLIENTS; do pgbench -T 30 -j $CORES -S -c $c pgbench done
缓存问题
请注意,如果您在初始化步骤之后立即运行 pgbench SELECT 测试,您将使用“热缓存”进行测试:所有需要的数据已经位于 RAM 中。如果您执行一些清除 PostgreSQL 和操作系统缓存的操作,例如重启,pgbench 之后会变慢,因为它将读取 accounts 表中的每个块(尤其是该表)回到 RAM 中,这涉及所有查找而不是顺序读取。出于回归测试的目的,您最好在每次重启时创建一个新的数据库,这样您就只测试缓存的性能。未缓存的行为很难系统地比较多次运行。
比较
您可以使用 pgbench-tools 来编写大量测试并记录结果,以便在数据库中进行分析。
资源
- PostgreSQL 性能停靠站:确定正确的 pgbench 数据库规模大小 和演示文稿 使用和滥用 pgbench 涵盖了从 pgbench 中获得有用结果的许多方面。