【发布时间】: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