我们写项目的时候经常需要测试,不仅需要功能测试还需要压力测试。接下来就介绍一下大家经常使用的测试工具。在学习 DDoS 知识的过程中,了解到 ab 这个测压工具,之前在其他博客上也了解到 jmeter 的测压工具。这两款软件都是 Apache 的开源项目,也是目前常用的网站测压工具。
# ab 和 jmeter 的区别
1. jmeter 是一次完整的请求和返回;AB 只是发出去请求
2. ab 是 shell 模式下轻量级的测试工具,jmeter 则作为有 GUI 界面的更高级测试工具
3. jmeter 可以提供更加详细的统计结果数据,比如接口错误信息、单线程的请求时间等,而 AB 则不支持
4. ab 更加轻量级,软件消耗的资源少,不会占用太多内存和 cpu,而 jmeter 消耗资源比较多
5. Jmeter 可以动态查看结果,而 ab 不可以,只有执行完才出结果,同时 Jmeter 的结果更加准确
# ab 如何使用
ab 是 httpd(也叫 apache)携带的轻量级测压工具,我们要从 apache 的官网上下载 httpd
# 下载 httpd(apache)🏫
linux 版本下载比较容易,以 windows 版本,apache 2.4 为例。
官网:https://httpd.apache.org/
点击 download
此处随便选一个提供商。
选择版本下载
下载完之后解压
# 使用 ab 和 abs
解压后,在 bin 目录下有两个小工具 ab.exe 和 abs.exe ,分别用于 http 和 https。
之后可以打开 cmd 或者 shell,直接使用 ab 和 abs 工具
使用 ab -help 列出了我们可以使用的参数
我们最常用的指令是 ab -n 100 -c 10 http://test.com/ 其中-n 表示请求总数,-c 表示并发数
对于 https 协议 使用 abs -n 100 -c 10 https://test.com/
以对我的网站进行测压为例(别乱用啊):
正在测压:
返回的结果:
测试结果:
Server Software: nginx/1.21.1 #被测试的 Web 服务器软件名称。
Server Hostname: shaogezhu.cn/ #请求的 URL 主机名。
Server Port: 443 #被测试的 Web 服务器软件的监听端口。
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 Server Temp Key: X25519 253 bits TLSServer Name: shaogezhu.cn
Document Path: / #请求的 URL 中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型。Document Length: 1270 bytes #表示 HTTP 响应数据的正文长度。
Concurrency Level: 10 #并发用户数,这是我们设置的参数之一。
Time taken for tests: 27.378 seconds #所有这些请求被处理完成所花费的总时间。Complete requests: 100 #总请求数量,这是我们设置的参数之一。 Failed requests: 1 #失败的请求数量, (Connect: 1, Receive: 0, Length: 0, Exceptions: 0) Total transferred: 150400 bytes # 所有请求的响应数据长度总和,包括每个 HTTP 响应数据的头信息和正文数据的长度。注意这里不包括 HTTP 请求数据的长度,仅仅为 web 服务器流向用户 PC 的应用层数据总长度 HTML transferred: 127000 bytes #表示所有请求的响应数据中正文数据的总和,也就是减去了 Total transferred 中 HTTP 响应数据中的头信息的长度。
Requests per second: 3.65 [#/sec] (mean) #每秒多少请求
Time per request: 2737.802 [ms] (mean) #用户平均请求等待时间
Time per request: 273.780 [ms] (mean, across all concurrent requests) #服务器平均处理时间,也就是服务器吞吐量的倒数 Transfer rate: 5.36 [Kbytes/sec] received #表示这些请求在单位时间内从服务器获取的数据长度
Percentage of the requests served within a certain time (ms) #这部分数据用于描述每个请求处理时间的分布情况 50% 584 66% 600 75% 624 80% 669 90% 862 95% 21606 98% 21623 99% 21626 100% 21626 (longest request)
最重要的三个参数: ⭐
Requests per second:吞吐率 ,指的是某个并发用户数下单位时间内处理的请求数
Time per request:上面的是用户平均请求等待时间
Time per request:下面的是服务器平均请求处理时间 是吞吐率的倒数
# 使用 jmeter
JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试,它最初被设计用于 Web 应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 还支持通过创建带有断言的脚本来验证你的程序返回了你期望的结果。
推荐一个 jmeter 的使用教程:http://www.jmeter.com.cn/category/jmeter-book
# 下载
因为它是基于 java 的,下载前请确保你有 jdk(8 以上)的环境。
下载地址:http://jmeter.apache.org/download_jmeter.cgi
选择右侧需要下载的压缩包版本(我这里下载的是 apache-jmeter-5.4.1.zip),下载完成后解压即可。
# 启动
🎈我们在解压后的 bin 目录下找到 jmeter.bat 的批处理脚本,只要有 jdk8 的系统环境,点击即可启动,出现一个 cmd 窗口和 Jmeter 的 GUI 界面(基于 Swing),注意不要关闭 cmd 窗口,不然 GUI 窗口也会关闭。
也可以把 Jmeter 放入系统的环境变量中,命令行中输入 Jmeter 即可启动。我们一般使用不多,就不做讲解,如果想要了解详情,可以参考上面提供的连接中的使用教程。
# 使用
1. 右击左边的 Test Plan 添加一个线程组。
在这个线程组下这个线程组的线程数,也就是并发用户数,循环次数每个并发用户的请求数。
参数 ramp-up period 用于告知 JMeter 要在多长时间内建立全部的线程。默认值是 1。假如说 ramp-up period 为零, JMeter 将立即建立所有线程,并发访问,假设 ramp-up period 设置成 T 秒, 全部线程数设置成 N 个, JMeter 将每隔 T/N 秒建立一个线程
👉🏻 Loop Count 是循环次数,请求总数量 = 线程数 * 循环次数。
2. 在这个线程组下右键在 sampler(取样器)里面选择 http 请求,创建 http 请求。
可以设置 http 请求的协议,参数,路径等。
3. 在 HTTP 请求右键里面选择监听器下的聚合报告,创建一个聚合报告,可以查看这次测试的结果。
也可以添加结果树。
4. 点击启动的图标,之后再聚合报告和视图结果树中查看本次测试的结果。
聚合报告可以查看统计数据:
数据含义:
Label: 每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
Samples: 表示你这次测试中一共发出了多少个请求,如果模拟 10 个用户,每个用户迭代 10 次,那么这里显示 100
Average: 平均响应时间 —— 默认情况下是单个 Request 的平均响应时间
Median: 中位数,也就是 50 %用户的响应时间
90% Line: 90 %用户的响应时间
Min: 最小响应时间
Max: 最大响应时间
Error%: 本次测试中出现错误的请求的数量 / 请求的总数
Throughput: 吞吐量 —— 默认情况下表示每秒完成的请求数
KB/Sec: 每秒从服务器端接收到的数据量
结果树可以查看每一个请求和请求返回的结果:
我们看到,虽然设置为了 https 和 443 端口,但是 Jmeter 还是走了 http,而要让 Jmeter 使用 Https 协议,需要我们导入 Https 证书,常用的方法有录制 Https 和手动配置证书两种办法。
录制 https:
这种方式 Jmeter 会代理浏览器的请求和响应。
手动配置证书:
这里我们选择这种办法。
1)下载被测网站证书导入 Jmeter
使用 jdk 自带的工具 keytool 将 cer 格式的证书转换为 store 格式
命令如下 keytool -import -alias "test.store" -file "my.cer" -keystore test.store 中间会要求设置口令
再 Jmeter 中选择 SSL Manager 导入证书
2) 之后即可使用 https 协议
# 最后
补充 ab 工具的所有参数解释🚀🚀🚀
-n 测试会话中所执行的请求个数,默认仅执行一个请求
- c 一次产生的请求个数,即同一时间发出多少个请求,默认为一次一个
- t 测试所进行的最大秒数,默认为无时间限制.... 其内部隐含值是 [-n 50000], 它可以使对服务器的测试限制在一个固定的总时间以内
- p 包含了需要 POST 的数据的文件
- T POST 数据所使用的 Content-type 头信息
- v 设置显示信息的详细程度
- w 以 HTML 表格的形式输出结果,默认是白色背景的两列宽度的一张表
- i 以 HTML 表格的形式输出结果,默认是白色背景的两列宽度的一张表
- C 对请求附加一个 Cookie 行,其典型形式是 name=value 的参数对,此参数可以重复
- H 对请求附加额外的头信息,此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对 (如 "Accept-Encoding: zip/zop;8bit")
-A HTTP 验证,用冒号:分隔传递用户名及密码
- P 无论服务器是否需要 (即是否发送了 401 认证需求代码), 此字符串都会被发送
- X 对请求使用代理服务器
- V 显示版本号并退出
- k 启用 HTTP KeepAlive 功能,即在一个 HTTP 会话中执行多个请求,默认为不启用 KeepAlive 功能
- d 不显示 "percentage served within XX [ms] table" 的消息 (为以前的版本提供支持)
-S 不显示中值和标准背离值,且均值和中值为标准背离值的 1 到 2 倍时,也不显示警告或出错信息,默认会显示最小值 / 均值 / 最大值等 (为以前的版本提供支持)
-g 把所有测试结果写入一个 'gnuplot' 或者 TSV (以 Tab 分隔的) 文件
- e 产生一个以逗号分隔的 (CSV) 文件,其中包含了处理每个相应百分比的请求所需要 (从 1% 到 100%) 的相应百分比的 (以微妙为单位) 时间 -h 显示使用方法
- k 发送 keep-alive 指令到服务器端