jmeter + posgreSQL 隔离"read committed"吞吐量比"default"低两倍



我在docker中创建了一个PostgreSQL db,并制定了简单的JMeter测试计划来从数据库加载数据。

在JMeter的JDBC连接配置中,我将事务隔离级别从DEFAULT交替到TRANSACTION_READ_COMMITTED

在摘要报告中,我在 4 个线程中DEFAULT100k 个事务结束时始终看到吞吐量为 1.8k,在TRANSACTION_READ_COMMITTED时吞吐量为 1.8k。

为什么TRANSACTION_READ_COMMITTED吞吐量会降低两倍?

https://www.postgresql.org/docs/current/transaction-iso.html:

在PostgreSQL中,你可以请求四个标准事务中的任何一个。 隔离级别。但在内部,只有三个不同的 隔离级别,对应于已写入的读取级别, 可重复读取和可序列化。选择级别"读取"时 未承诺,您真的会得到已提交阅读... 读取提交是 PostgreSQL 中的默认隔离级别。

JMeter 中的TRANSACTION_READ_UNCOMMITTED导致与TRANSACTION_READ_COMMITTED相同的吞吐量,除DEFAULT之外的任何一种都会导致比DEFAULT低得多的吞吐量。

隔离级别层次结构如下所示:

  1. 可序列化 - 最高隔离级别,请求将最慢,因为在给定时刻没有其他事务可以处理数据集,它们将排队
  2. 可重复读取
  3. 已提交读取
  4. 读取未提交 - 最低隔离级别,请求速度最快

根据 Postgres 9.5 文档:

读取提交是 PostgreSQL 中的默认隔离级别。

我不知道您的应用程序和数据库数据集的具体情况,但 JMeter JDBC 配置必须与您的应用程序数据库配置匹配,因为选择不同的隔离级别可能会导致误报结果。

引用:

  • 数据库隔离级别
  • 在 JMeter 中使用 JDBC Sampler
  • 数据库隔离级别及其对性能和可伸缩性的影响

最新更新