使用 Jmeter 对 Java web 执行负载(压力)测试

最近一个月不是写文档就是敲js,这两天难得有个压测,总算跟java挂钩了。先说说压力测试,这绝对是一件很刺激的事情,玩心跳,试想一下,眼睛盯着服务器的性能分析数据,一边在不断地增大负载,心扑通扑通的跳,真刺激!

首先感谢两位兄台的启发:
http://www.thegeekstuff.com/2015/02/jmeter-load-testing/
https://www.digitalocean.com/community/tutorials/how-to-use-apache-jmeter-to-perform-load-testing-on-a-web-server

JMeter是一个桌面应用程序,可以用于执行功能测试和负载测试。虽然JMeter应用程序本身被设计为纯Java应用程序,但是它可以用于执行任何类型的web应用程序的负载测试。应用程序的最初意图是测试Apache Tomcat的性能,它基本上是一个web服务器。多年来,Jmeter随着用户界面的改进和其他特性的改进,使它成为企业web应用程序的一个可行的性能测试和负载测试工具。

JMeter是什么?

JMeter是Apache开源项目的一部分。
它最初是为了测试web服务器的性能而编写的,现在它已经作为一个自动化的测试工具和测试数据,以及用于web应用程序、文件服务器、web服务器甚至数据库的功能测试工具。我们将在本教程中探讨JMeter的重要特性。可以通过配置来模拟针对特定web服务器或应用程序的N个用户和线程。它为web应用程序生成一个模拟负载来度量其性能。此外,您还可以通过循环引发几个迭代来获得平均结果,实现断言,并查看测试结果的图形和统计表示。

我们的压力测试分为以下几个步骤:
1).环境准备
2).下载jmeter
3).安装jmeter
4).建立测试计划
5).查看测试结果
6).与测试服务器结合分析
7).结论

1).环境准备
java环境,这个不用多说,自行百度。这里以window平台来测试。

2).下载jmeter
百度输入:apache jmeter,点进官网下载,根据本机jdk版本选择jmeter的版本。

这里写图片描述

这里一定要选择binaries版本,安装时会省很多事。

3).安装jmeter
将上一步下载的jmeter解压。例如解压在D盘。
<1>在环境变量里面新建一个:
变量名:JMETER_HOME
变量值:D:\apache-jmeter-3.1

<2>在CLASSPATH里面加:
;%JMETER_HOME%/lib/ext/ApacheJMeter_core.jar;%JMETER_HOME%/lib/jorphan.jar;%JMETER_HOME%/lib/logkit-2.0.jar

<3>在jmeter的bin目录下,双击jmeter.bat
这里写图片描述

若有两个弹出框,其中一个是jmeter的图形界面(swing做的),即说明安装成功。

这里写图片描述

一旦安装了JMeter并运行,让我们继续构建一个测试计划!

4).建立测试计划
测试计划由一系列测试组件组成,这些组件决定如何模拟负载测试。我们将解释在我们的测试计划中如何使用这些组件。

添加一个线程组
首先,添加一个线程组来测试计划:
<1>右键单击测试计划
<2>鼠标添加
<3>鼠标/线程(用户)
<4>点击线程组
线程组有三个特别重要的属性影响负载测试:
<1>线程数(用户):JMeter试图模拟的用户数量。设置这个50
<2>加速周期(以秒为单位):JMeter将会将线程的启动分配到线程的持续时间。设置为10。
<3>循环计数:执行测试的次数。把这个设置为1。

这里写图片描述

添加HTTP请求默认值
HTTP请求默认配置元素用于为测试计划中的HTTP请求设置默认值。如果我们想要将多个HTTP请求发送到相同的服务器,作为测试的一部分,这一点特别有用。现在让我们添加HTTP请求默认为线程组:
<1>选择Thread Group,然后右键单击它
<2>鼠标添加
<3>鼠标/Sampler
<4>单击HTTP请求默认值
在HTTP请求默认情况下,在Web服务器部分中,将服务器名或IP字段填入您想要测试的Web服务器的名称或IP地址。在这里设置服务器使它成为该线程组中其余项的默认服务器。

