Jmeter - webSocket 压力测试笔记

article/2025/2/6 5:49:48

概述

编程的内核是数学,而测试的本质是计算,专业名词叫容量预估,而测试的大体就是用程序模拟程序,检测程序的正确性,有两个点需要注意,QPS最佳值和系统接收最大值,根据测试数据的反馈,针对测试的现象和反映进行优化。

Server : i5  8G
Swoole : 4.4.23
php : 7.2.10

Jmeter 的基础使用

step.01 Thread Group 线程组设置

jmeter自带的thread group非常简单。 一个thread 代表一个vuser,那么我们如果需要多少用户并发,设置多少线程数即可。ramp-up period, 本人理解是多少时间从0个 vuser 上升到您指定的vusers数。从这些参数可以看,非常简单。但不能设置测试的时间,这一点不是特别善解人意。不过还好我们有jmeter plugins, 带的thread group 添加了这个功能。

Number of Threads(users)  //并发线程(用户)数
Loop Count //重复执行次数

step.02 添加测试主体

右键单击左侧导航树中的 Test Plan,选择 Add > Threads(Users) > Thread Group ,右键单击 Thread Group,选择 Add > Sampler,可看到以下新增的采样器选项,具体说明如下。

WebSocket Open Connection	// 建立一个 WebSocket 连接
WebSocket Ping/Pong     	// 控制帧,发送 ping 并接收 pong
WebSocket request-response Sampler //	发送和接收文本或二进制 WebSocket 帧
WebSocket Single Write Sampler	// 发送文本或二进制 WebSocket 帧
WebSocket Single Read Sampler	// 接收文本或二进制 WebSocket 帧
WebSocket Close	                // 关闭 Websocket 连接

step.03 添加结果树 选择 Add > Listener ,结果树都在这个下面。

step.04 添加聚合报告,执行测试,结果如下图。

在这里插入图片描述

安装不正确请参考阿里云:

  • https://help.aliyun.com/document_detail/93627.html#title-kz3-0y7-7lr
  • https://help.aliyun.com/document_detail/91788.html?spm=a2c4g.11186623.2.30.681e1058OW8OxH
实践01 - 准备测试数据

1.随机读取用户表里100个用户,进行压力测试。

select user_id from wm_user_user where user_status = 1 ORDER BY RAND() limit 100;

2.构造测试需要的数据(10w条为例)

drop procedure idata;
delimiter ;;
create procedure idata()
begindeclare i int;set i=1;while(i<=100000 )doinsert into t2 values(i, i, i);set i=i+1;end while;
end;;
delimiter ;
call idata();

3.查询最大链接数命令

show variables like '%max_connections%';

4.查询链接线程的状态命令

show processlist; 

5.检测服务器Mysql链接状态的命令

netstat -ant|grep ESTABLISHED|grep 3306 | wc -l
实践02 - 代码

请求接口的Demo,主要的思考点在于用户访问具有随机性,模拟数据时尽量做到接近真实场景,代码如下:

$str = '62210,45783,36209,146502,24599,168338,166511,1917...';
$uidTestArr = explode(',',$str);
foreach ($uidTestArr as $uid){if(isset($uid) && intval($uid) > 0){$json = file_get_contents('http://open.stark.com/login/gettoken?uid='. $uid);$json = json_decode($json,true);$temp[] =   [ 'uid' => $uid , 'token' => $json['token']  ];}
}
$index = rand(0,count($temp) - 1);
$randData =  $temp[$index];//随机执行结果
/**
Array
([uid] => 166511[token] => f46540f11a40afeb9998cbe76661ec8234a87054
)
*/

Crontab的测试代码Demo,先灌入测试数据,考虑的是Crontab的实际吞吐能力,优化计划任务的执行间隔,使用Curl和shell_exec实现。

$str = "62210,45783,36209,146502,24599,168338,166511,1917,135799,8326...";
//去掉可能存在的换行和空格
$str = str_replace(array(PHP_EOL, ' ' ,'',$str));
$testUsers = explode(',',$str);
for ($i=0;$i<10000;$i++){$index = rand(0,99);$uid = $testUsers[$index];$msg = '{\"rid\":225,\"uid\":'.$uid.',\"top_rid\":225,\"module\":\"novel_chapter\",\"module_name\":\"1022 last dance \u7b2c13\u7ae0\",\"module_id\":1019712,\"module_nid\":163961,\"comment_uid\":268,\"comment_nickname\":\"\u6d4b\u8bd5\u5c0f\u5b9d\u8d1d\",\"content\":\"\u4f60\u597d\u554a\",\"gift_id\":0,\"gift_name\":\"\",\"gift_number\":0}';$url = 'http://msgdev.stark.com/api/comment/message';$json = shell_exec( "curl -d 'uid={$uid}&msg={$msg}' {$url} " );echo   'i:'.$i.',json:'.$json.PHP_EOL;
}

