全链路仿真压测系统

1.项目背景

目前常用的压测工具一般都是针对QPS这一个单一指标进行考量。即使支持编写脚本的工具也只是通过参数化模拟用户。但是实际用户是使用单独设备请求服务器,即一个用户就是一个tcp连接。

所以为了更真实的模拟用户行为,我们需要通过一个tcp连接模拟一个用户,并通过代码方式实现用户的真实请求行为。C端及中台产研中心云平台部质量保障团队自研的“仿真压测系统”。独有的QPS动态可控技术,支持固定URL压测、参数化、Websocket协议压测、中间件、数据库等的压测,模拟用户真实轨迹,通过用户侧,服务端,DB进行数据一致性和正确性自动检验,打造真正的全链路仿真压测,该系统可扩展性强,稳定性高,目前已多次支持公司级各类大型活动的仿真全链路压测,为线上服务的稳定运行提供了强有力的质量保障。

经过四年的打磨如今借此机会与大家分享一下心路历程,积极讨论,欢迎提出意见,希望可以帮助我们进一步成长。(文中引用均为测试数据)

2.仿真压测系统成型之路

2.1

工具选型

► 2.1.1 现有的压测工具对比                              

图片

图1-1

► 2.1.2  Locust发压client比较

图片

 

图1-2

结合以上比较结果,目前没有合适的压测工具可以直接满足我们的压测需求,最终决定用Locust做框架,首先它是一款易于使用的分布式负载测试工具,完全基于事件,单机并发能力高,并发机制是协程,其次二次开发潜力比较大。

发压的请求client采用fasthttp, 据说是目前golang性能最好的http库,原理是利用worker复用goroutine,减轻runtime调度协程的压力,相对于自带的net/http(每个连接都需要新建一个goroutine),性能有10倍的提升。省略一千字,直接上干货。

► 2.1.3 仿真压测系统特性:

  • 分布式部署;
  • 固定URL压测;
  • 参数化脚本压测;
  • Websocket协议压测;
  • 其他协议UDP、http2、 RTMP/HLS、MQTT(golang可以实现的协议都可满足)
  • Redis直压;
  • Kafka直压
  • Mysql直压;
  • 自定义脚本压测(仿真压测,全链路数据对账);
  • 动态可控QPS、TCP;
  • 秒级启动/停止,结果收集即停即展示,无需等待
  • ……

 ► 2.1. 4 实现难点分析

模拟百万用户创建TCP/ websocket连接;长时间保持连接不断开;集中发压;

部分代码如下:

   go func() {for {selectcase data := <-r.stats.messageToRunnerChan:data["user_count"] = r.numClientsr.outputOnEevent(data)case <-r.closeChan:Events.Publish("boomer:quit")r.stop()wg.Done()return}}
}()
集中发压
curTime := myStatus.CtstatusTime := myStatus.Stc := time.After(time.Duration(statusTime-curTime) * time.Second)<-cmiaosha(uidToken, &myStatus, myLog)
保持长链接
func wsWorker() {ws, err := websocket.Dial(wsUrl, "", origin)if err != nil {log.Println(err)return}defer func() {if p := recover(); p != nil {log.Println(p)}erc := ws.Close()if erc != nil {log.Println(erc)}}()go func() {ws.Write([]byte("0"))var t = time.Tick(time.Second * 30)for range t {if ws == nil {continue}ws.Write([]byte("0"))fmt.Println("send 0 to websocket ok!")}}()for {select {case <-stopChannel:returndefault:var msg = make([]byte, 512)start := time.Now()n, err := ws.Read(msg)log.Println(string(msg[0:n]))elapsed := time.Since(start)if myDebug {log.Println(string(msg))}if err != nil {log.Printf("Error: %s", err.Error())}}}}

2.2

日常使用截图

图片

图2-平台首页

图片

图3-实时监控压测页面,总请求数、实时qps、响应时间、发压机cpu占用等指标。

图片

图4-压测空接口,服务器监控截图, Nginx的峰值QPS可以达到596万。

图片

图5-压测redis时监控截图,单个节点的实时监控等都可以一览无余

3.  818台网实战开始

工欲善其事,必先利其器,利器已有,剧本安排上。

晚会当天数以万计的用户通过手机app参与活动,从白天开始“预约红包”,晚上八点晚会开始后用户开始陆陆续续登录app“领取预约红包”;随着主持人口播,第一轮“集卡”活动开始……人数慢慢增多,到了最激动人心的时候。“一元秒新车”开始,QPS狂飙,TCP连接数也达到了峰值100W。

开始实战:

控制台:各部门注意,入口已经放开,流量开始进入;目前“预约红包”阶段

仿真压测:收到,每五分钟递增1w用户(1TCP模拟1用户以下通用TCP数代指用户数),QPS200(用户进入活动页面,预约红包、查看规则、查看介绍等大概每人5次请求)

图片

图6-由于发压机数量32台,每个机器限制QPS7所以总QPS就是224

控制台:晚会开始,“预约红包”可领状态,“见面礼红包”已开启,“连续红包”已开启,第一场大咖讲话马上开启……

仿真压测:明白,TCP调整到20W,QPS2W(用户操作5次集中在1分钟以内)

图片

图7-动态调整QPS、TCP连接数按钮

图片

图8-设置TCP连接数、QPS、步增等

图片

图9-设置生效,TCP、QPS稳定保持在设定值

控制台:抽盲盒活动进入倒计时

