压力测试需要掌握的几个核心技术

博文视点Broadview

共 2487字,需浏览 5分钟

 · 2023-08-07


在深入测试工作的那段时间,笔者发现测试人员因为工作边界模糊,大部分时间和精力都花在了功能测试上,而对于质量测试、自动化测试等扩展性强的工作,所花时间和精力很少,这是一件可悲的事情,但这是很多公司内都存在的现象。导致这种现象的原因有很多,其中一个让人特别头疼的问题就是自动化测试的覆盖速度远远达不到产品变化的速度,所以很多人失去了信心,选择老老实实地做功能测试。

在稳定性建设中,SRE工程师不仅需要拥有测试视角,还需要让测试团队中有拼劲的人加入稳定性建设的队伍,扩展他们的职责边界,让专人做专事,打造技术风险团队。

压力测试

我们会介绍一些实操性强并且特别适合运维人员入门的测试工具,对于压力测试(以下简称压测),我们需要掌握如下几个核心技术。

(1)理解系统负载出现瓶颈的原因,通过各种性能分析工具perf、bpftools、strace发现系统负载高的原因。下图来自大师Brendan Gregg的bcc-tools的内容(笔者实际工作中使用的很多分析方法都借鉴了这张图)。

2针对不同的压力进行容量规划这样后续的大促活动日常的高峰、低谷流量会有更好的基准数据进行对比。

(3)压测中可能会遇到因为链路过长导致的性能问题,很多时候代码变更会逐渐导致服务的链路被拉长,进而导致一个客户端的请求从入口到后端经过很多服务,经过的服务越多,网络耗时就越长,并且各项序列化操作还会造成资源开销增加,因此缩短链路会成为优化的重点。

压测黑名单思维

通常,我们在评估一个服务的性能或容量规划时,需要做一系列压测,压测中包含单应用、全链路等的诉求,并且会通过不同的并发请求量测试服务的响应能力。

基于前面章节中介绍的URI指纹服务设计思路,其实也可以产生一个压测黑名单思路,比如,如果新增的URI服务没有进行过压测,那么将无法上线,通过这种类型的配合,可以避免新服务在没有验证各项性能指标的前提下就匆匆上线。

压测利器Wrk

压测中运维人员经常使用ab、webbench这种轻量级性能压测工具,下面要介绍的是压测利器Wrk。

Wrk是一个开源HTTP基准测试工具,结合了多线程设计和可扩展的事件通知系统,如epoll和kqueue,这对于一些需要模拟上万并发请求量的压测工具来说,需要消耗的资源更少,更容易被随时随地使用。

Wrk工具内置了LuaJIT脚本功能,可以设计出较为复杂的HTTP请求生成、响应处理和自定义报告。下图是Wrk GitHub上的工具功能说明。

在简单的单接口压测中,推荐使用Wrk工具。

流量镜像工具GoReplay

在全链路压测中,我们时常会用模拟用户请求的方式来实现压测,比较常见的一种场景是流量镜像,使用线上用户的真实操作通过流量回放的方式,在测试环境下实现模拟效果。流量镜像工具有tcpdump、tcpcopy、ngx_http_mirror_module,以及基于日志回放的各种工具,下面我们介绍一下上手便捷且实用性强的HTTP流量镜像工具GoReplay。

GoReplay是使用Go语言编写的开源HTTP实时流量复制工具,将它安装在入口HTTP反向代理服务器上即可实现线上实时流量的复制和镜像。它还支持将收集到的流量数据进行放大和缩小(如可以自定义放大10倍请求量),并且能将流量数据存放到Kafka中,方便后续执行更多自定义操作。

在这里我们只讲解流量回放过程中需要注意的一些细节可参考官网上的使用手册。

核心问题,比如进行流量回放时,一定要谨慎操作,不要写错目标地址,有如下几种方式规避错误。

(1)将GoReplay封装到脚本中,尽量不要直接使用gor命令,每次执行流量回放操作的时候都通过脚本来完成,在脚本中对--output-http 参数进行判断,只需要将流量回放到指定的IP和端口,减少人工写错IP的可能性。

(2)也可以利用--output-file参数,将流量回放的数据存放到硬盘,并在最后复制到测试环境进行回放(测试环境和线上环境应该进行VPC隔离)。

(3)将流量收集、加入变更管控中,操作前需要进行二次确认。

(4)流量回放时,在第一次初始化过程中,默认只提供GET方法,等确认流程顺畅后,再开启其他方法的回放,比如POST方法。

注意:如果是喜欢使用Nginx做流量入口的用户,也可以考虑使用ngx_http_mirror_ module,Nginx在1.13.4版本中推出了自己的流量镜像模块,使用很方便,但是需要修改入口的Nginx配置文件,这属于线上变更,且灵活度较差,适合简单的流量镜像需求。

另外,GoReplay还可用于抓取HTTP包,执行以下命令可以抓取从80端口传入的HTTP请求:

./gor --input-raw :80  --output-stdout

接着会出现如下图所示的每个HTTP请求传入时显示的HTTP报文内容

本文节选自《高性能之道: SRE视角下的运维架构实践》

电子工业出版社出版

书里以SRE的视角,提供了关于运维架构实践的宝贵经验,值得推荐阅读

京东现在有满100-50的活动,有需要可以入手学习

   


如果喜欢本文
欢迎 在看留言分享至朋友圈 三连


浏览 322
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报