一种性能资源摸底的方案

空扰寡人 提交于 2020-01-25 07:34:31

通常线上的服务是一种多对多的结构,服务多机器部署,服务依赖多服务,例如下图:服务A部署了N台服务,即Service-A-1,Service-A-2,至Service-A-N,Service-A-VIP是服务A的统一入口(注:虚拟IP技术,Virtual IP,简写VIP);服务A可能依赖服务B、服务C、服务D等多个子服务;服务C与A一样同是一种多对多的结构,下面有子服务E、子服务F。
因此,我们在对上层的服务如服务A进行性能测试,就需要保证他依赖的子服务(服务B、服务C、服务D)能够正常使用。而标题中“性能资源摸底方案”是指如何巧妙安全地对线上上层服务进行极限性能摸底,并进行资源调优,合理分配服务器的数量。

安全QPS

首先需要介绍几个概念。在性能摸底时,我们部署一个新的服务Service-A-Test,它与线上的Service-A-1~N共享子服务B/C/D。需要强调的是,我们对 Service-A-Test性能测试,绝不能把他使用到的Service B/C/D给弄挂了。故将对Service-A-Test能压测的不影响 Service B/C/D正常运作的最大QPS定义为安全QPS,即:QPSsafe。
QPSsafe可以通过如下计算所得:

( QPSpeak  -  QPSperiod_max ) * N

其中,QPSpeak  是服务历史QPS峰值,QPSperiod_max是压测时间段峰值,因此我们再这个时间段,对服务A 压测QPSperiod_max - QPSpeak这么大的QPS,他的子服务是完全扛得住的, 而N为部署服务A的机器数。

进而,在对服务进行摸底时,只要压测QPS不超过安全QPS就不要告知下游的子服务。若对服务A压测,我们无需通知服务B/C/D的owner。

服务性能摸底

如图所示,我们需要对服务A进行性能摸底,可以按如下步骤操作

  1. 计算并确认安全QPS。
  2. 在一台机器上部署服务A(Service-A-Test),配置 Service-A-Test使用线上的服务B/C/D。
  3. 准备线上流程query做压测用,(因采用阶梯式压测,需要使得每个压测梯度间的query不一样,避免cache影响)
  4. 对 Service-A-Test进行压测,利用profiling等工具进行观察调优。
    因为是探测摸底,这里可以改采用阶梯式压测。QPSmax为单机服务极限QPS, QPSstart为最开始的压测QPS, QPSend是最大的压测QPS,QPSstep为每次加的QPS大小,压测次数m。

QPSstart = QPSmax
QPSend = min( 3 * QPSmax, QPSsafe QPS)
QPSstep = ( QPSend - QPSstart ) / m

资源调优

资源利用率:QPSpeak/QPSmax,线上实际流量的最大QPS 除以 能够承受的最大QPS 为资源。
资源红线RAratio:机器资源利用阈值。如:单机房80%、双机房40%

单机设定为80%时,双机房为什么40%->因为在双机房的场景下,需要服务在挂掉一台的情况,另一台机器需要扛起两份的流量,所以预留一台的流量能力,故双机房为40%,以此可粗略计算三机房是80%/1.5 = 53.3%(不完全严谨正确)

可以按如下方式进行调优:

总结

面的性能摸底、资源调优方案既可以适用于日常的迭代,也可以直接作用于线上服务;我们重点关注主干服务,进行全局调优;方案机制确定后,可以定期压测,即时预警;机器资源分配可以按照上游宽松,下游收缩的原则。总结如下:

1、覆盖业务:拓扑主干,全局调优
2、适用场景:迭代流程、线上流程
3、执行周期:定期压测,及时预警
4、资源红线:上游宽松,下游收缩

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!