[转帖]性能分析: 多队列的瓶颈

性能,分析,队列,瓶颈 · 浏览次数 : 0

小编点评

**性能压测中系统主动THROTTling的原因是:** 1. **请求数过多:**系统为了控制请求数,在达到3-2节点持久化完成后,会触发THROTTling。 2. **请求间隙过长:**当请求间隔过长时,系统需要为每个节点处理多个请求,这会导致请求数过大,触发THROTTling。 3. **网络状况不稳定:**当网络状况不稳定,单个节点的处理能力可能不足,导致请求间隙过长,触发THROTTling。 **优化方案:** 1. **降低请求数:**使用缓存机制缓存请求,减少对 leader节点的请求量。 2. **优化请求间隙:**使用批量处理机制或并行处理来减少请求之间的等待时间。 3. **优化网络稳定性:**使用负载均衡技术,增加节点的处理能力。 4. **使用预连接:**在请求开始的时候,发送一个预连接请求,确保连接速度更快。 5. **使用异步处理:**如果可能,将一些任务异步处理,减少等待时间。

正文

https://zhuanlan.zhihu.com/p/156761279

 

最近在性能压测时总是触发系统主动throttling, 我们都知道throttling是系统自我保护的一种手段, 大方向上可以认为这是期望的结果. 如果止步于认为这是正常现象, 就会错失很多精彩, 现象背后的逻辑是什么? 理清了背后的逻辑, 是不是还可能发现优化的空间? 我们可以有一个看似正确的逻辑推断, 但最后的分析一定要落到实处.

系统架构

测试对象是一个典型的分布式块存储服务, 用户请求发往leader节点, leader通过一致性协议将该请求转发到2个replica上, 当系统达成多数派后, 也就是3节点有2个节点已经持久化完成(3-2), leader就可以返回客户端成功, 在3节点都持久化完成后(3-3), 该请求的状态机完全结束.

现象

有多种场景可以触发throttling, 比如为了控制系统中还未响应(没有达成3-2)的请求数, 这种请求数太多的时候就会触发throttling, 在压测环境下这种情况很少发生, 经过一些简单的分析, 触发throttling的原因是有太多的请求已经达成3-2, 但是还未达成3-3. 这种throttling的必要性在于未完成3-3的请求还要继续占有资源, 另外这种请求往往意味着2个replica处理能力不匹配, 如果不进行throttling, 那么同步延迟可能会越来越大.

复现

用较简单的步骤/环境复现问题是分析中很重要的一步, 这里将leader和2个replica放在同一台机器上仍能复现出相同的问题, 这就很大程度上排除了很多环境的因素, 比如leader到2个replica上的rdma网络状况是否不同. 为了进一步简化问题, 我们把replica上的处理逻辑进一步简化, 这样2个replica的处理能力几乎完全相同:

  • replica在收到复制请求后, 只将日志写到optane上, 并且2个replica使用同一块optane卡

另外通过fio可以验证, optane上的写清求可能发生乱序, 也就是先发的请求完成时间却更晚, 但这个概率非常小, 并且即使发生了乱序, 也是在少数几个io之间, 不会出现大范围的乱序.

模型

我们将分布式存储抽象成2条队列:

  • 一条队列用于client到leader, 它的服务时间主要是leader上的一些cpu开销
  • 另一条队列用于leader到replica的复制, 因为有2个replica, 所以这条队列其实包括了并行的2条队列. 它的服务时间主要包括写日志到optane的时间

这里因为queue1和queue2的服务时间相差较大, 所以很容易想到请求会积压在queue2上. 这里需要注意的是怎么衡量server的服务时间, 以replica server为例, 如果把服务时间算成leader发出请求到收到响应, 那是不对的, 因为这里面还有排队时间.

2个replica只要处理能力不一样, 如果没有外部的throttling等因素, 按照排队论慢的那个replica必然会出现队列堆积, 因为压测时的上限是由快的replica决定的, 快的都已经打满, 慢的必然堆积.

是否排队主要取决于以下因素:

  • 服务时间. 上面复现的环境几乎将2个replica的服务时间做到一样了
  • 服务到达分布. 在真实环境下, 服务到达时间是server真正拿到请求的时间, 而不是client发送请求的时间
  • 队列最大深度. 对于慢的replica来说, 这个可以认为是无穷大 (直至throttling发生)

