基于gatling&jenkins快速打造性能测试平台

2016-12-28   出处: MoguTTech  作/译者: 莫尘  

当用户访问一个网站时,如果等待网页打开的时间超过8秒,会有超过70%的用户放弃等待

         —— 八秒定律


谷歌发现,搜索页面一旦慢了0.5秒钟,就会导致流量降低20%。


对于亚马逊来说,100毫秒的延迟,意味着1%的销售额。


    性能一直是网站成功的关键因素。越来越多的研究已经证明,不管是淘宝小店,还是像天猫、京东这样的大型商城,即使是页面加载时间方面的细微改善,都可以带来更多的业务,更多的用户粘性和客户满意度。



为什么选择gatling?


    现在市面上有很多性能测试工具,如JMeter, Grinder, Tsung,LoadUI,LoadRunner,Neoload等。这些工具大多经历了许多年头的发展,在一定领域具有足够的通用性。但他们都或多或少的存在一些不足之处,比如:

  1. 并发多线程模型的先天不足用多线程来模拟多用户,线程数随着并发数的增加而增加。线程之间的切换是需要占用资源的。io的阻塞和线程的sleep会不可避免的导致并发效率下降。

  2. 脚本维护性


    这些工具的脚本更多像是一个ui界面的记录,缺乏描述功能。简单来说,一个接手脚本的人需要花费大量时间才能理解脚本是做什么的。脚本的可读性和可维护性上都不尽如人意。

  3. 报表粗糙或者过于复杂

    性能测试的结果分析一部分依赖于最终生成的报表。一个拥有良好用户交互性和体验的报表能够帮助用户更快的定位问题。


Gatling介绍

    Gatling作为新一代的服务器性能测试工具,是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等,除此之外它拥有以下特点:

  • 支持Akka Actors 和 Async IO,从而能达到很高的性能

  • 支持实时生成Html动态轻量报表,从而使报表更易阅读和进行数据分析

  • 支持DSL脚本,从而使测试脚本更易开发与维护

  • 支持录制并生成测试脚本,从而可以方便的生成测试脚本

  • 支持导入HAR(Http Archive)并生成测试脚本

  • 支持Maven,Eclipse,IntelliJ等,以便于开发

  • 支持Jenkins,以便于进行持续集成

  • 支持插件,从而可以扩展其功能,比如可以扩展对其他协议的支持

  • 开源免费


    Gatling适用的场景包括:测试需求经常改变,测试脚本需要经常维护;测试环境的客户机性能不强,但又希望发挥硬件的极限性能;能对测试脚本进行很好的版本管理,并通过CI进行持续的性能测试;希望测试结果轻量易读等。




扩展gatling


    用gatling我们可以做简单的性能测试了,可是这还远远不够。因为gatling原生的日志是本地的文本形式。不利于做平台化的日志分析。为了更好的管理和分析日志,我们在gatling中加入kafka日志模块,以支持集团的统一日志平台。从而可以像业务应用一样收集和分析日志。

    Gatling本身支持的协议类型不多,我们用自定义gatling的action和actionbuilder,增加了包括数据库、web socket和其他内部中间件服务的接口协议,使得平台可以更好的完成单链路测试。

    在高并发的实现上,我们引入了jenkins,jenkins这个工具在任务调度方面做的是非常成熟的,我们用jenkins来实现多台性能测试机器的实时调度。而gatling和jenkins的参数传递是用环境变量的方式实现的,这里我们专门编写参数模块负责gatling和jenkins的对接。


平台化


    有了jenkins和gatling,我们可以执行一些性能测试任务了。可是,jenkins毕竟是一个通用的集成工具,并不是专门用来做性能测试的,也不具备一个平台的特性和功能。比如:

  • 权限控制:基于个人、上级以及团队维度控制任务的执行、查看、编辑、删除权限

  • 任务管理:需要灵活的批量创建和修改任务

  • 界面:专为性能测试定制的用户友好操作界面

  • 数据枢纽:在现有的结果中抓取关键数据,并将其保存到数据库。可以和其他的一些平台如持续集成,质量数据中心做数据交换。

  • 安全控制:当系统或者业务出现问题时,我们需要被测端反过来调用平台,中止性能测试,达到一个安全控制的目的。

   

 我们的做法是在jenkins外用nodejs包了一层,通过jenkins的api控制jenkins master,master调度多台压测执行机执行压测任务。压测机再通过回调通知平台更新相应状态。这种做法将jenkins作为一个调度层,不但可以直接利用jenkins完善的调度机制,丰富的插件,集群管理功能,而且可以非常快速的全栈开发出平台的web端供用户使用,更加灵活。


层次结构图


    前端我们使用了目前比较流行的angularjs和bootstrap框架。后端开发采用sailsjs这个nodejs框架。sails.js类似于ruby on rails, 是一个优秀的web后台开发框架。基于著名的express,添加了很多功能模块,支持REST、各种流行数据库等, 使用它开发适用于多设备、数据密集型、实时web应用。web层后端控制调度层执行相关任务,最终任务由执行层完成。


任务的创建


    任务的创建包括:

  1. 链路模型。也就是每一个request的抽象

  2. 数据模型。请求所依赖的数据,大部分由数据工厂提供

  3. 场景模型。把链路模型通过逻辑关系组合起来,再加上数据模型,就是场景模型。

  4. 基于场景模型,可以创建压测任务,并执行性能测试。



任务执行流程

    任务的执行分为4个部分:

  1. 脚本准备。先校验权限,然后根据rps计算机器数量,加上模型信息,动态生成脚本(动态生成脚本不是必须的,如果没有精力研发脚本生成引擎,可以用编写好的脚本)。最后需要执行者确认,避免脚本问题(因为我们的性能测试大多在线上进行)。

  2. 数据准备。分成2个部分,数据工厂生成数据和用户上传数据。

  3. 执行阶段。比较简单,即执行和中止。

  4. 监控+结果显示。实时显示运行状态和运行日志,结束后可显示报告。


    

项目成果

    

    平台承接了:

  • 2015双十一大促单链路&全链路性能测试

  • 2015双十二大促单链路&全链路性能测试

  • 2016前后端分离单链路&全链路性能测试

  • 321大促单链路&全链路性能测试

  • 2016.6.18大促单链路&全链路性能测试


    这个平台共花费了2个人,45天时间。值得一提的是,对于scala,gatling,nodejs,angularjs这些技术,我们之前毫无经验。同时,我们还需要配合业务方做性能调优等工作。所以实际的开发速度是非常可观的。


后记


    实践证明,该工具平台在做性能测试的效果还是非常明显的。许多业务经过压测,发现了不少性能瓶颈。比如,一开始蘑菇街的下单业务tps只能支撑500,在压测,改进,再压测,再改进的循环作用下,下单业务tps现在可以支撑每秒1w单。


    天下武功,唯快不破。该架构的最大优点是,最大限度的利用成熟的开源工具,可以在非常短的时间内创造性能测试平台; 松耦合度,可以把jenkins替换成其他调度中间件,或者把gatling替换成其他压测工具。




欢迎给测试窝投稿或参与内容翻译工作,请邮件至editors@testwo.com。也欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,并与我们的编辑和其他窝友交流。
230°|2300 人阅读|0 条评论

登录 后发表评论