压测工具—ab、webbench、siege

相关概念

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

Apache Bench

ab是Apache的超文本传输协议(HTTP)的性能测试工具,可以测试apache、IIs、tomcat、nginx 等服务器。但是 ab 没有 Jmeter、Loadrunner 那样有各种场景设计、各种图形报告和监控,只需一个命令即可,有输出描述,可以简单的进行一些压力测试。

查看Apache版本

Mac系统下自带 Apache,可以使用apachectl -v命令查看 Apache 版本:

1
2
3
$ apachectl -v
Server version: Apache/2.4.41 (Unix)
Server built: Dec 13 2019 19:06:00
查看ab版本
1
2
3
4
$ ab -V
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
查看当前系统的默认文件打开数

在压测开始前,你需要确保你的open files足够大,否则会报TOO MANY FILES OPEN错误,可以通过ulimit -a查看

1
2
3
4
5
6
7
8
9
10
11
12
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1392
virtual memory (kbytes, -v) unlimited

设置打开文件数限制为 2560:

1
ulimit -n 2560

这只是临时修改,关闭终端会话后会复原。

命令
命令参数 说明
-n 请求次数
-c 并发数
-r 当接收到错误时,不要退出套接字(socket)
关于登陆的问题

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

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

  2. 如果只用到一个 Cookie,那么只需键入命令:
    ab -n 100 -C key=value http://test.com/

  3. 如果需要多个 Cookie,就直接设 Header:
    ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://test.com/

webbench

webbench是一枚强大得可以的压力测试工具,它最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便。

安装
1
2
3
4
5
6
7
8
9
brew install ctags # 依赖安装

wget http://blog.zyan.cc/soft/linux/webbench/webbench-1.5.tar.gz
tar -zxvf webbench-1.5.tar.gz
cd webbench-1.5

mkdir -pv /usr/local/man/man1 # 必须

sudo make && sudo make install
命令
1
2
# 10 秒内向 http://127.0.0.1:3001/admin 发送 500 次请求
webbench -c 500 -t 10 http://127.0.0.1:3001/admin

siege

siege是我解决ab该死的apr_socket_recv: Connection reset by peer (54)错误时发现的一个好工具,不得不说这工具真心好,用法和webbench一样,但是信息全面很多。

安装
1
brew install siege
命令
压测参数 说明
-C 在屏幕上打印显示出当前的配置,配置是包括在他的配置文件$HOME/.siegerc中,可以编辑里面的参数,这样每次siege 都会按照它运行
-v 运行时能看到详细的运行信息
-c 模拟有n个用户在同时访问,n不要设得太大,因为越大,siege消耗本地机器的资源越多
-r 重复运行测试n次,不能与-t同时存在
-t 持续运行siege ‘n’秒(如10S),分钟(10M),小时(10H)
-d 每个url之间的延迟,在0-n之间
-b 请求无需等待 delay=0
-i 随机访问urls.txt中的url列表项
-f 指定用特定的urls文件运行 ,默认为urls.txt,位于siege安装目录下的etc/urls.txt
-R 指定用特定的siege 配置文件来运行,默认的为$HOME/.siegerc
-l 运行结束,将统计数据保存到日志文件中siege.log,一般位于/usr/local/var/siege.log中,也可在.siegerc中自定义
压测结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//并发10个,发生5次,共50个请求
siege -c 10 -r 5 http://www.jd.com

Transactions: 350 hits //总共测试次数
Availability: 100.00 % //成功次数百分比
Elapsed time: 4.27 secs //总共耗时多少秒
Data transferred: 7.08 MB //总共数据传输
Response time: 0.07 secs //等到响应耗时
Transaction rate: 81.97 trans/sec //平均每秒处理请求数
Throughput: 1.66 MB/sec //吞吐率
Concurrency: 6.06 //最高并发
Successful transactions: 350 //成功的请求数
Failed transactions: 0 //失败的请求数
Longest transaction: 0.24 //每次传输所花最长时间
Shortest transaction: 0.01 //每次传输所花最短时间
常用命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 200个并发对http://www.google.com发送请求100次
siege -c 200 -r 100 http://www.google.com

# 在urls.txt中列出所有的网址
siege -c 200 -r 100 -f urls.txt

# 随机选取urls.txt中列出所有的网址
siege -c 200 -r 100 -f urls.txt -i

# delay=0,更准确的压力测试,而不是功能测试
siege -c 200 -r 100 -f urls.txt -i -b

# 指定http请求头 文档类型
siege -H "Content-Type:application/json" -c 200 -r 100 -f urls.txt -i -b
注意事项
  1. 发送post请求时,url格式为http://www.xxxx.com/ POST p1=v1&p2=v2
  2. 如果url中含有空格和中文,要先进行url编码,否则siege发送的请求url不准确。