WEB服务压力测试

WEB服务器压力测试

在学习ab工具之前,我们需了解几个关于压力测试的概念

  1. 吞吐率(Requests per second)
    概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
    计算公式:总请求数 / 处理完成这些请求数所花费的时间,即
    Request per second = Complete requests / Time taken for tests
  2. 并发连接数(The number of concurrent connections)
    概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。
  3. 并发用户数(The number of concurrent users,Concurrency Level)
    概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。
  4. 用户平均请求等待时间(Time per request)
    计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
    Time per request = Time taken for tests /( Complete requests / Concurrency Level)
  5. 服务器平均请求等待时间(Time per request: across all concurrent requests)
    计算公式:处理完成所有请求数所花费的时间 / 总请求数,即
    Time taken for / testsComplete requests
    可以看到,它是吞吐率的倒数。
    同时,它也=用户平均请求等待时间/并发用户数,即
    Time per request / Concurrency Level

AB工具简介

AB全称为:apache bench

AB是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,主要是显示你安装的Apache每秒可以处理多少个请求,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

下载AB工具

进入apache官网 http://httpd.apache.org/ 下载apache即可

Apache Haus Downloads

启动ab工具

以windows环境下,apache安装路径为C:\apache\Apache24\为例

打开终端,输入命令
cd C:\apache\Apache24\bin
即可启动ab

abs进行https测试

开始测试

输入命令

1
ab -n 100 -c 10 http://www.psvmc.cn/

其中-n表示请求数,-c表示并发数

其余命令请参见 http://apache.jz123.cn/programs/ab.html

测试本地

1
ab -n 1000 -c 100 http://192.168.2.218:8899/1.jpg

-n 测试几次(Number of requests to perform for the benchmarking session. The default is to just perform a single request which usually leads to non-representative benchmarking results.)

-c 模拟多少客户端(Number of multiple requests to perform at a time. Default is one request at a time.)

-T 内容类型。这个一般和-p 一起使用(Content-type header to use for POST data.)

-p 包含POST参数的文件(File containing data to POST.)

1
ab -n 100 -c 10 -p E:\Tools\postbody.json -T application/json http://www.psvmc.cn/

https

1
abs -n 100 -c 10 -p E:\Tools\postbody.json -T application/json http://www.psvmc.cn/

测试结果分析

上面的命令运行完毕后就出来测试报告了

image-20210521152155048

这段展示的是web服务器的信息,可以看到服务器采用的是nginx,域名是www.psvmc.cn,端口是80

服务器信息

这段是关于请求的文档的相关信息,所在位置“/”,文档的大小为194 bytes(此为http响应的正文长度)

重要指标

