基准测试工具之你不知道的两三事 | 5.什么是读写混合负载

📅 2026/7/21 7:51:50 👁️ 阅读次数 📝 编程学习
基准测试工具之你不知道的两三事 | 5.什么是读写混合负载

前面的写入负载测试,回答的是一个很基础的问题:当设备持续上报数据时,数据库能否稳定地把数据接收下来。

但在线上环境中,写入通常不是唯一发生的事情。设备持续上报的同时,运维页面要刷新最新状态,趋势图要展示一段时间内的曲线,告警系统还可能统计某些指标。写入与读取在同一段时间内共同发生,这就是读写混合负载。

它并不意味着“把所有查询都打开”。读写混合负载的重点,是用一组能够代表线上行为的写入与查询操作,观察它们会如何相互影响。

1. 什么叫读写混合负载?

纯写负载中,测试程序持续向数据库写入数据;纯读负载中,测试程序只执行查询。读写混合负载则让两者在同一轮测试中并发发生:新的时序数据不断进入系统,同时已有数据被查询。

设备或客户端写入数据

时序数据库

页面、告警或报表发起查询

写入结果

查询结果

共同构成线上体验

这张图揭示了一个容易被忽略的事实:线上体验不是单独由写入吞吐量或查询延迟决定的。写入慢会让新数据迟到,查询慢会让页面和告警滞后;两者又可能竞争同一组 CPU、内存、网络和磁盘资源。

2. 它和纯读、纯写有什么不同?

三种负载都很有价值,但它们回答的问题不同。

负载类型主要回答的问题适合的阶段
纯写负载数据持续进入时,系统的写入能力和尾部延迟如何?建立写入基线、观察批写和乱序影响。
纯读负载某类查询在已有数据上的响应速度如何?单独评估趋势查询、聚合或历史回溯。
读写混合负载查询发生时,写入和查询能否同时保持可接受表现?模拟线上运行、评估资源争用与体验边界。

因此,读写混合不是纯写和纯读测试的替代品。更常见、也更可靠的顺序是:先建立纯写基线,再理解关键查询的单独表现,最后用混合负载观察它们放在一起后发生了什么。

3. 为什么不能只看其中一边?

假设一个系统在纯写测试中吞吐量很高,但一旦仪表盘刷新趋势图,写入 P99 明显升高;或者系统写入仍然稳定,页面查询却偶尔等待很久。无论哪一种,都说明纯写结果不足以描述真实线上状态。

读写混合测试的价值就在于发现这种“单独看都不错,放在一起才暴露”的问题。它通常关注三组关系:

  1. 写入是否受读影响:查询加入后,写入吞吐量、P99 和失败数是否变化?
  2. 查询是否受写影响:持续写入时,最近点、范围或聚合查询是否仍及时返回?
  3. 两者是否出现相互挤压:当写入和查询都变慢时,是偶然波动,还是资源竞争已经达到新的边界?

这些问题不要求测试一开始就给出复杂答案。它们的作用,是让我们知道每一轮测试应该重点记录什么。

4. 线上场景如何变成混合负载?

把业务场景翻译成混合负载时,可以先拆成“写什么”和“读什么”两部分。

线上动作可抽象出的负载行为
设备定期上报温度、压力等指标周期性写入,明确设备数、测点数、批大小与上报节奏。
页面每隔一段时间刷新设备状态最近点查询或最近数据附近的查询。
页面展示最近一小时趋势固定时间范围查询,明确窗口大小与涉及的设备、测点数量。
告警触发后汇总某段数据带时间条件的聚合查询。
夜间生成较大范围的报表更适合单独设计历史读负载,而不是混入实时测试。

这里最重要的不是参数本身,而是对应关系是否成立。比如,若页面一次只展示一个设备的几项指标,就不应在测试里直接设置成大量设备、长时间窗口的聚合查询;那样测到的将是另一种业务。

5. 混合不等于越复杂越好

读写混合负载最常见的误区,是把精确点、范围、聚合、倒序等查询一次全部加入。这样的测试看起来很全面,实际却很难解释:写入下降到底是由哪一种查询造成的?查询变慢又是范围太大,还是操作比例太高?

更稳妥的方式是从一个最典型的读请求开始。例如,系统主要是设备状态页,就先以“持续写入 + 最近点查询”作为第一份混合负载;确认结果后,再逐步加入趋势图或聚合统计。

纯写基线

加入一种典型查询

重复运行并记录写入与查询指标

结果是否稳定且可解释

评估是否加入下一类查询

检查配置、日志和资源状态

这样做的核心原则是:一次只增加一种新的压力来源。它不仅让测试结果更容易解释,也为后续定位瓶颈留下清楚的对照关系。

6. 一份合格的混合负载,应记录什么?

在混合测试中,只记录一个“总吞吐量”远远不够。至少应分别记录:

  • 写入操作的吞吐量、P99 和失败数;
  • 每一类查询操作的吞吐量、P99 和失败数;
  • 写入与查询的相对比例、查询时间范围和涉及的设备、测点数量;
  • 数据库版本、客户端配置、机器环境与完整日志。

这些记录让我们能够回答一个更有意义的问题:在某一种真实读请求加入后,系统牺牲了多少写入能力,换来了怎样的查询体验?这才是读写混合测试应当支持的判断。

7. 小结

读写混合负载描述的是线上最常见的一种状态:数据持续进入系统,同时又被持续读取。它既不是“写入加几个查询”的随意拼接,也不是越复杂越好。

开始设计混合负载前,可以先确认:

  1. 哪种写入行为是线上持续发生的?
  2. 哪一种查询最能代表用户或系统的实时需求?
  3. 写入和查询的结果,是否会被分别记录与解读?
  4. 新加入的查询,是否有纯写基线可供对照?

当这些问题有了答案,就可以进入下一篇文章:使用 IoT Benchmark 的操作比例、最近数据查询和时间窗口参数,把概念上的读写混合负载落实为可运行的测试配置。

系列文章

  1. 第一篇:数据库基准测试工具是什么
  2. 第二篇:从一次时序数据库写入测试开始
  3. 第三篇:如何模拟线上写入负载
  4. 第四篇:如何读懂测试结果波动
  5. 第五篇:什么是读写混合负载
  6. 第六篇:如何模拟线上读写混合负载
  7. 第七篇:怎样做一场公平的性能对比
  8. 第八篇:怎样找到并发与批大小的合理区间
  9. 第九篇:如何模拟乱序写入
  10. 第十篇:不同写入接口该怎样比较
  11. 第十一篇:性能测试与正确性验证有什么区别
  12. 第十二篇:单机测试与集群测试有什么不同
  13. 第十三篇:怎样保存和复盘一轮测试
  14. 第十四篇:一份可复用的基准测试方案模板