
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 {
select
case data := <-r.stats.messageToRunnerChan:
data["user_count"] = r.numClients
r.outputOnEevent(data)
case <-r.closeChan:
Events.Publish("boomer:quit")
r.stop()
wg.Done()
return
}
}
}()
集中发压
curTime := myStatus.Ct
statusTime := myStatus.St
c := time.After(time.Duration(statusTime-curTime) * time.Second)
<-c
miaosha(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:
return
default:
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次请求)

控制台:晚会开始,“预约红包”可领状态,“见面礼红包”已开启,“连续红包”已开启,第一场大咖讲话马上开启……
仿真压测:明白,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-仿真压测完成,服务侧奖品发放明细

数据完美对上。
4. 总结
由于篇幅受限,想说的很多,质量保障团队也做了很多,比如灾备演练,模拟服务器满载、域名切换、服务器宕机、机房切换等等。关于测试方面的问题欢迎私下讨论。
作者|刘建宇
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。
当您在Ruby脚本中使用系统调用时,您可以像这样获得该命令的输出:output=`ls`putsoutput这就是thisquestion是关于。但是有没有办法显示系统调用的连续输出?例如,如果您运行此安全复制命令,以通过SSH从服务器获取文件:scpuser@someserver:remoteFile/some/local/folder/...它显示随着下载进度的连续输出。但是这个:output=`scpuser@someserver:remoteFile/some/local/folder/`putsoutput...不捕获该输出。如何从我的Ruby脚本中显示正在进行的下载进度?
下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标