前言

为何JMeter

犹记得当年工作之初,压测根本不成为话题,当时的框架也相对复杂,和现在的SpringBoot用法简直云泥之别,在那种环境下,除了大公司,压测自然不是项目首要考虑的范畴。

但时过境迁,互联网井喷时代,信息爆炸式输出,大数据、云时代接踵而至,测试岗位的重要性逐步凸显,相应的压力测试、性能测试也成为项目绕不开的一环。

如果说一个Java程序员在迈向高级工程师必须要掌握主流的技能如SpringBoot、SpringCloud、MQ、k8S等等以外,还需要具备什么辅助技能,我可以很负责任的说,压测一定是未来挡在面前的一扇门。

为何这么讲,首先,并非所有的公司都有一定规模,都有自己的测试团队,或者测试人员都具备压测能力,反而有相当多的中小企业没有这些基础条件,但同时又承接了一定规模的项目,不要意外,这在关系网纵横交错的国内是很常见的事情。

我多年工作的经历告诉我,绝大部分程序员主要还是活跃在中小厂,这里面包含初级中级工程师,也包含因为各种原因从大厂下沉到中小厂的高级工程师,加上疫情造成市场下行压力变大的原因,我大胆判断未来的软件公司会走向碎片化,更小更精简的公司团队会承接更大更特殊的项目任务,这种现象会在之后一些年逐步显现。

那么,在这种团队中生存的程序员,如果未来要迈向高级工程师,压测就是必备的技能之一,只有测试阶段进行了反复的压测及优化,最终投入生产环境才会更安全可靠,这样的团队才会更被客户单位所认可。

这也是我专门出一篇JMeter压测相关文章的原因,尝试了好几个工具,还是觉得JMeter的实用性更强,压测结果也更可靠。

JMeter用法

安装其实挺简单,为了方便演示,我直接Windows上安装了,后面生产环境用法会讲Linux下安装,官网相关地址如下。

1)、官网:http://jmeter.apache.org/

2)、下载:http://jmeter.apache.org/download_jmeter.cgi/

3)、用户手册:http://jmeter.apache.org/usermanual/index.html

1、安装

1)、下载

clipboard.png

2)、解压

解压后在bin目录双击jmeter.bat打开,界面如下。

clipboard.png

2、使用

1)、添加线程组

测试计划右键-添加-Threads(Users)-线程组

clipboard.png

线程组配置看图片中红字说明

clipboard.png

2)、HTTP请求默认值

线程组右键-添加-配置元件-HTTP请求默认值,设定一个默认的路径,之后就不用每个地方都重写一遍了。

clipboard.png

clipboard.png

3)、添加HTTP请求

线程组右键-添加-Sampler-HTTP请求,新建一个拿来压测的请求URL及参数。

这里参数给的是变量,变量名对应后面的配置文件,用${XXX}这样的形式写入。

目的是,模拟多个用户发出这个请求,即有多个user和多个token写入cookie,如:

userId1,userToken1

userId2,userToken2

userId3,userToken3

clipboard.png

设置请求路径及变量如图所示

clipboard.png

4)、模拟多用户请求

这里需要用到变量,线程组右键-添加-配置元件-CSV Data Set Config。

clipboard.png

clipboard.png

配置文件如下,自己设定一个id和token,在浏览器上F12查找一个拿来用。 或者使用程序生成几百几千个用户id,token,来模拟多用户访问。

clipboard.png

5)、查看压测结果

执行压测后需要查看相关结果,线程组右键-添加-监听器-聚合报告,这里有很多包括表格、图表等等,一般就看聚合报告。

clipboard.png

聚合报告如图所示,这里的Throughput属性就是指吞吐量,前面的Samples就是请求量。

含义:10000个请求的吞吐量是300-400之间,可以通俗理解为仅支持几百个并发(方便理解专业点一般不这么讲),很低,需要性能优化。

clipboard.png

生产环境用法

1、安装

1)、将apache-jmeter-3.3.zip上传到Linux服务器上;

2)、unzip xx.zip进行解压;

3)、如果报了找不到unzip命令,就执行yum install -y unzip zip安装上就可以了。

2、新建压测文件

1)、新建一个压测文件:如user_list.jmx,设定线程组中线程数为5000,循环次数为10,表示执行50000次;

2)、将这个文件上传到Linux服务器上;

3)、具体新建压测文件jmx的方法参照前面的讲解。

3、执行压测

1)、同级目录下,执行命令:./apache-jmeter-3.3/bin/jmeter.sh -n -t user_list.jmx -l result.jtl

2)、启动jmeter进行压测,压测后的结果输出为result.jtl文件。

4、观测现象

在执行过程中,可以另开启一个窗口,执行top命令查看服务器承受的负载。(主要看红框这个,以及下面进程中的java相关的,会发现负载变得很大,CPU占用率也很高。

clipboard.png

5、导出结果

1)、将result.jtl下载到本地环境,然后在jmeter中的聚合报告那里,浏览打开,看结果;

2)、可以发现吞吐量很不理想,Linux服务器配置较低时,error很高,说明应用程序难以承受直接挂掉了。

clipboard.png

6、压测建议

1)、压测不能依靠一次评判,一般第一次只是热身,以第二次第三次压测为准;

2)、不要在工作时间或运行高峰期时间进行压测,这是很危险的行为,最佳时期一定是测试阶段,少部分特殊情况只能在生产环境压测也一定要选择安全时段如凌晨;

3)、根据压测结果,进行性能优化后,可以再次像上述一样进行压测,然后导出聚合报告进行对比,直到达到理想结果。

总结

其实压测本身不难,压测的工具和方式也很多,比如redis有自己的压测工具redis-benchmark,还有Apache Benchmark简称ab,是Apache自带压测工具,这些用法都很简单。

压测是迈向高级工程师必会的技能之一,尤其是对核心业务接口的压测十分常用,正规的项目在测试阶段都需要压测,若公司有测试团队当然更好,但以java高级工程师为目标的话,压测技能你可以不会,但绝不能不了解。

分享

开篇说了,这是我8年多工作及学习过程中在云笔记中记录的内容之一,其实还有很多我闲暇之余都做了下整理,有感兴趣的朋友可以下载看看,什么时候用到了翻开说不定就能节省很多时间。

资料图.png


本人原创文章纯手打,专注于分享主流技术及实际工作经验,觉得有一滴滴帮助的话就请点个赞和收藏吧!

作者:|fly_烟雨行舟|,原文链接: http://www.imooc.com/article/325511

文章推荐

SpringCloud 客户端负载均衡:Ribbon

深入浅出Nginx实战与架构

es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高...

MySQL之SQL语句优化

理解RESTful Api设计

『忘了再学』Shell基础 — 17、预定义变量

简单聊聊设备指纹设计

为什么我写了路由懒加载但代码却没有分割?

MyBatis 结果映射总结

【业务实例】vue组件递归及其应用

[java并发编程]基于信号量semaphore实现限流器

Redis 做接口限流,一个注解的事!