简单使用 Apache JMeter 进行压力测试

Jmeter是一个非常流行的性能测试工具, 开源,跨平台,且功能强大, 使用也非常方便, 仅需要安装Java环境支持即可运行.
说到我为什么用它, 挺囧的, 没有找到Mac上比较好用的测试工具, 虽然有 ab, http_load这样的控制台工具已经很好用了, 但是你要给你的领导看, 总不能直接截个控制台的图就行了吧, 怎么的也得图文并茂写上三五页的测试报告方能令你的领导满意对吧. 幸运的是Apache JMeter完全能满足我的需要. 升职加薪, 出任CTO赢取白富美, 走上人生巅峰, 指日可待啊!(喂, 大兄弟醒醒, 起来加班了)

下载 安装 Apache JMeter

Mac 上一条命令搞定, so, easy, 前提是你安装了homebrew

1
brew install jmeter

启动JMeter

命令行执行下面命令, 就会启动一个图形界面了

1
jmeter

运行预准备

现在来对LinuxEye进行压力测试,压力测试对象为随机的几个网页链接,这几个链接是写在一个文本文件中的,在压力测试的时候会随机读取。

建立一个线程组

为什么要建立线程组?原因很简单,因为我们要模拟多个线程(用户)来访问LinuxEye。线程属性部分中,线程数是启动多少个线程,我这里填写的是10,Ramp-Up Period (in seconds)表示线程之间间隔多少时间允许,单位是秒,比如如果填写10,那么10/10=1表示10个线程间每隔1秒钟请求网站。循环次数:60个线程运行完毕算是一次,循环次数就是这样的一个请求过程运行多少次,我这里测试就填写的是2。每次修改一个设置后,别忘记了保存一下。

设置请求服务器、压力链接等信息

接下来很自然的是,我们要测试的网站地址是什么?链接是什么?所以现在我们就来设置这些信息。右键点击我们刚创建的线程组,在弹出的菜单中,选择添加->Sampler->Http请求,弹出如下图界面:

假如你只是对一个链接进行压力测试,直接填写一个链接就ok,比如 http://www.linuxeye.com, 但是大多数情况下都不是这样的,我们这里需要多个链接,就如同刚开始讲到的那样,我们要将多个链接保存到一个文本文件中,然后随机读取进行压力测试。我们可以这么做,如图:

在选择一个功能下拉列表中选择_StringFromFile,然后在本机新建一个测试文件C:\Users\root\Desktop\apache-jmeter-2.9\test.txt,在第一行(你也可以不在第一行)的值中填写测试文件的路径,如下图:

然后点击“生成”按钮,在生成按钮的左边文本框中将生成一个字符串如:

${__StringFromFile(C:\Users\root\Desktop\apache-jmeter-2.9\test.txt,,,)}

在test.txt测试文件中,我们每行写一个URL链接,如下格式:

/command
/linuxrumen
/program
/jianzhan
/command/cat.html
/command/chmod.html
/command/lsattr.html
注意,每行前面并没有 http://www.linuxeye.com 这样的信息,因为我们在前面已经填写了服务器地址为 www.linuxeye.com, 这里就没必要再为每个url填写这个相同前缀了;另外,上面的url格式也只是个例子,表示域名后的部分。

这样一来,当我们并非请求的时候,就会从test.txt中随机选择url来进行压力测试。

另外值得注意的一个地方是,如果参数中有中文的情况,运行的时候可能会出现乱码,这个时候就需要注意你在Jmeter中的编码设置与你要请求的网页编码是一致的。

路径文本框下面的选项,可以按默认的就成,Use multipart/form-data for HTTP POST是当请求中有附件的情况,一般情况下都不用选中的。

查看运行结果

鼠标右键点击线程组,在弹出的菜单中选择添加->监听器->用表格查询结果,如下图:

属性如下

列举几个常用监听器索性说明

查看结果树

  1. Sample:每个请求的序号
  2. Start Time:每个请求开始时间
  3. Thread Name:每个线程的名称
  4. Label:Http请求名称
  5. Sample Time:每个请求所花时间,单位毫秒
  6. Status:请求状态,如果为勾则表示成功,如果为叉表示失败。
  7. Bytes:请求的字节数
  8. 如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。

在下面还有几个参数:

  1. 样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数
  2. 平均:每个线程请求的平均时间
  3. 最新样本:表示服务器响应最后一个请求的时间
  4. 偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。
  5. 线程组:测试里每个任务都要线程去处理,所有我们后来的任务必须在线程组下面创建。可以在“Test Plan(鼠标右击) -> 添加 ->Threads(Users) -> 线程组”来建立它,然后在线程组面板里有几个输入栏:线程数、Ramp-Up Period(in seconds)、循环次数,其中Ramp-Up Period(in seconds)表示在这时间内创建完所有的线程。如有8个线程,Ramp-Up = 200秒,那么线程的启动时间间隔为200/8=25秒,这样的好处是:一开始不会对服务器有太大的负载。
  6. 取样器(Sampler):可以认为所有的测试任务都由取样器承担,有很多种,如:HTTP请求。
  7. 断言:对取样器返回的请求结果给出判断是否正确。
  8. monitor:它的功能是对取样器的请求结果显示、统计一些数据(吞吐量、KB/S……)等

集合报告

PS: 我的测试结果删了, 就不重跑一边截图了, 反正也就是标记一下给自己看

  1. #Samples: 也就是图形报表中的样本数目,总共发送到服务器的样本数目。
  2. Average: 也就是图形报表中的平均值,是总运行时间除以发送到服务器的请求数。
  3. Median: 也就是图形报表中的中间值,是代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值。
  4. 90%line: 是指90%请求的响应时间比所得数值还要小。
  5. 95%line: 同上
  6. 99%line: 同上
  7. Min: 服务器响应的最短时间。
  8. Max: 服务器响应的最长时间。
  9. Error%: 请求的错误百分比。
  10. Throughput: 也就是图形报表中的吞吐量,这里是服务器每单位时间处理的请求数,注意查看是秒或是分钟。
  11. KB/sec: 是每秒钟请求的字节数。

图形结果

PS: 我的测试结果删了, 就不重跑一边截图了, 反正也就是标记一下给自己看

  1. 数据: 数据分布图
  2. 平均: 总运行时间除以发送到服务器的请求数
  3. 中值: 代表时间的数字,有一半的服务器响应时间低于该值而另一半高于该值
  4. 偏离: 表示服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布
  5. 吞吐量: 服务器每分钟处理的请求数

总结

功欲善其事, 必先利其器. 合理使用工具, 不重复造轮子, 有利于提升工作效率和和生活品质. 比如说这篇文章内容大部分来自参考内资料中的内容, 我只是对里面的内容进行了一定的修改和补充而已, 甚是美哉.
这里需要说明下, 本文章算是转载地址在下面

参考资料

http://jmeter.apache.org/
https://blog.linuxeye.com/335.html
http://www.cnblogs.com/fnng/archive/2012/12/21/2828440.html