我在docker中创建了一个PostgreSQL db,并制定了简单的JMeter测试计划来从数据库加载数据。
在JMeter的JDBC连接配置中,我将事务隔离级别从DEFAULT
交替到TRANSACTION_READ_COMMITTED
。
在摘要报告中,我在 4 个线程中DEFAULT
100k 个事务结束时始终看到吞吐量为 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
低得多的吞吐量。
隔离级别层次结构如下所示:
- 可序列化 - 最高隔离级别,请求将最慢,因为在给定时刻没有其他事务可以处理数据集,它们将排队
- 可重复读取
- 已提交读取
- 读取未提交 - 最低隔离级别,请求速度最快
根据 Postgres 9.5 文档:
读取提交是 PostgreSQL 中的默认隔离级别。
我不知道您的应用程序和数据库数据集的具体情况,但 JMeter JDBC 配置必须与您的应用程序数据库配置匹配,因为选择不同的隔离级别可能会导致误报结果。
引用:
- 数据库隔离级别
- 在 JMeter 中使用 JDBC Sampler
- 数据库隔离级别及其对性能和可伸缩性的影响