软件测试技术之全链路压测经验(上)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

随着业务的快速发展我们日常遇到的系统性能压力问题也逐渐出现甚至在部分场合会遇到一些突发的营销活动会导致系统性能突然暴涨可能导致我们系统的瘫痪。最近几年随着电商的各种促销活动有一个词也渐渐进入我们眼帘--“全链路压测”。

全链路压测被众多互联网公司的程序员定义为核武器传统性能测试更多的是以事务为核心更多的是由单个或者多个事务构成业务场景进行压测。那全链路压测到底是什么一般指完全引入相关联的系统 真实模拟线上硬件环境更多的是以请求为核心完全模拟真实请求流量通过引流等方式进行场景的模拟进行压测更多的适用于业务链路较长的交易。

笔者以前只是一直听说全链路压测但是并没有真正经历过对全链路压测的理解也不是很全面前年在互联网电商公司双11的时候参加过一次全链路的压测当时全公司第一次做大范围的全链路压测整个架构部也是第一次牵头来完成了整个全链路压测经过大家1个月的努力最后在活动期间完全扛住了压力并且还有性能过剩。当时做完后因为忙的太累没有进行过总结最近新的公司正好在压测借此也总结下全链路压测。

  1. 为什么需要全链路压测

我们在整个业务流程中最大的困难在于评估从用户登录到完成全部交易的整个链条中核心页面和交易关键交易的实际承载能力。如果得到了各个系统的实际承载能力就可以在路由网关进行相关交易限流控制来防止在大并发来了以后系统出现宕机我们都知道一旦系统宕机就会导致灾难性的后果而且就算运维短时间重启了起来恢复了运行但是可能过了一会儿过程系统承载量又出现宕机早期阿里在双十一的时候就发生过这样的问题系统在0点出现大面积瘫痪重启后又瘫痪为什么会出现这个问题就是因为大家对整个全交易链条上的各个环节的系统承压能力不清楚所以在出现了全链路压测一方面能够让各个产品知道自己的承压极限在哪

有的同学会问了通过单系统压测不是也可以知道各个系统的承压能力吗但是实际情况不可能那么简单那么顺利在活动开始的瞬间从CDN、网关接入、前端、缓存、中间件、后端服务、数据库整个交易链路都会面临巨大的访问压力这个时候系统服务除了受自生的影响还依赖于其他关联系统的情况并且影响会一直蔓延只要有一个节点出现故障那么故障在上下游系统经过层层累加后会造成的影响谁都说不清楚所以最好的办法就是模拟完全的真实情况来做到提前心里有数。验证的最好办法就是让事件提前发生通过全链路压测就可以提早发现问题。

另一方面也可以让各个系统能够有个明确的优化目标并找出性能瓶颈同时对于一些特殊环节可以通过临时增加公有云的方式来提高整体的性能一旦通过全链路压测了解了瓶颈所在就可以坦然的去按照压测指标去申请公有云资源活动结束后再归还资源这样做到成本最低化。

  1. 全链路压测常常遇到的问题

如何开展全链路压测在说这个问题前我们先考虑下全链路压测有哪些问题比较难解决。

1涉及的系统太多牵扯的开发人员太多

在压测过程中做一个全链路的压测一般会涉及到大量的系统在整个压测过程中光各个产品的人员协调就是一个比较大的工程牵扯到太多的产品经理和开发人员如果公司对全链路压测早期没有足够的重视那么这个压测工作是非常难开展的。

2模拟的测试数据和访问流量不真实

在压测过程中经常会遇到压测后得到的数据不准确的问题这就使得压测出的数据参考性不强为什么会产生这样的问题主要就是因为压测的环境可能和生成环境存在误差、参数存在不一样的地方、测试数据存在不一样的地方这些因素综合起来导致测试结果的不可信。

3压测生产数据未隔离影响生产环境

在全链路压测过程中压测数据可能会影响到生产环境的真实数据举个例子电商系统在生产环境进行全链路压测的时候可能会有很多压测模拟用户去下单如果不做处理直接下单的话会导致系统一下子会产生很多废订单从而影响到库存和生产订单数据影响到日常的正常运营。

  1. 如何开展全链路压测

其实进行全链路压测对于整个公司技术要求还是很高的如果没有一定能力的公司最好不要贸然尝试全链路压测因为如果没做好可能会把生产环境搞宕所以对于没有一定科技能力的公司还是尽量不要贸然追潮流实施全链路压测。对于科技能力不强的公司如果也想达到全链路压测那该怎么办

其实办法也很简单可以在压测环境进行模拟做一个比例模拟模拟1%-2%的访问量在测试环境进行压测得到数据后乘以对应的倍数来得到总的压测指标这里的比例当然不是简单的倍数相乘需要各个系统得到系统线性扩展和单机压测指标的一个线性值因为一般来说的线性扩展都不可能是100%的一定会有一定扩展后的损失。

