【问题标题】:jmeter + posgreSQL isolation "read committed" twice less throughput than "default"jmeter + postgreSQL 隔离“读取已提交”的吞吐量比“默认”低两倍
【发布时间】:2020-05-19 04:26:15
【问题描述】:

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

在 JMeter 的 JDBC 连接配置中,我将事务隔离级别从 DEFAULT 更改为 TRANSACTION_READ_COMMITTED

在总结报告中,我始终看到DEFAULT 上的吞吐量在 4 个线程中的 100k 事务结束时为 3.3k,而TRANSACTION_READ_COMMITTED 上的吞吐量为 1.8k。

为什么TRANSACTION_READ_COMMITTED 的吞吐量会少两倍?

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

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

JMeter 中的TRANSACTION_READ_UNCOMMITTED 产生与TRANSACTION_READ_COMMITTED 相同数量级的吞吐量,DEFAULT 以外的任何其他结果都显着低于DEFAULT 的吞吐量。

【问题讨论】:

  • 必须是您的测试设置中的某些内容,因为默认级别 已提交读取。
  • 您的瓶颈是网络延迟和/或进程间通信吗?如果 jmeter 进行单独的网络往返来设置隔离级别(即使只是将其设置为与默认值相同的设置),那么额外的往返会降低您的吞吐量。
  • @ jjanes,关于设置每个请求的级别的有趣想法...... db 在 localhost 的 docker 中(JMeter 在本地也运行),工作站是 macbook。您如何建议找出延迟最大的地方?

标签: postgresql jmeter


【解决方案1】:

隔离级别层次结构如下:

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

根据Postgres 9.5 documentation

Read Committed 是 PostgreSQL 中的默认隔离级别。

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

参考资料:

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    相关资源
    最近更新 更多