这里写图片描述

在表侦听器中添加视图结果
在JMeter中,侦听器用于输出负载测试的结果。有很多可用的侦听器,可以通过安装插件来添加其他侦听器。我们将使用该表,因为它易于阅读。
<1>选择Thread Group,然后右键单击它
<2>鼠标添加
<3>鼠标侦听器
<4>单击表中的视图结果

5).查看测试结果
运行基本测试计划
现在我们已经建立了基本的测试计划,让我们运行它并查看结果。
首先,通过单击文件保存测试计划,然后保存,然后指定所需的文件名。然后在左侧窗格中选择查看结果,然后从主菜单单击Run,然后单击Start(或者单击主菜单下面的绿色Start箭头)。应该看到测试结果在表中作为测试运行:

这里写图片描述

这里写图片描述

这里写图片描述

解释结果
您可能会看到所有请求的状态都是“成功”(由绿色三角形表示,其中有一个复选标记)。在此之后,您可能最感兴趣的列是示例时间(ms)和延迟(在示例中没有显示)。
延迟:在JMeter发送请求和收到初始响应时之间的毫秒数
示例时间:服务器完全服务于请求(响应+延迟)的毫秒数
样本数目:是指在测试过程中,总共想服务器发出的请求数目。成功的情况下等于你设定的并发数目×循环次数
最新样本:他是代表时间的,表示服务器响应最后一个请求的时间。
吞吐量 : 表示服务器每分钟处理的请求数目。
平均值 : 总的运行时间除以发送到服务器的请求数目;
偏离 : 服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布。
中值 : 时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。

6).与测试服务器结合分析
ssh登录到服务器上去看看cpu和内存的使用情况,使用top:

这里写图片描述

参数说明
Cpu:
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
Men:内存
total — 物理内存总量
used — 使用中的内存总量
free — 空闲内存总量
buffers — 缓存的内存量

除非您有用户积极地攻击您的服务器,否则您应该看到Cpu(s)%用户使用量(us)应该非常低或0%,并且Cpu(s)%空闲(id)应该是99% +,这样: 现在,在JMeter中,再次启动测试,然后切换回web服务器的SSH会话。您应该看到资源使用量的增加,一开始用50个线程,平均请求时间是0.3s,cpu2%,增加负载,让我们在10秒内用80个线程尝试相同的测试。在左窗格中的线程组项中,将线程(用户)的数量更改为100。现在单击表中的视图结果,然后再运行测试100个是2s, cpu13%,200个9s,cpu 28%,500个19秒,cpu53%,到1000个时,cpu98%。。。bome!测试服务器崩了。其实我这种增加线程太多,应该慢慢加,幅度不要太大,慢慢测出在需要的请求时间内的最大的线程数。

7).结论
<1>JMeter可以成为确定如何改进web应用程序服务器设置的非常有价值的工具,以减少瓶颈和提高性能。既然您已经熟悉了JMeter的基本用法,您可以创建新的测试计划来度量各种场景中服务器的性能。
我们所使用的测试示例并不能准确地反映一个普通用户的使用模式,但是JMeter有一些工具来执行各种测试,这些测试在您的环境中可能是有用的。例如,JMeter可以配置为模拟用户登录到您的应用程序、客户端缓存,以及通过URL重写处理用户会话。还有许多其他内置的samplers、侦听器和配置工具可以帮助您构建所需的场景。此外,还有JMeter插件来增强其功能,可在http://jmeter plugins.org/上下载。 <2>在计算机世界里面,时间可空间永远是不可调和的矛盾!cpu用的多,计算的越快,内存耗得越大,我上面的测试例子内存是不考虑的,大部分情况下,cpu是性能的短板。