执行结果,返回数据 {"code":200,"result":[],"msg":"OK"}

在这里插入图片描述

在easyswoole的框架里有自带命令执行crontab,在临时执行或停止计划任务,在执行前加入时间毫秒的时间戳,可以打印代码进行耗时计算,代码如下:

//返回当前的毫秒时间戳
function msectime() {$stamptime = microtime();$arr = explode(' ',$stamptime );$msectime = sprintf('%.0f', (floatval($arr[0]) + floatval($arr[1])) * 1000);return $msectime;
}

EasySwoole 中有执行Crontab的命令:

//查看所有注册的Crontab
php easyswoole crontab show -mode=websocket//停止指定的Crontab
php easyswoole crontab stop --name=TASK_NAME -mode=websocket//恢复指定的Crontab
php easyswoole crontab resume --name=TASK_NAME -mode=websocket//立即跑一次指定的Crontab
php easyswoole crontab run --name=TASK_NAME -mode=websocket

总结:

  • 并发链接和并发查询:并发链接只是多消耗一点内存,并发查询才是CPU的杀手。
  • 对系统的流量提前进行容量评估,归根结底为计算问题,不管多大的流量最后的解决办法都采用分而治之的策略。
  • 手动的效率太低,用程序测试程序。
  • 减少不必要的日志写入,以减少磁盘I/O的传输。
  • 缓存和Mysql是一种平衡,需要去计算。

http://chatgpt.dhexx.cn/article/ANPL7E46.shtml

相关文章

应用密码学(张仕斌)第五章

序列密码体制 引言Vernam&#xff08;弗纳姆&#xff09;密码技术 1917年美国电话电报公司的GilbertVernam为电报通信设计了一种十分方便的密码技术。后来称之为Vernam密码技术. 它是一种代数密码技术&#xff1a;其加密方法是&#xff0c;将明文和密钥分别表示成二进制序列&am…

SQL调优指南笔记8:Optimizer Access Paths

本文为SQL Tuning Guide第8章“优化访问路径”的笔记。 重要基本概念 access path The means by which the database retrieves data from a database. For example, a query using an index and a query using a full table scan use different access paths. 数据库从数据库…

2023年还在问前端怎么学?一份前端学习指南

&#x1f36d; Hello&#xff0c;我是爱吃糖的范同学 因为疫情摆烂了许久&#xff0c;学校里又有许多大大小小的烦心事要处理&#xff08;特别是作业和期末考试&#x1f62b;&#xff09;&#xff0c;所以在博客文章的更新上很长一段时间都没有输出很正经的文章了&#xff0c;…

【前端圭臬】一:写给入坑前端的你

专栏目录 导论 【前端圭臬】一&#xff1a;写给入坑前端的你 HTML 篇 【前端圭臬】二&#xff1a;你知道的和不知道的 HTML CSS 篇 【前端圭臬】三&#xff1a;详解 CSS 选择器 【前端圭臬】四&#xff1a;CSS 核心机制——如何确定一个属性的值&#xff1f; 【前端圭臬】…

【前端是什么】

前端是什么&#xff1f; 文章目录 前端是什么&#xff1f;1.前端的概念2. 前端的分类3. 前端的工作流程4. 互联网企业的典型组织结构图 1.前端的概念 1.1 前端的定义 对于网站来说&#xff0c;通常是指网站的前台部分&#xff0c;包括网站的表现层和结构层&#xff08;通俗点就…

前端什么知识点最难学?

这个最就很难判断&#xff0c;每个人的理解程度不一致&#xff0c;但有两种人&#xff0c;觉得难的他还没学会&#xff0c;会的不觉得难&#xff0c;但是前端不一样了&#xff0c;会了也难&#xff0c;因为谁都对前端提点建议&#xff08;啥也不懂的老板、产品经理、项目经理、…

【前端】一个好看的前端页面

序言 突发奇想&#xff0c;看到这个特效还不错&#xff0c;就加工了一下&#xff0c;如果也能帮到你&#xff0c;很开心 先上效果图 部分代码讲解 前端生成uuid function getUUID(len, radix) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.s…

从零学前端第一讲:前端开发是什么?给初学者有什么建议?

