性能测试在整个软件/互联网行业中占据着非常重要的位置,自身应用的性能好坏,不仅影响客户体验和用户粘度,也是公司品牌的一部分,如何高效率地完成性能测试就显得格外重要。
性能测试从流程上划分,可简单分为压测和分析两个阶段,其中更容易工具化的是压测。从所针对的环境,可以分为线下压测和线上压测。本次我们要解决的问题就是,怎样高效地进行线上应用的压测。
高效要具备三个特点:
1)方便,任何人都可以快速地发起一个线上的性能压测;
2)安全,不会因为线上性能操作的方便而引起事故;
3)简单,压测结果简单明了,直观可追溯;
基于Mirror集群的自助性能测试,它的压测核心是容器流量转发,如图1所示。
图1 Mirror回放示意图
为什么选择mirror回放作为线上的压测手段?
对比ES回放和流量包回放,mirror回放:
1)场景丰富度高,因为其引流的是整个集群的流量,可长时间不间断回放;
2)回放服务器的维护简单,只需要在用的时候创建,不用时销毁即可,有利于提高服务器利用率,节省成本;
3)配置使用简单,只需配置要引流的接口和引流比例即可;
4)开发和业务测试都可以方便的操作,有利于把性能测试人员解放出来;
5)和线下自助性能平台一起,覆盖线上线下自助性能测试的工作;
6)提高项目支持度,增加性能分析比重和分析率。
mirror回放使得2~3个性能测试人员,就能够支持携程酒店上千应用的性能压测工作。也使酒店性能项目分析率从2019年初的20%-30%提高到现在的50%-60%,同时提高了性能测试人员自身的自我认可度和核心价值。
随着公司应用部署方式的不断演进,从最初的传统物理机部署方式,到后来的虚拟化部署方式,再到现在的容器化部署,公司整体的服务器运维和效率大大提高。而伴随着容器化部署的不断完善,各种好的容器化编排模式(参考Kubernetes Container Design Patterns)也得以应用到生产各种应用场景,其中基于sidecar模式的伴斗容器最先被应用到实际的生产性能验证中去。由于其良好的隔离和封装性,同时兼具网络和数据共享的特性,为我们进行线上应用性能验证提供了非常好的天然条件。
再结合pcap等一些网络组件库,生产环境网络流量复制转发到沙盒应用的基本功能都已经具备。同时集成公司当前丰富的实时监控数据和排查工具,基于Mirror集群的自助性能测试就是在这样的技术基础上完善起来的。
容器流量复制,过滤,转发帮我们解决了基本的场景设计和请求工具问题,直接利用线上容器应用实际过滤后的请求转发到单台或者多台机器来满足多倍、场景化压测的需求。
完善的监控系统,譬如ES/HickWall/CAT中的请求量,响应时间和机器资源监控数据,能够保证用户在启动压测后能够快速的看到回放状态和结果,使得自助回放平台提供的服务更加友好和一站式。用户只需要在一个地方即可完成配置,回放,查看回放时期的响应、机器资源消耗等等指标。见如下图2回放报告截图:
图2 Mirror回放报告示意图
对于回放配置中的接口中的流量是否被转发,转发的数量是否准确,都是我们关注的重点,这关系到我们压测场景和量级。这些在框架层面都已默认做了记录,在很大程度上在回放开启后,能快速帮助我们诊断当前流量情况,包括接口名称,TPS, Response Time, Error数量等等,从而保证压测在场景和量级上的正确性。这些都是自助平台的基础数据支撑。
而在压测过程中应用状态异常情况,CAT提供了thread Dump供查看当前应用的活动状态,同时Pass还有Heap, Mem, Lock等排查分析工具可供使用。这样就可以把整个性能测试从前到后的不同节点完整地衔接起来。
环境/场景准备到回放启动,回放启动异常侦测,再到回放结果收集,异常排查,最后报告整合。这种情况下,自助回放平台有了一个很好的落脚点和底层支撑。整体架构图如下图示3:
图3 Mirror自助回放平台架构示意图
性能自助平台的实现要注意三点:
第一,选择方便可靠的请求压测工具。
操作方便是使用的基础,而压测工具的可靠是后续数据分析的基础,同时我们也要处理好一些特殊应用的问题。正常情况下,我们希望一个应用对应到一个服务,也就是最好是一对一的关系。而当前我们发现应用和服务之间是多对多的关系,有的一个appid下面挂了n多个服务。譬如应用1000xxx00,下面有10多个服务,如下图4所示:
图4 应用服务对应关系示意图
这就意味着给定一个appid,下面有n个服务地址进行对应,回放的白名单就要根据不同的服务名,把不同的接口解析出来,否则用户就无法进行白名单审核。同时我们捞取服务地址的时候也就无法单单靠一个appid来确定捞取哪一个服务地址,反过来还要依赖白名单审核中的服务信息来确定要捞取的回放地址。
这些特例无疑增加了系统的复杂度,而我们并不希望用户在前端操作的时候感知到。处理好这些特例问题,是保证自助系统方便稳定的重要组成部分。
第二,线上回放要保证安全,不会引起生产事故。
在自助平台的实现中,特别要注意在保证用户操作便捷的基础上,保证操作的安全性。安全性包含几个方面:
1)不能把不应该回放到生产的请求回放到生产上去,其中危害最大的无疑是写接口。写接口的误操作会引起线上数据的混乱,这就需要我们提供流程化的操作来保证用户不犯错,犯错的时候有提醒。
譬如在我们当前的自助平台里面,用户在进行回放配置的时候必须先进行白名单的审核。这个白名单的审核,应用的owner是必须参与的,从而保证白名单里面的接口都是可以进行线上回放操作的,否则用户在回放配置的时候,无法选择到回放接口来开启回放。如下图5所示:
图5 Mirror自助回放白名单示意图
2)在回放过程中出现错误的时候,及时停止,保证不引起生产故障。这个我们可以通过CAT的错误数据来设定什么状况下,触发自动停止动作。我们单独做了一个监控进程来负责各个回放应用的状态监控,如图6所示。
3)回放不会引起线上统计数据的异常。譬如最简单的用户真实请求量,转化率等等,这些都需要在回放接入前进行业务调研。如果有此类风险,需要各个业务owner 进行配合排除对应的回放数据。
图6 回放监控示意图
第三,结果聚合化,排查简单化。
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。