2021-08-21

生产者消费者模式的系统性能分析方法

Views: 14329 | Add Comments

前一篇文章介绍了生产者消费者编程模式, 一种非常流行且强大的编程模式. 本文将分析采用这种模式的系统的性能分析方法, 以做性能优化.

系统性能分析主要关注这几个指标:

  • qps/rps(queries per second, requests per second) - 每秒处理请求数, 也即吞吐量(throughput), 一般也称为处理速度的大小, 通俗也称为性能
  • latency - 单次请求处理的耗时. 一般关注平均值(avg), 最大值(max), 最小值(min), 百分位(percentile), 一般也称为处理速度的快慢, 通俗也称为性能
  • 成功率, 失败率 - 因为网络抖动或者其它原因, 某些请求的处理会成功/失败, 成功/失败请求占的比例, 失败请求不计算在 qps 里

其中, qps 和 latency 在通俗语义在常常统称为"性能", 这会给科学分析带来歧义, 所以我们要特别注意弄清楚并区分. qps 和 latency 的关系公式为:

qps = 1 / avg_latency    // 时间单位为秒
avg_latency = 1 / qps    // 时间单位为秒

等式的右边为观测值(实证), 左边为计算结果.

对于采用生产者消费者模式的系统, 针对其性能指标的分析方法是非常清晰的. 我们将系统划分成3个部分:

生产者 -> 队列 -> 消费者

那么, 一个任务被生产者生产之后, 将加入到队列中排队. 任务在队列中可能会等待一些时间, 然后被消费者消费. 一个任务一般对应了一个客户端请求, 因此, 请求在系统内部的处理耗时可分成3个部分:

  • t1 - 生产耗时
  • t2 - 排队耗时
  • t3 - 消费耗时

对应的, 生产者和消费者的处理速度为:

  • q1 - 生产模块的 qps
  • q3 - 消费模块的 qps

队列作为一个通信管道, 不关注其处理速度(qps), 而主要关注其延迟, 也即任务排队耗时.

采用生产者消费者模式的系统, 其各个模块分隔得比较清晰, 易于单独测试, 因此这种系统易于排查问题和优化性能.

理想模型

假设排队耗时为零, 如果能实证 q1 和 q2以及 t1 和 t2, 那么系统的 qps (能力)和 latency 可由公式计算得出:

qps = MIN(q1, q3)
latency = t1 + t3

在理想情况下, 不仅排队没有成本, 而且各个模块的处理也完全独立, 例如不争抢 CPU 或者磁盘 IO 资源. 在硬件资源比较富裕的前提下, 这个分析公式是合理的.

任务排队等待

实践中, 模块由工作线程组成, 但是工作线程数量(并发数)会被限制, 如果任务的到来不是均匀的且超过并发数, 那么便会造成任务排队.

例如, 假设生产者的并发数是 1, 平均处理一个任务的耗时是 1 秒钟. 如果生产者平均每秒生产一个任务的话, 那么任务的排队时间是零, 也即没有任务排队. 但是, 如果生产者集中每秒生产 2 个任务, 那么, 将造成其中一个任务额外排队等待 1 秒钟, 导致最终处理耗时是 2 秒钟.

因此, 平均地生产任务, 确保同一时刻同时生产的任务数量不要超过消费者的并发数, 对于保证每个任务的处理耗时是有帮助的.

实践中, 限时抢购类活动对系统产生突发冲击, 从而导致请求排队, 最终导致请求处理耗时增加(部分请求的耗时远远超过平均值).

所以, 一个处理能力是 qps=10 的系统, 不代表每个请求的处理耗时都会是平均的 100ms, 如果集中冲击(并发)系统, 那么最长的请求的耗时可能将是 900ms, 就是因为客户端的并发数超过了系统的工作线程数量导致请求排队等待.

Related posts:

  1. Redis被bgsave和bgrewriteaof阻塞的解决方法
  2. 企业级SSD硬盘fsync速度
  3. LevelDB 写操作出现停顿的问题分析
  4. Paxos 算法实现和工程落地: 选主与复制状态机
  5. endless_tcp – 一种适应极端网络环境的网络软件架构
Posted by ideawu at 2021-08-21 12:04:42

Leave a Comment