上面3个因素中, 服务达到时间是2个replica最可能的不同点.

原因

现在很多系统为了降低延迟和提高吞吐,往往通过用户态的polling来取代内核的通知机制, 一个server可能是这个样子:

while (1) {
  rdma->poll();
  aio->poll();
  others->poll();
}

当rdma poll结束之后, 会继续运行aio, others等等的poll函数. 因为是单线程的, 直至下次rdma poll之前, 这段时间内新的rdma请求并没有取出, rdma接收端的receive window没更新直接就导致了rdma发送端必须停止发送. 另一方面, server都是能够同时处理多个请求的, 一次poll的请求如果不够, 相当于浪费了server的处理能力. 解决方法本身相对简单.

总结

  • 怎么将性能问题和事件关联起来
  • 怎么将事件和模块关联起来
  • 怎么通过队列来判断问题模块
  • 怎么正确理解/衡量队列的指标
  • 怎么理解队列背后的逻辑

与[转帖]性能分析: 多队列的瓶颈相似的内容:

[转帖]性能分析: 多队列的瓶颈

https://zhuanlan.zhihu.com/p/156761279 最近在性能压测时总是触发系统主动throttling, 我们都知道throttling是系统自我保护的一种手段, 大方向上可以认为这是期望的结果. 如果止步于认为这是正常现象, 就会错失很多精彩, 现象背后的逻辑是什么?

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程(转载)

https://cloud.tencent.com/developer/article/1420726 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程

https://www.cnblogs.com/wx170119/p/12068005.html 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候,有

[转帖]性能分析之TCP全连接队列占满问题分析及优化过程(转载)

https://www.cnblogs.com/wx170119/p/12068005.html 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候,有

[转帖]磁盘的排队论的理论和实践

https://zhuanlan.zhihu.com/p/138887556 队列广泛应用在性能分析领域, 通过观察队列可以知道当时系统的繁忙程度和请求的延时, 甚至可以用排队论去做容量规划等. 对存储有一定了解的同学都或多或少听说过, 当iostat的util大于70%以后, 响应时间会如下图所示

[转帖]FIO 存储性能压测

测试环境 3台服务器:ceph配置内外网分离,外网使用万兆线,内网使用千兆线,osd共21个。 1台客户端:安装fio工具、内核客户端,使用万兆线。 测试目的 针对fio工具中的iodepth(队列深度)和numjobs(线程数)参数,分析使用fio工具时,哪个参数对带宽值测试结果影响比较大。 测试

[转帖]队列深度对IO性能的影响

https://www.modb.pro/db/43710 几年前一个客户的Oracle数据库经常HANG,老白帮他分析了一下,结论是存储老化,性能不足以支撑现有业务了。正好用户手头有个华为S5600T正好从核心系统中换下来放着没用,就把这个存储换上去了。换了新存储后,系统总体确实有所改善。数据库不

[转帖]队列深度对IO性能的影响

https://www.modb.pro/db/43710 几年前一个客户的Oracle数据库经常HANG,老白帮他分析了一下,结论是存储老化,性能不足以支撑现有业务了。正好用户手头有个华为S5600T正好从核心系统中换下来放着没用,就把这个存储换上去了。换了新存储后,系统总体确实有所改善。数据库不

[转帖]磁盘的基准测试

https://www.jianshu.com/p/0e25657d016d 参考 摘抄自 对永久性磁盘的性能进行基准化分析 正文 如需对永久性磁盘的性能进行基准化分析,请使用 FIO,而不是 dd 等其他磁盘基准化分析工具。默认情况下,dd 使用非常低的 I/O 队列深度,因此难以确保基准生成足够

[转帖]磁盘的基准测试

https://www.jianshu.com/p/0e25657d016d 参考 摘抄自 对永久性磁盘的性能进行基准化分析 正文 如需对永久性磁盘的性能进行基准化分析,请使用 FIO,而不是 dd 等其他磁盘基准化分析工具。默认情况下,dd 使用非常低的 I/O 队列深度,因此难以确保基准生成足够