仿真压测:copy,TCP调整到30W,QPS10W(用户3秒内点击10~15次提交一次请求到服务器)

图片

 

图10-设置生效,TCP、QPS稳定保持在设定值

控制台:时间来到最终环节,“一元秒新车”,倒计时开启

仿真压测:拼手速的时候到了,TCP100W,QPS100W(秒杀只可以提交一次)走起

图片

图11-设置生效,TCP、QPS稳定保持在设定值

至此,晚会结束,仿真压测却并没有结束,还有最后一环--“对账”。仿真压测会把接口返回用户的数据记录到kafka中,最后入库,与服务器的数据进行对账,确保每条数据的正确性。

图片

 

图12-服务侧数据与用户侧数据进行对账

看一下动态调整QPS的完美曲线,随着用户增长以及QPS增长的仿真图

图片

图13-仿真模拟用户递增的曲线

图片

图14-服务器监控截图,仿真用户全部走websocket协议,通过“状态机”下发指令、接收指令

图片

 

 图15-Redis 监控截图

图片

图16-云服务器LB截图

图片

图17-云服务器LB截图

图片

图18-云服务器LB截图

图片

 

图19-仿真压测完成,服务侧奖品发放明细

图片

图20-仿真侧用户领取奖品明细以及对账情况

数据完美对上。

4. 总结

由于篇幅受限,想说的很多,质量保障团队也做了很多,比如灾备演练,模拟服务器满载、域名切换、服务器宕机、机房切换等等。关于测试方面的问题欢迎私下讨论。

 感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/501411.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精酿啤酒:从原料到成品的质量控制流程

质量控制是啤酒酿造过程中重要的一环&#xff0c;它涉及到从原料选择到成品生产的每一个环节。Fendi Club啤酒对其质量控制流程有着严格的要求&#xff0c;以确保产品的品质和一致性。 Fendi Club啤酒对原料的选择进行严格把关。他们选用上好、新鲜的麦芽、水和酵母等原料&…

【嵌入式】STM32控制脉冲个数

控制脉冲个数两种方式:中断技术、主从定时器技术。 1.主从模式控制 2.cubemx配置 2.1主定时器 以TIM3为例子。 1)从模式:失能; 2) 触发源:不选择; 3)内部时钟:勾选; 4)输出通道:CH2 pwm模式; 5)单脉冲模式:不选择;

Appium移动端自动化测试-(Java)

目录 环境搭建ADB调试工具adb构成adb工作原理adb常用命令电脑连接多个设备跟模拟器使用adb包名与界面名的概念如何获取包名和界面名文件传输获取app启动时间获取手机日志其他命令 Appium全自动化测试框架&#xff08;python&#xff09;冲错了序言 环境搭建Appium客户端安装App…

利用coze 搭建“全功能“微信客服(2)

紧跟上篇 利用coze 搭建"全功能"微信客服&#xff08;1&#xff09;&#xff0c;不知道来龙去脉自行查阅 先表扬下coze: coze 是国内少数开放平台之一&#xff0c;里面提供各种插件还可以开发工作流&#xff0c;让你可以实现多模态全功能大模型 吐槽 没有API开放接口…

C语言第三十三弹---动态内存管理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

【Linux C | 网络编程】套接字选项、getsockopt、setsockopt详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

外汇天眼:外汇市场的交易商、做市商、经纪商有什么区别?

什么是交易商&#xff1f; “外汇交易商指买卖外国汇票的交易公司或个人。 外汇交易商利用自己的资金买卖外汇票据&#xff0c;从中取得买卖价差。 外汇交易商多数是信托公司、银行等兼营机构&#xff0c;也有专门经营这种业务的公司和个人。 ” 外汇交易商从一对儿货币买与卖…

金融方案再获认可!持安获评2023年度金融行业优秀解决方案

近日&#xff0c;由网络安全产业资讯媒体安全419主办的《年度策划》2023年度优秀解决方案评选结果正式发布。零信任办公安全技术创新企业持安科技荣获“2023年度优秀解决方案-金融行业优秀解决方案”。 安全419是以内容报道服务于行业的垂直资讯媒体和第三方企业服务机构。11月…

物联网与智慧城市的融合:构建智能化、便捷化、绿色化的城市未来

一、引言 随着科技的飞速发展和城市化的不断推进&#xff0c;物联网技术正逐步渗透到城市的各个领域&#xff0c;成为推动智慧城市建设的核心力量。物联网与智慧城市的融合&#xff0c;不仅为城市治理提供了高效、智能的解决方案&#xff0c;也为市民的生活带来了前所未有的便…

3个月学会Android开发,金九银十

以上都不怕&#xff0c;更可怕的是下面的。 1&#xff0c;存款不足了&#xff0c;不够后面家庭生活了。 2&#xff0c;不知道自己能干嘛&#xff0c;迷茫 3&#xff0c;是不是找一份工作先干着&#xff0c;再看其他机会 4&#xff0c;关键是自己没有想好&#xff0c;自己做…

数字后端——DEF文件格式

文章目录 MACRO的不同orientationDEF中在macro orientation定义前需要留空格 MACRO的不同orientation DEF中在macro orientation定义前需要留空格 像下图中这种方向和分号之间没有空格的情况&#xff0c;就是有问题的格式。

2369. 检查数组是否存在有效划分(动态规划)

2024-3-1 文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; 2369. 检查数组是否存在有效划分 思路&#xff1a; 1.状态定义:f[i]代表考虑将[0,i]是否能被有效划…