作用
Concurrency Level: 10 并发请求数
Time taken for tests: 2.773 seconds 整个测试持续的时间
Complete requests: 100 完成的请求数
Failed requests: 0 失败的请求数
Total transferred: 39400 bytes 整个场景中的网络传输量
HTML transferred: 19400 bytes 整个场景中的HTML内容传输量
Requests per second: 36.06 [#/sec] (mean) 吞吐率,大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
Time per request: 277.294 [ms] (mean) 用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
Time per request: 27.729 [ms] (mean, across all concurrent requests) 服务器平均请求处理时间,大家最关心的指标之三
Transfer rate: 13.88 [Kbytes/sec] received 平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

这段表示网络上消耗的时间的分解

image-20210521152344244

其中

min:最小值

mean:平均值

median:中位数

max:最大值

网络消耗时间

这段是每个请求处理时间的分布情况,50%的处理时间在263ms内,66%的处理时间在276ms内,重要的是看90%的处理时间。

image-20210521152420321

登录的问题

有时候进行压力测试需要用户登录,怎么办?
请参考以下步骤:

先用账户和密码登录后,用开发者工具找到标识这个会话的Cookie值(Session ID)记下来

如果只用到一个Cookie,那么只需键入命令:

1
ab -n 100 -C key=value http://www.psvmc.cn/

如果需要多个Cookie,就直接设Header:

1
ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://www.psvmc.cn/

总结

总的来说ab工具AB小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。

因此ab工具可以用作临时紧急任务和简单测试。
同类型的压力测试工具还有:webbench、siege、http_load等

其他测试工具

Locust

官方文档 Installation — Locust 1.5.3 documentation

相比与AB这个工具更加强大,能设置请求的权重或者是请求携带其他请求的返回值。

安装Chocolatey

以管理员方式启动PowerShell,输入

1
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

安装Python3

1
choco install python

安装后重启一下PowerShell

安装locust

1
pip3 install locust

查看版本

1
locust -V

在当前目录下创建locustfile.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import random
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
wait_time = between(1, 3)
host = "http://www.psvmc.cn"

@task
def index_page(self):
self.client.get("/index.html") # 这里的地址需要排除 host 部分
self.client.get("/userlist.json")

@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/search.json?id={item_id}", name="/search.json")

def on_start(self):
self.client.post("/login.json", {"username":"foo", "password":"bar"})

运行

1
locust

注意

Locust 会默认查找当前目录下名为locustfile.py,如果该文件不在当前文件夹或者你取了其他的名字,就需要加上下面的 -f 参数了。

比如

1
locust -f locust_files/my_locust_file.py

网页上访问

http://localhost:8089/

界面如下

image-20210522100342645

请根据表单内容填写

  • Number of total users to simulate -> 最大并发用户数
  • Hatch rate -> 孵化率(每秒生成的虚拟用户数)
  • Host -> 被测系统的 Host(如果你在 User类 中定义了host 属性,会自动带出来,如果没有就需要输入)

比如

1
2
3
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
host = "http://www.psvmc.cn"

对上面的代码进行分解:

1
2
import random
from locust import HttpUser, task, between

Locust 文件只是普通的 Python 代码文件,可以手动引入 Locust 相关的库以及你需要用到的其他第三方库。

1
class QuickstartUser(HttpUser):

在这里,我们为要模拟的用户定义一个类。它继承自HttpUser,该属性为每个用户提供了一个 client 属性,该属性是HttpSession的一个实例。可用于向负载测试的目标系统发出 HTTP 请求。当测试开始时,Locust 将为它每个虚拟用户创建一个此类的实例,并且每个虚拟用户会在自己的 gevent 线程中运行这些实例。

HttpUser 类是 Locust 1.x 版本中用来代替以前的 HttpLocust 类,用来定义虚拟用户。是 User 类的子类。

思考时间

1
wait_time = between(1, 3)    # 思考时间

我们的类定义了一个wait_time函数,它将使模拟用户在每个任务执行后的 1 ~ 3 秒之间等待。

等待时间主要为了模拟用户在实际使用过程中存在的思考时间,对实际用户在操作系统过程中来说,他/她不会无时无刻不停的操作系统,而是操作一下暂停思考下一步动作。

有关更多信息,请参见wait_time attribute.

1
2
3
4
5
6
7
8
9
@task
def index_page(self):
self.client.get("/index.html") # 这里的地址需要排除 host 部分
self.client.get("/userlist.json")

@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/search.json?id={item_id}", name="/search.json")

通过用 @task 装饰了两个方法来声明了两项任务,其中一种具有更高的权重(@task(3))。只有通过 @task 装饰的方法才会在 Locust 虚拟用户运行过程中被调用。

当虚拟用户运行时,会从两个任务中选择一个运行,由于 view_item 的权重为 3,因此在选择任务时会有三倍的机会选择 view_item。虚拟用户会根据权重调用一个方法来运行,运行后会根据wait_time定义的等待时间休眠 5~9 秒。待休眠时间结束后,会重新根据权重调用一个新任务来执行,并循环重复。

在测试过程中,只有被 @task 定义的方法才会被调用。当然被定义为任务的方法可以调用你定义的其他方法。

view_item任务中,我们通过使用查询参数动态加载 URL,该查询参数是一个从 1 到 10000 之间随机选择的数字。为了避免在 Locust 的统计信息中获得 10k 个单独的条目(Locust 会根据 URL 分组统计信息),会使用名称参数name parameter将所有这些请求分组到名为/item的条目下。

注意,只有用@task装饰的方法才会被调用,因此可以在 locustfile.py 的测试类中随意定义其他的辅助方法,以提升测试场景的复杂和灵活性。

1
def on_start(self):

此外,我们还声明了on_start方法。每个虚拟用户在启动时都会调用具有该方法。

比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import random
from locust import HttpUser, task, between
from json import JSONDecodeError

class QuickstartUser(HttpUser):
wait_time = between(1, 3)
host = "http://www.psvmc.cn"
token = ""

@task
def index_page(self):
self.client.get("/index.html") # 这里的地址需要排除 host 部分
self.client.get("/userlist.json")

@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/search.json?id={item_id}", name="/search.json")

def on_start(self):
with self.client.get("/login.json", json={"username": "admin", "userpwd": "123456"}, catch_response=True) as response:
try:
if response.json()["obj"]["token"] != None:
token = response.json()["obj"]["token"]
except JSONDecodeError:
response.failure("Response could not be decoded as JSON")
except KeyError:
response.failure("Response did not contain expected key 'greeting'")

这样就可以在其他请求中携带token值了

有关更多信息,请参见on_starton_stop方法

on_start() 方法是 hook 函数之一,用来定义在一些特殊事件下触发的逻辑。 on_start() 方法是在虚拟用户启动(启动事件)时会触发的方法。

webbench

webbench是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力。下载

地址可以到google搜,我这里给出一个
下载地址:http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz
这个程序更小,解压后不到50K,呵呵
安装非常简单

1
2
3
4
wget http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz
tar zxvf webbench-1.5.tar.gz
cd webbench-1.5
make && make install

会在当前目录生成webbench可执行文件,直接可以使用了

用法:
webbench -c 并发数 -t 运行测试时间 URL
如:

1
webbench -c 5000 -t 120 http://www.baidu.com/

http_load

程序非常小,解压后也不到100K

http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工

具,它可以以一个单一的进程运行,一般不会把客户机搞死。还可以测试HTTPS类的网站请求。

下载并编译安装:

1
2
3
4
wget http://www.acme.com/software/http_load/http_load-09Mar2016.tar.gz
tar zxf http_load-09Mar2016.tar.gz
cd http_load-09Mar2016
make && make install

命令格式:http_load -p 并发访问进程数 -s 访问时间 需要访问的URL文件

参数其实可以自由组合,参数之间的选择并没有什么限制。比如你写成

1
http_load -parallel 5 -seconds 300 urls.txt

也是可以的。我们把参数给大家简单说明一下。

-parallel 简写-p :含义是并发的用户进程数。
-fetches 简写-f :含义是总计的访问次数
-rate 简写-p :含义是每秒的访问频率
-seconds简写-s :含义是总计的访问时间

准备URL文件:urllist.txt,文件格式是每行一个URL,URL最好超过50-100个测试效果比较好.文件格式

例如:

1
http_load -p 30 -s 60 urllist.txt

参数了解了,我们来看运行一条命令来看看它的返回结果
命令:

1
./http_load -rate 5 -seconds 10 urls

说明执行了一个持续时间10秒的测试,每秒的频率为5。

49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds5916 mean bytes/connection4.89274

fetches/sec, 28945.5 bytes/secmsecs/connect: 28.8932 mean, 44.243 max, 24.488 minmsecs/first

-response: 63.5362 mean, 81.624 max, 57.803 minHTTP response codes: code 200 – 49

结果分析:

  1. 49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
    说明在上面的测试中运行了49个请求,最大的并发进程数是2,总计传输的数据是289884bytes,运行的时间是10.0148秒

  2. 5916 mean bytes/connection说明每一连接平均传输的数据量289884/49=5916

  3. 4.89274 fetches/sec, 28945.5 bytes/sec
    说明每秒的响应请求为4.89274,每秒传递的数据为28945.5 bytes/sec

  4. msecs/connect: 28.8932 mean, 44.243 max, 24.488 min说明每连接的平均响应时间是28.8932 msecs,最大的响应时间44.243 msecs,最小的响应时间24.488 msecs

  5. msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min

  6. HTTP response codes: code 200 – 49 说明打开响应页面的类型,如果403的类型过多,那可能

要注意是否系统遇到了瓶颈。
特殊说明:
测试结果中主要的指标是 fetches/sec、msecs/connect 这个选项,即服务器每秒能够响应的查询次数,

用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。
Qpt-每秒响应用户数和response time,每连接响应用户时间。
测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的

cpu、men进行分析,才能得出结论

Siege

一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
官方:http://www.joedog.org/
Siege下载:

1
wget http://download.joedog.org/siege/siege-4.0.2.tar.gz

解压:

1
tar zxf siege-4.0.2.tar.gz

进入解压目录:

1
cd siege-4.0.2

安装:

1
2
./configure
make && make install

使用

1
siege -c 200 -r 10 -f example.txt

-c是并发量,-r是重复次数。 url文件就是一个文本,每行都是一个url,它会从里面随机访问的。

example.txt内容:

1
2
http://www.google.com
http://www.baidu.com

结果说明

Lifting the server siege… done.
Transactions: 3419263 hits //完成419263次处理
Availability: 100.00 % //100.00 % 成功率
Elapsed time: 5999.69 secs //总共用时
Data transferred: 84273.91 MB //共数据传输84273.91 MB
Response time: 0.37 secs //相应用时1.65秒:显示网络连接的速度
Transaction rate: 569.91 trans/sec //均每秒完成 569.91 次处理:表示服务器后
Throughput: 14.05 MB/sec //平均每秒传送数据
Concurrency: 213.42 //实际最高并发数
Successful transactions: 2564081 //成功处理次数
Failed transactions: 11 //失败处理次数
Longest transaction: 29.04 //每次传输所花最长时间
Shortest transaction: 0.00 //每次传输所花最短时间

Apache JMeter

Apache JMeter - Download Apache JMeter

goreplay

goreplay

下载地址:Releases · buger/goreplay