我们在开发的过程中,如果遇到系统预估访问量会比较大的时候,或者我们再做底层基础服务的时候,往往需要对我们的服务性能做一些压力测试和稳定性测试,市面上有很多压测工具,今天我们主要讲解的是Jmeter压力测试工具,鉴于最近做的一次项目正儿八经的做了一次压测,加上以前零零碎碎的学习,本次我打算总结一下。
一、Jemter的安装
我所下载的Jmeter是5.4版本的,解压过后进入bin目录,双击jmeter.sh,如图表示软件启动成功.
二、如何构建一个接口的压测脚本
接下来我们启动一个接口服务,新增压测脚本
1、新增线程组
创建100个线程,指定在1s内生成这全部100个线程,循环跑10次,整个压测跑下来执行接口请求1000次。
2、构建http取样器
输入采样器的名称、协议、服务器域名或者IP、端口号、Method及Url信息。
3、监听器里添加查看结果树(比较耗服务器性能,不需要可以不加)和聚合报告
三、报告详解
看下我们第一次的的压测结果,
本次的接口完全是通过mysql来提供数据的,没有做任何的缓存,性能是非常之差,我们详细解释下各个参数的意思.
样本:就是本次我们一共进行了多少次接口请求
平均值:就是接口的平均响应时间,单位是ms
中位数:就是接口响应时间的中位数,单位是ms
90%百分数:就是90%的接口响应时间不超过这个数值,单位是ms
95%百分数:就是95%的接口响应时间不超过这个数值,单位是ms
99%百分数:就是99%的接口响应时间不超过这个数值,单位是ms
最小值:接口的最小响应时间,单位是ms
最大值:接口的最大响应时间,单位是ms
异常:接口异常的百分比
吞吐量:单位时间(1s)的接口请求次数
接收:收到的千字节每秒的吞吐量测试
发送:发送的千字节每秒的吞吐量测试
接下来我们做三次性能优化
①:加缓存Redis
②:加缓存Redis且用protobuf序列化
③:加缓存EhCache
这样我们可以通过压测工具一步步测试我们程序优化的效果,最终达到我们要求的压测指标。
四、如何在服务器上跑压力测试
上述我们是在windows的界面开发下进行的压力测试,一般在公司里,我们会搭建专门的施压服务器,用于进行压力测试。
首先把我们的服务部署到服务器上去:
在压测服务器上需要安装jdk,配置Jmeter环境,上传apache-jmeter-5.4.tgz到服务器解压
Jmeter命令参数解释:
利用GUI工具编写测试计划,生成一个jmx文件(包括监控、聚合报告、tps、服务器资源监控等),上传到服务器。
执行JMeter文件:在Linux服务器中找到文件所在的目录,然后开始执行
jmeter -n -t /opt/test/获取学生信息.jmx -l result.jtl -e -o /opt/test/result
执行完毕后将jtl文件下载到本地,利用GUI工具可以查看压测结果。
Jmeter多机压测(分布式压测),在有些时候,我们的压测服务器单机产生的请求量不一定能够满足压测要求,这个时候我们需要开多台压测服务器协调。
分别在两台机器上安装jmeter软件,一台是控制机,一台是Agent节点
在Agent节点的jmeter.properties上修改 server.rmi.ssl.disable=true
启动Agent:jmeter-server -Djava.rmi.server.hostname=<Ip>
修改控制机配置jmeter.properties remote_hosts=121.36.136.241:1099
启动控制机: jmeter-server
执行压测脚本,多一个参数 -r 表示全部agent启动并参与测试
jmeter -n -t /opt/test/获取学生信息.jmx -r -l result.jtl -e -o /opt/test/result
在Agent节点上也会打印2行日志
五、Jmeter安装插件拓展功能
Jmeter作为一个开源工具,相比一些商用工具(如LoadRunner),在功能上就稍显不足,好在Jmeter可以集成第三方插件来丰富功能。
插件下载地址:jmeter-plugins.org
下载plugins-manager.jar文件后,将其放入jmeter的安装目录的lib/ext目录下,重启jmeter
重启后,我们为压测脚本添加监听器可以用来监测接口响应时间和tps的变化情况:
在做压测的时候,我们除了关心接口性能的指标数据外,还有一点非常重要,我们也要时刻关注服务器资源的消耗情况,试想一下,如果服务器费了九牛二虎之力跑出了我们需要的性能指标,但是服务器消耗过大,随时都有宕机的风险,这样的压测结果没有任何意义,但是我们怎么监测服务器性能呢?如下:
我们需要安装PerfMon插件
同时我们在服务器也需要开启一个Agent
总结:
压力测试只能帮我们发现程序中的性能问题,但是它并不能帮我们解决问题,我们程序员除了要掌握压测的能力外,更重要的是优化程序的能力,包括但不限于数据库连接池调优、引入缓存、序列化调优、JVM调优、容器调优等,同时我们还需要不断监控服务器的CPU、内存、磁盘等硬件情况,我们要达到的目的是服务器能够在维持硬件资源正常工作的状态下,让我们的接口性能达到最优。
本次用到的软件:
链接:https://pan.baidu.com/s/1YajIPjQgqrtBNEtAvs-58A
提取码:xdjl