一、背景介绍
为什么需要压测服务?首先,我们需要搞清楚做压力测试这件事情的意义。使用压力测试的本质是基于实际的生产业务场景、系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试并持续调优,而压力测试的意义则在于保障生产环境服务的可用性。
在日常研发流程中,每个工程师除了编写代码、review代码、提交代码、单元测试、集成测试外,还需要负责对自己所编写的功能模块进行24小时或者72小时的压力测试。压测除了可以验证逻辑是否正确外,还能暴露出是否有性能短板。比如原功能模块平均响应时间为200ms,在新代码逻辑加入后平均响应时间有没有出现较大波动尤其是耗时有没有明显增加。耗时增加会带来整个服务的抖动、熔断、甚至于降级。
压测服务除了具备管控研发流程意义外,更重要的是可以对线上服务容量评估。
简单想象一个信息流业务场景,当百万或者千万级别用户主动刷新浏览新闻,这背后实际上是海量的并发性请求,请求行为会从CDN到web接入层、前端应用、后端服务、DB缓存、存储、中间件等,整条链路都会面临着请求流量。无论服务部署环境是公有云、专有云、混合云还是自建IDC,高并发带来的问题挑战,需要我们能够全局瓶颈识别,对待业务容量评估和资源规划可以做到尽可能客观。
总所周知,应用的服务状态除了会受到自身稳定性的影响,还会受到流量等环境因素的影响,比如热点新闻、重大运营活动、常规流量峰值时间段(早上08:00~10:00、晚上20:00~23:00)。以上的未知情况带来的影响面会传递到服务的上下游,上下游某个环节如果出现了评估误差,会带来成倍的影响,最终可能会导致服务灾难性的影响。
二、压测工具选择
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。
使用JMeter 进行压测,只需要设置较少的参数即可。核心的参数有压测QPS、压测时长、压测IP、压测端口等。
打开,conf.jmx文件,修改以下配置信息:
图一:配置压测qps与压测时长
图二:目标机器与端口
三、压测展示
压测前,我们提前准备好api调用时所使用的测试url,为了保证压测可以尽可能还原真实情况,建议使用真实的用户uid来进行仿真测试。测试url为1w 条即可。 压测配置文件设置完成后,便可以运行启动脚本。 如sh run_start.sh。测试脚本启动后,并可以观察目标机器的负载情况了。
**压测细节如下:
压力测试目标:推荐引擎的排序服务、召回服务
压力测试qps:300
目标机器型号:阿里云 ECS ecs.g6.8xlarge
配置:cpu 32核/内存 128GB/系统盘40GB 数据盘500GB**
从上图可以看到,压测开始后cpu与内存的监控曲线开始飙升。经24小时持续压测后,相关性能指标满足生产环境标准。同时也验证得出阿里云ECS 满足高并发极限条件下的稳定性考核。
四、未来展望
目前,全链路压测的自动化只是针对测试执行范畴,还有很多工作需要人工干预,未来希望能够将自动化的脚步覆盖到测试前和测试后,真正建设出全链路压测的自动化生态体系。与此同时,我们正在调研阿里云性能测试PTS工具(云产品),以此释放出这部分工作的人力,可让工程师更加专注业务研发。