1分析需压测业务场景涉及系统

在压测前我们一定要首先分析清楚需要压测的业务场景只有分析清楚了业务场景才能梳理出来涉及的相关系统分析清楚后也可以更快的找到性能瓶颈进行系统优化。这个工作一般是由架构师来梳理并确认涉及的相关系统梳理清楚后就可以反馈给总压测负责人进行人员和资源的协调了。

2协调各个压测系统资源

在全链路压测过程中最难的工作其实不是系统优化、压测环境搭建等技术工作最难的是压测资源的协调工作。这里的资源不单单指压测硬件、公有云等资源还包括了人力资源在整个压测过程中需要各个相关产品的产品经理和技术开发人人员参与进去这个工作可能不是架构师或者一个牵头产品的负责人能够协调的动的必须要有一个自上而下的推力去推动需要一个有一定级别的领导做背书我们当时是分管科技的老总召集了所有的产品经理和各个产品技术开发负责人开了一个全链路压测的方案讨论会这个会一方面说明了这个事情的重要性让各个产品都当场立下军令状并且安排出支持的人员同时也授权给压测负责人。这个搞定以后压测负责人后续就可以光明正大的协调各个产品的配合人员了。

3压测环境

压测环境也是个比较头疼的问题很多系统可能压根就没有压测环境所以全链路压测有个和传统压测比较大的区别就是全链路压测是在生产环境这种做法其实是存在一定风险的一方面是系统风险一方面是业务数据风险。对于全链路压测系统风险一定是首要考虑的问题不能因为压测把系统搞宕机影响到日常生产环境的正常运营我们当时做的电商系统还好不涉及相关的监管。但是在银行业这样做还是有很大的风险的一旦生产系统出现关键交易系统的宕机可能导致一些金融事故会对金融市场造成恐慌而且会被银监会通报所以银行的压测还是不要进行全链路压测不过可以在测试环境尽量仿真的模拟全链路压测。

前年在电商环境上做全链路压测直接在生产上进行压测用生产环境最大的好处就是环境的真实性通过生产环境能够最高程度的还原生产环境不用额外准备压测环境。但是使用生产环境进行压测需要考虑将请求和访问、业务数据处理都进行隔离防止影响到生产环境具体如何实施涉及到比较多的细节这里就不详细描述了。总的思路就是在发起请求的时候通过请求报文头中的压测标示来进行区分处理将压测的流量都分流到指定的应用服务器和指定的存储进行数据保存和处理。

进行全链路压测的时候为了防止系统崩溃可以选择在凌晨用户量最小的时候进行这样就算发生故障也可以将影响降到最低。

4压测数据

环境准备好了可能就需要考虑造压测数据了压测数据准备有两方面数据需要准备一方面是压测请求数据的准备需要模拟请求数据请求数据最好的办法就是采用生产的真实数据我们当时的做法是直接录制3-5天的生产访问请求流量只需要对录制的请求进行数据清洗就可以了将某个用户的请求替换成一个压测虚拟用户的请求请求的商品也替换成压测虚拟商品这个数据漂白替换的工作是比较复杂的对于做数据漂白的的同学对系统的接口非常了解否则很可能造成业务数据的混乱造成大量的业务报表和系统数据的脏数据另一方面是测试数据的准备我们当时准备了压测虚拟商品的数据、虚拟商品库存数据、虚拟供货商、虚拟用户。

5压测数据隔离

因为是在生产环境做的压测压测数据需要与正常的业务数据隔离开我们当时的方案是对于压测的这些脏数据都做了特定标示对于虚拟用户、虚拟商品、虚拟订单、虚拟库存都是有特殊标示的这样这类数据在统计的时候都不会进行统计在压测后也会对这些数据进行清理防止污染正常业务数据。

6压测数据实时监控

在压测过程中为了能发现性能问题我们需要对压测过程中各个系统的cpu、内存、磁盘io都进行系统层面的监控同时也需要对各个业务节点的耗时进行监控一方面从业务层面去监控压测事务性能另一方面从系统层面监控这样我们可以先从业务层面找到性能瓶颈再单独分析各个系统的系统层面的瓶颈最终找到优化方案。

我们当时公司内部有个实时监控平台这个平台是基于大众点评开源的cat实现的多平台监控系统能够实时监控各个系统的实时交易运行情况这样能够在第一时间发现遇到大流量的情况后性能瓶颈在哪然后进行针对性的优化。

文章来源网络 版权归原作者所有

上文内容不用于商业目的如涉及知识产权问题请权利人联系小编我们将立即处理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6