pgbench — 运行 PostgreSQL 基准测试
pgbench -i [option...] [dbname]
pgbench [option...] [dbname]
pgbench是一个用于对PostgreSQL执行基准测试的简单程序。它会反复执行同一组 SQL 命令,必要时可在多个并发数据库会话中运行,然后计算平均事务速率(每秒事务数)。默认情况下,pgbench测试的是一个大体上基于 TPC-B 的场景,每个事务包含五条SELECT、UPDATE和INSERT命令。不过,通过编写自己的事务脚本文件,也很容易测试其他场景。
下面是 pgbench 的典型输出:
transaction type: <builtin: TPC-B (sort of)> scaling factor: 10 query mode: simple number of clients: 10 number of threads: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 tps = 85.184871 (including connections establishing) tps = 85.296346 (excluding connections establishing)
前六行报告了一些最重要的参数设置。下一行报告已完成的事务数和预期的事务数(后者就是客户端数与每个客户端的事务数的乘积);除非运行在完成前失败,否则这两个数应该相等。(在 -T 模式下,只打印实际的事务数。)最后两行报告每秒事务数,分别计入和不计入启动数据库会话的时间。
默认的类 TPC-B 事务测试要求预先建立特定的表。pgbench应使用-i(初始化)选项调用,以创建并填充这些表。(测试自定义脚本时不需要这一步,但需要自行完成测试所需的准备工作。)初始化命令如下:
pgbench -i [other-options]dbname
其中, dbname是已创建好的、用于执行测试的数据库名称。(可能还需要使用-h, -p和/或-U选项来指定如何连接到数据库服务器。)
pgbench -i会创建四个表pgbench_accounts、 pgbench_branches、pgbench_history和pgbench_tellers,并销毁任何已存在的同名表。如果数据库中已经存在这些名称的表,请务必改用其他数据库!
在默认的“比例因子” 1 下,这些表最初包含如下行数:
table # of rows --------------------------------- pgbench_branches 1 pgbench_tellers 10 pgbench_accounts 100000 pgbench_history 0
可以使用-s(比例因子)选项来增加行数,而且在大多数场景下也确实应该这样做。此时还可以配合使用-F(fillfactor)选项。
完成必要的准备后,就可以使用不带-i的命令运行基准测试,也就是:
pgbench [options]dbname
几乎在所有情况下,都需要附加一些选项才能得到有意义的测试。最重要的选项是-c(客户端数)、 -t(事务数)、-T(时间限制)以及-f(指定自定义脚本文件)。完整列表见下文。
以下内容分为三个小节:数据库初始化和运行基准测试时使用不同的选项,而有些选项在这两种情况下都适用。
pgbench 接受以下用于初始化的命令行参数:
-i--initialize进入初始化模式所必需。
-F fillfactor--fillfactor=fillfactor以给定的 fillfactor 创建pgbench_accounts、 pgbench_tellers和 pgbench_branches表。 默认值为 100。
-n--no-vacuum初始化后不执行任何清理。
-q--quiet将日志切换为安静模式,每 5 秒只输出一条进度消息。默认日志每 100000 行打印一条消息,因此通常每秒输出很多行(尤其是在性能良好的硬件上)。
-s scale_factor--scale=scale_factor将生成的行数乘以比例因子。 例如,-s 100会在pgbench_accounts表中创建 10,000,000 行。 默认值为 1。 当比例达到 20,000 或更大时,用于保存账户标识符的列(aid列) 将切换到使用更大的整数(bigint), 以便容纳账户标识符的取值范围。
--foreign-keys在标准表之间创建外键约束。
--index-tablespace=index_tablespace在指定的表空间中创建索引,而不是默认的表空间。
--tablespace=tablespace在指定的表空间中创建表,而不是默认的表空间。
--unlogged-tables将所有表创建为不记录 WAL 的表,而不是永久表。
pgbench 接受以下用于基准测试的命令行参数:
-b scriptname[@weight]--builtin=scriptname[@weight]将指定的内置脚本添加到待执行脚本列表中。 可用的内置脚本包括:tpcb-like、 simple-update和select-only。 也接受内置名称的无歧义前缀。 使用特殊名称list时,会显示内置脚本列表 并立即退出。
可选地,可在@后写一个整数权重,以调整此脚本相对于其他脚本的选中概率。 默认权重为 1。 详情请参见下文。
-c clients--client=clients模拟的客户端数量,也就是并发数据库会话的数量。默认值为 1。
-C--connect为每个事务建立一个新连接,而不是仅在每个客户端会话中执行一次。 这对于测量连接开销很有用。
-d--debug打印调试输出。
-D varname=value--define=varname=value定义一个变量,供自定义脚本使用(见下文)。 允许使用多个-D选项。
-f filename[@weight]--file=filename[@weight]将从filename读取的事务脚本添加到要执行的脚本列表中。
可选地,可在@后写一个整数权重,以调整此脚本相对于其他脚本的选中概率。 默认权重为 1。 (如果脚本文件名本身包含@字符,可追加一个权重以消除歧义,例如filen@me@1。) 详情见下文。
-j threads--jobs=threadspgbench中的工作线程数。 在多 CPU 机器上使用多个线程可能会有所帮助。 客户端尽可能均匀地分布在可用线程中。 默认值为 1。
-l--log将每个事务的信息写入日志文件。 详情见下文。
-L limit--latency-limit=limit持续时间超过limit毫秒的事务会被单独计数和报告,称为late。
使用限流(--rate=...)时,若某个事务落后于计划时间超过limit毫秒, 从而已经不可能满足延迟限制,则它根本不会被发送到服务器。此类事务会被单独计数并报告为skipped。
-M querymode--protocol=querymode用于向服务器提交查询的协议:
simple: 使用简单查询协议。
extended: 使用扩展查询协议。
prepared: 使用带有预备语句的扩展查询协议。
默认为简单查询协议。(详见 Chapter 52。)
-n--no-vacuum在运行测试前不执行任何清理。 如果运行的是不包含标准表pgbench_accounts、 pgbench_branches、pgbench_history和 pgbench_tellers的自定义测试场景,则此选项是必需的。
-N--skip-some-updates运行内置的 simple-update 脚本。 是-b simple-update的简写。
-P sec--progress=sec每sec秒显示一次进度报告。报告包括自运行开始以来的时间、自上次报告以来的 TPS,以及自上次报告以来事务延迟的平均值和标准差。使用限流(-R)时,延迟是相对于事务计划开始时间计算的,而不是实际开始时间,因此其中也包含平均计划滞后时间。
-r--report-latencies在基准测试完成后,报告每条命令的平均语句延迟(从客户端视角看到的执行时间)。详情见下文。
-R rate--rate=rate以指定速率执行事务,而不是像默认行为那样尽可能快地运行。速率以每秒事务数表示。 如果目标速率高于可达到的最大速率,则速率限制不会影响结果。
该速率通过让事务沿着一条符合泊松分布的时间线启动来实现。预期开始时间表是根据客户端首次启动的时间向前推进的,而不是根据前一个事务结束的时间。这意味着,当某些事务超过其原定结束时间时,后续事务仍有可能重新赶上计划。
启用限流后,运行结束时报告的事务延迟是从计划开始时间计算的,因此它包含每个事务等待前一个事务完成的时间。 这段等待时间称为计划滞后时间,其平均值和最大值也会单独报告。若要得到相对于事务实际开始时间的延迟,也就是事务在数据库中实际执行所花费的时间, 可以用报告中的延迟减去计划滞后时间。
如果同时使用--latency-limit和--rate, 一个事务可能会落后太多,以至于在前一个事务结束时已经超过了 延迟限制,因为延迟是从计划开始时间计算的。这样的事务 不会发送到服务器,而是完全跳过并单独计数。
较高的计划滞后时间表明,在所选客户端数和线程数下,系统无法以指定速率处理事务。 当平均事务执行时间长于事务之间的计划间隔时,后续事务会不断进一步落后, 而计划滞后时间也会随着测试持续时间增加。在这种情况下,只能降低指定的事务速率。
-s scale_factor--scale=scale_factor在pgbench输出中报告指定的比例因子。 对于内置测试,这通常没有必要;系统会通过统计pgbench_branches表中的行数来检测正确的比例因子。 但在只测试自定义基准(-f选项)时, 除非使用此选项,否则比例因子会被报告为 1。
-S--select-only运行内置的 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 纪元)而不是自运行开始以来的秒数。 单位为秒,小数点后精确到毫秒。 这有助于比较各种工具生成的日志。
--sampling-rate=rate写入日志时使用的采样率,用于减少生成的日志量。如果给定此选项, 则只记录指定比例的事务。1.0 表示记录全部事务,0.05 表示只记录 5% 的事务。
处理日志文件时,记得把采样率考虑进去。例如,计算 TPS 值时,需要按采样率将数字乘以相应倍数(例如采样率为 0.01 时,只能得到实际 TPS 的 1/100)。
pgbench 接受以下通用命令行参数:
-h hostname--host=hostname数据库服务器的主机名。
-p port--port=port数据库服务器的端口号。
-U login--username=login连接时使用的用户名。
-V--version打印pgbench版本并退出。
-?--help显示pgbench命令行参数的帮助信息并退出。
pgbench会从指定列表中随机选取测试脚本来执行。 这些脚本既可以是用-b指定的内置脚本,也可以是用-f指定的用户脚本。 每个脚本都可以在其后加上一个以@引出的相对权重,以改变其被选中的概率。 默认权重为1。权重为0的脚本会被忽略。
默认的内置事务脚本(也可通过-b tpcb-like调用)会针对随机选取的aid、 tid、bid和delta在每个事务中发出七条命令。 该场景受 TPC-B 基准启发,但并不是真正的 TPC-B,因此才取了这个名字。
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;
如果选择simple-update内置脚本(也就是-N),事务中将不包含第 4 步和第 5 步。这会避免在这些表上发生更新争用,但也会让该测试场景更不像 TPC-B。
如果选择select-only内置脚本(也就是-S),则只执行SELECT。
pgbench支持自定义基准测试场景:只需用从文件中读取的事务脚本(-f选项)替换默认事务脚本(见上文)即可。在这种情况下,一个“事务”就表示脚本文件的一次执行。
脚本文件包含一个或多个以分号结束的 SQL 命令。空行以及以--开头的行会被忽略。脚本文件还可以包含“元命令”,它们由pgbench自身解释,详见下文。
在PostgreSQL 9.6 之前,脚本文件中的 SQL 命令以换行符结束,因此不能跨行续写。现在,连续的 SQL 命令之间必须用分号分隔(不过,如果 SQL 命令后面跟着元命令,则不需要分号)。如果需要创建适用于新旧版本pgbench的脚本文件,请务必将每条 SQL 命令写在单独一行,并以分号结尾。
脚本文件提供了简单的变量替换功能。变量可以通过前面介绍的命令行-D选项设置,也可以通过下面介绍的元命令设置。除了由-D命令行选项预设的变量外,还有一些自动预设的变量,列于Table 242中。使用-D为这些变量指定的值优先于自动预设值。设置变量后,就可以通过书写:variablename将变量值插入 SQL 命令。在运行多个客户端会话时,每个会话都有自己的一组变量。
Table 242. 自动变量
| 变量 | 简介 |
|---|---|
scale |
当前比例因子 |
client_id |
标识客户端会话的唯一编号(从零开始) |
脚本文件中的元命令以反斜线(\)开头,通常延伸到行尾,不过也可以通过写反斜线换行继续到后续行。元命令及其参数之间以空白分隔。支持的元命令如下:
\set varname expression #将变量varname设置为根据expression计算出的值。表达式可以包含整数常量(例如5432)、double 常量(例如3.14159)、变量引用:variablename、具有通常优先级和结合性的一元操作符(+、-)和二元操作符(+、-、*、/、%)、函数调用以及括号。
示例:
\set ntellers 10 * :scale
\set aid (1021 * random(1, 100000 * :scale)) % \
(100000 * :scale) + 1
\sleep number [ us | ms | s ]让脚本执行休眠指定时长,单位可以是微秒(us)、毫秒(ms)或秒(s)。如果省略单位,则默认为秒。number可以是整数常量,也可以是引用了整数值变量的:variablename。
示例:
\sleep 10 ms
\setshell varname command [ argument ... ]将变量varname设置为 shell 命令command在给定argument参数下的结果。该命令必须通过标准输出返回一个整数值。
command和每个argument都可以是文本常量,也可以是引用某个变量的:variablename。如果要使用以冒号开头的argument,请在其开头再写一个冒号。
示例:
\setshell variable_to_be_assigned command literal_argument :variable ::literal_starting_with_colon
\shell command [ argument ... ]与\setshell相同,但命令结果会被丢弃。
示例:
\shell command literal_argument :variable ::literal_starting_with_colon
Table 243中列出的函数都内置于pgbench,可用于\set中的表达式。
Table 243. pgbench 函数
| 函数 | 返回类型 | 简介 | 示例 | 结果 |
|---|---|---|---|---|
|
与a相同 |
绝对值 | abs(-17) |
17 |
|
与a相同 |
将a打印到stderr,并返回a |
debug(5432.1) |
5432.1 |
|
double | 转换为 double | double(5432) |
5432.0 |
|
若任一a为 double,则为 double,否则为 integer |
参数中的最大值 | greatest(5, 4, 3, 2) |
5 |
|
integer | 转换为 int | int(5.4 + 3.8) |
9 |
|
若任一a为 double,则为 double,否则为 integer |
参数中的最小值 | least(5, 4, 3, 2.1) |
2.1 |
|
double | 常量 PI 的值 | pi() |
3.14159265358979323846 |
|
integer | [lb, ub]中均匀分布的随机整数 |
random(1, 10) |
1与10之间的整数 |
|
integer | [lb, ub]中服从指数分布的随机整数,见下文 |
random_exponential(1, 10, 3.0) |
1与10之间的整数 |
|
integer | [lb, ub]中服从高斯分布的随机整数,见下文 |
random_gaussian(1, 10, 2.5) |
1与10之间的整数 |
|
double | 平方根 | sqrt(2.0) |
1.414213562 |
random函数使用均匀分布生成值,即指定范围内所有值被抽到的概率相等。random_exponential和random_gaussian函数需要一个额外的 double 参数,用来决定分布的具体形状。
对于指数分布,parameter通过在以下位置截断一个快速衰减的指数分布来控制分布:parameter,然后将其投影到边界之间的整数上。准确地说,令
f(x) = exp(-parameter * (x - min) / (max - min + 1)) / (1 - exp(-parameter))
则值i 位于 min 和 max 之间(包括端点),被抽到的概率为: f(i) - f(i + 1)。
直观地说,parameter越大,接近min的值被访问得越频繁,而接近max的值被访问得越少。parameter越接近 0,访问分布就越平坦(越均匀)。对该分布的一个粗略近似是:范围内最常出现的 1% 的值,即接近min的那些值,会在parameter% 的时间里被抽中。parameter的值必须严格为正。
对于高斯分布,该区间映射到标准正态分布(经典的钟形高斯曲线),左侧截断于 -parameter,右侧截断于 +parameter。区间中部的值更容易被抽到。准确地说,如果 PHI(x) 为标准正态分布的累积分布函数,均值 mu 定义为 (max + min) / 2.0,并且
f(x) = PHI(2.0 * parameter * (x - mu) / (max - min + 1)) /
(2.0 * PHI(parameter) - 1)
那么,值 i 位于 min 和 max 之间(包括端点),被抽到的概率为: f(i + 0.5) - f(i - 0.5)。直观地说,parameter 越大,越靠近区间中部的值被抽到的频率就越高,而越靠近 min 和 max 边界的值被抽到的频率就越低。约 67% 的值抽自区间中间的 1.0 / parameter,即均值周围相对 0.5 / parameter 的范围;95% 的值抽自区间中间的 2.0 / parameter,即均值周围相对 1.0 / parameter 的范围。例如,如果 parameter 为 4.0,则 67% 的值抽自区间中间四分之一(1.0 / 4.0)的范围(即从 3.0 / 8.0 到 5.0 / 8.0),95% 的值抽自区间中间一半(2.0 / 4.0)的范围(第二和第三四分位)。考虑到 Box-Muller 变换的性能,parameter 的最小值为 2.0。
作为一个示例,内置的类 TPC-B 事务的全部定义是:
\set aid random(1, 100000 * :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END;
该脚本允许事务的每次迭代都引用不同的随机选中行。(这个示例也说明了为什么每个客户端会话都必须拥有自己的变量 — 否则它们就无法彼此独立地访问不同的行。)
使用-l选项时(但未指定--aggregate-interval选项),pgbench会将每个事务的信息写入日志文件。日志文件名为,其中prefix.nnnprefix默认为pgbench_log,nnn是pgbench进程的 PID。可以用--log-prefix选项修改此前缀。如果-j选项为 2 或更大,即存在多个工作线程,则每个工作线程都有自己的日志文件。第一个工作线程的日志文件名与标准单工作线程情况相同。其他工作线程的附加日志文件名为,其中prefix.nnn.mmmmmm是每个工作线程从 1 开始的顺序编号。
日志格式如下:
client_idtransaction_notimescript_notime_epochtime_us[schedule_lag]
其中, client_id 表示运行该事务的客户端会话, transaction_no 记录该会话已运行的事务数, time 是事务经过的总时间,单位为微秒, script_no 标识使用的脚本文件(在通过 -f 或 -b 指定多个脚本时很有用),而 time_epoch/time_us 分别是 Unix 纪元时间戳和以微秒计的偏移量(适合用来生成带小数秒的 ISO 8601 时间戳),表示事务完成的时间。 schedule_lag 字段是事务计划开始时间与实际开始时间之间的差值,单位为微秒。它仅在使用 --rate 选项时出现。如果同时使用 --rate 和 --latency-limit,则被跳过事务的 time 将报告为 skipped。
下面是单个客户端运行时生成的日志文件片段:
0 199 2241 0 1175850568 995598 0 200 2465 0 1175850568 998079 0 201 2513 0 1175850569 608 0 202 2038 0 1175850569 2663
下面是另一个使用 --rate=100 和 --latency-limit=5 的示例(请注意额外的 schedule_lag 列):
0 81 4621 0 1412881037 912698 3005 0 82 6173 0 1412881037 914578 4304 0 83 skipped 0 1412881037 914578 5217 0 83 skipped 0 1412881037 914578 5099 0 83 4722 0 1412881037 916203 3108 0 84 4142 0 1412881037 918023 2333 0 85 2465 0 1412881037 919759 740
在这个示例中,事务 82 超时了,因为其延迟(6.173 ms)超过了 5 ms 的限制。接下来的两个事务被跳过,因为它们在开始前就已经超时。
在能够处理大量事务的硬件上运行长时间测试时,日志文件可能会变得非常大。可以使用--sampling-rate选项,仅记录事务的随机样本。
使用 --aggregate-interval 选项时,日志文件采用另一种格式:
interval_startnum_transactionssum_latencysum_latency_2min_latencymax_latency[sum_lagsum_lag_2min_lagmax_lag[skipped] ]
其中, interval_start 是时间区间的开始时间(以 Unix 纪元时间戳表示), num_transactions 是区间内的事务数, sum_latency 是区间内事务延迟的总和, sum_latency_2 是区间内事务延迟的平方和, min_latency 是区间内的最小延迟,而 max_latency 是区间内的最大延迟。接下来的字段 sum_lag, sum_lag_2, min_lag 和 max_lag 仅在使用 --rate 选项时出现。它们提供各事务等待前一事务完成的时间统计,即各事务计划开始时间与实际开始时间之间的差值。最后一个字段 skipped 仅在还使用 --latency-limit 选项时出现。它记录因开始时间过晚而被跳过的事务数。每个事务都计入其提交时所在的时间区间。
下面是一些输出示例:
1345828501 5601 1542744 483552416 61 2573 1345828503 7884 1979812 565806736 60 1479 1345828505 7208 1979422 567277552 59 1391 1345828507 7685 1980268 569784714 60 1398 1345828509 7073 1979779 573489941 236 1411
请注意,普通(未聚合)日志格式会显示每个事务所使用的脚本,而聚合格式不会。因此,如果需要按脚本区分的数据,就必须自行聚合。
使用-r选项时,pgbench会收集每个客户端执行的每条语句所经过的事务时间。基准测试完成后,它会报告这些值的平均值,称为每条语句的延迟。
对于默认脚本,输出与下面类似:
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
number of transactions per client: 1000
number of transactions actually processed: 10000/10000
latency average = 15.844 ms
latency stddev = 2.715 ms
tps = 618.764555 (including connections establishing)
tps = 622.977698 (excluding connections establishing)
script statistics:
- statement latencies in milliseconds:
0.002 \set aid random(1, 100000 * :scale)
0.005 \set bid random(1, 1 * :scale)
0.002 \set tid random(1, 10 * :scale)
0.001 \set delta random(-5000, 5000)
0.326 BEGIN;
0.603 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.454 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
5.528 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
7.335 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.371 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
1.212 END;
所有数值都是针对每个客户端执行的每条语句计算的,并在基准测试完成后报告。
请注意,收集计算每条语句延迟所需的额外计时信息会增加一些开销。这会降低平均执行速度,使计算出的 TPS 下降。减速程度因平台和硬件而异,差别可能很大。比较启用和未启用延迟报告时的平均 TPS 值,是衡量计时开销是否显著的好方法。
很容易用pgbench得出完全没有意义的数字。下面给出一些有助于获得有用结果的准则。
首先,绝不要相信任何只运行了几秒钟的测试。使用-t或-T选项让测试至少持续几分钟,以便平滑掉噪声。在某些情况下,可能需要数小时才能得到可复现的结果。一个好做法是把同一测试运行几次,看看结果是否可复现。
对于默认的类 TPC-B 测试场景,初始化比例因子(-s)应至少与计划测试的最大客户端数(-c)一样大;否则,测到的主要将是更新争用。pgbench_branches表中只有-s行,而每个事务都要更新其中一行,因此-c超过-s时,必然会有大量事务阻塞等待其他事务。
默认测试场景还会对表初始化后的时间长短非常敏感:表中死元组和空闲空间的累积会改变结果。要理解这些结果,必须跟踪更新总数以及何时发生清理。如果启用了自动清理,它可能会给测得的性能带来不可预测的变化。
pgbench的一个局限是:在尝试测试大量客户端会话时,它自己也可能成为瓶颈。可以通过在与数据库服务器不同的机器上运行pgbench来缓解这一点,不过网络延迟必须足够低。甚至可以在多台客户端机器上同时运行多个pgbench实例,对同一台数据库服务器施压。
如果不可信用户能够访问尚未采用模式的安全使用方式的数据库,就不要在该数据库中运行pgbench。pgbench使用非限定名称,并且不会更改搜索路径。