这里是修真院前端小课堂&#xff0c;本篇分析的主题是 【从零学前端第一讲&#xff1a;前端开发是什么&#xff1f;给初学者有什么建议&#xff1f;】 初识前端 1、前端开发是什么&#xff1f; 2、前端开发有前途吗&#xff1f; 3、前端开发哪里学&#xff1f; 4、前端发展…

前端是什么

此为小白浅显整合&#xff1a; 一直以来&#xff0c;对前端一直是一个笼统的概念&#xff0c;于是&#xff0c;专门花时间整合了网上各种说法&#xff0c;给自己一个较正确的定位。 前端是什么&#xff1f;&#xff1f; 前端&#xff0c;也称web前端。对于网站来说&#xff0…

怎么才能学好前端?

你如果知道简单的问题要百度&#xff0c;已经强过一部分人了。 至于学习方法&#xff0c;有些经验分享给你&#xff1a; 1.在学习的过程中&#xff0c;最好不是仅仅停留在前端与移动开发表层&#xff0c;不是抄书上的例子运行出结果就可以。要注意&#xff0c;即便对一个简单的…

web 前端入坑第一篇:web前端到底是什么?有前途吗

web前端到底是什么&#xff1f; 某货&#xff1a; “前几年前端开发人员鱼目混杂&#xff0c;技术参差不齐&#xff0c;相对学习起来不规范&#xff0c;导致> 前端开发人员聚集&#xff0c;所以现在前端工种和工资还是没得到普遍重视&#xff0c;但近2年来&#xff0c;> …

前端工程化详解——理解与实践前端工程化

前言&#xff1a; 前端工程化一直是一个老生常谈的问题&#xff0c;不管是面试还是我们在公司做基建都会经常提到前端工程化&#xff0c;那么为什么经常会说到前端工程化&#xff0c;并没有听过后端工程化、Java工程化或者Python工程化呢&#xff1f;我们理解的前端工程化是不是…

适合我的前端学习路线(学习前端不迷路)

适合我的前端学习路线&#xff08;学习前端不迷路&#xff09; 小伙伴们想学习前端&#xff0c;但是却不知如何入手&#xff0c;上网查前端学习路线&#xff0c;第一页往往充斥着各种培训公司的广告&#xff0c;又或者是搜前端学习路线图时&#xff0c;出现大量的路线图导致你还…

前端工程师行业现状怎么样?前景如何?

前端工程师行业现状怎么样&#xff1f;前景如何&#xff1f;前端即网站前台部分&#xff0c;运行在PC端移动端等浏览器上展现给用户浏览的网页。前端市场远没有饱和&#xff0c;现在的市场状况需求量非常多薪资可观。小编将通过官方数据宏观的给大家分析一下前端这个行业。 一…

快毕业了,很多人都不推荐做前端,前端业内最真实情况是什么样的?

偶尔出现这样一种说法,前端热度已经降低了,前端市场已经饱和了,前端工作没有那么好找了。 部分事实确实如此,大概是在2014-2018年,那时候前端技术刚刚崛起,相对来讲工作较现在更容易找到。 随着前端技术的发展及人才需求结构的成熟,现在已经不是会做动态网页就能找到工…

传智教育|一文读懂什么是前端?未来前景怎么样?(附前端学习路线图)

互联网高薪岗位众多&#xff0c;之前被大家津津乐道的后端工程师似乎慢慢不吃香了&#xff0c;原因是&#xff1a;过于内卷。 而为了打破目前内卷的局面&#xff0c;很多小伙伴在转行的时候就开始考虑起了前端工程师&#xff0c;这个岗位相比起后端的学习来说&#xff0c;难度…

我适不适合学前端?看完老程序员的这篇文章给你答案

什么是前端?什么又是后端呢? 1,在你机子上(PC端/手机端)看到的界面,安装的程序。给用户看的、操作的就是前端。你看不到的,帮你保存网络游戏数据,保存应用数据,处理数据的就是后端(服务端)。 2, 目前一般来说,前端指的就是浏览器端,后端指的就是直接为浏览器端…

关于根轨迹对于控制系统的一点理解

自动控制理论根轨迹的学习过程中&#xff0c;经常会遇到几个问题&#xff1a; 为什么要用根轨迹法&#xff1f;为什么根轨迹法最终转化为调整增益K来反应系统的稳定性和动态性能&#xff1f;为什么根轨迹法用开环传递函数求解的却是闭环极点&#xff1f; 盲目的借助于matlab进…