+
95
-

回答

一、wrk 

wrk 是一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。

wrk 的优势:

轻量级性能测试工具;

安装简单(相对 Apache ab 来说);

学习曲线基本为零,几分钟就能学会咋用了;

基于系统自带的高性能 I/O 机制,如 epoll, kqueue, 利用异步的事件驱动框架,通过很少的线程就可以压出很大的并发量;

支持lua脚本

wrk 的劣势

wrk 目前仅支持单机压测,后续也不太可能支持多机器对目标机压测,因为它本身的定位,并不是用来取代 JMeter, LoadRunner 等专业的测试工具,wrk 提供的功能,对我们后端开发人员来说,应付日常接口性能验证还是比较友好的。

centos安装

依次执行如下命令:

yum install git -y

git clone https://github.com/wg/wrk.git wrk
yum install unzip -y
yum install gcc -y
make
cp wrk /usr/local/bin/

使用方式:

$./wrk -c 100 -d 10 http://domain/path

其中,参数「c」表示的是并发,参数「d」表示的是整个测试持续的时间。此外,可以通过参数「t」来控制线程数(缺省值为 2),实际使用中可以视情况酌情增大。

示例,开2个线程,建立6个连接,持续请求百度5s

wrk -t 2 -c 6 -d 5s https://www.baidu.com
Running 5s test @ https://www.baidu.com
2 threads and 6 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 15.97ms 3.58ms 36.06ms 86.53%
Req/Sec 185.96 21.39 220.00 82.00%
1862 requests in 5.03s, 27.90MB read
Socket errors: connect 0, read 3, write 0, timeout 0
Requests/sec: 369.85
Transfer/sec: 5.54MB

使用脚本发送表单请求

# post.lua
wrk.method = "POST"
wrk.body = "login=sammy&password=test"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"

wrk -t 2 -c 6 -d 5s -s post.lua https://www.baidu.com

二、ab

ab,全称是apache benchmark,是apache官方推出的工具。

该工具是用来测试Apache服务器的性能的。查看安装的apache的服务器能提供的服务能力,每秒可以处理多少次请求。

安装方式,只要安装了apache,就默认编译了ab工具,

在centos下还可以单独安装

yum install -y httpd-tools

Ubuntu

apt install -y apache2-utils

使用方式

$./ab -c 并发数 -t 最大时间 -n 请求数-k url地址

假如模拟的是10个并发,请求100KB的文件

ab 执行时常用的配置项
-c 并发数
一次发送的总请求数,默认是一次发一个请求。

-k 保持keep-alive
打开keep-alive,在一个HTTP Session中请求多次。默认是关闭的。

-n 请求数
整个benchmark测试过程中需要发送的请求次数。
默认是一次,默认情况下得到的性能参数没有代表性。

-t 最大时间
benchmark测试最长时间. 默认没有限制。

-u 上传文件
File containing data to PUT. Remember to also set -T.-T content-type

-T 设置上传文件的Content-Type
例如:application/x-www-form-urlencoded. Default is text/plain.

示例,对百度进行并发10,总请求数为100的压测

ab -c 10 -n 100 https://www.baidu.com/

Server Software: BWS/1.1
Server Hostname: www.baidu.com
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128

Document Path: /
Document Length: 227 bytes

Concurrency Level: 10
Time taken for tests: 0.711 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 111095 bytes
HTML transferred: 22700 bytes
Requests per second: 140.56 [#/sec] (mean)
Time per request: 71.144 [ms] (mean)
Time per request: 7.114 [ms] (mean, across all concurrent requests)
Transfer rate: 152.49 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 34 46 6.6 45 62
Processing: 12 16 3.5 16 41
Waiting: 12 16 3.4 15 41
Total: 48 62 8.4 62 86

Percentage of the requests served within a certain time (ms)
50% 62
66% 66
75% 68
80% 70
90% 73
95% 75
98% 83
99% 86
100% 86 (longest request)

Post请求

data.txt
a=1&b=2
ab -c 10 -n 100 -p data.txt -T 'application/x-www-form-urlencoded' https://www.baidu.com/

data.json
{"a":1}
ab -c 10 -n 100 -p data.json -T 'application/json' https://www.baidu.com/

注: 线程数跟 ulimit 有关,centos 默认 ulimit=1024 最大不超过1024个线程,如需更多线程,可以调整 ulimit 值。

三、对比

wrk 与 ab 都是单机性能并发测试工具。

wrk 与 ab 的区别是 wrk 可以指定持续压测的时间(例如:持续打压30分钟)并且支持 lua 脚本的执行,支持多个URL的压测,更加具备扩展性和灵活性。

四、总结

 ab、wrk都是属于单机性能测试工具,如果要支持分布式压测或场景测试,可以选择jmeter或locust,如果想要模拟服务器上真实的数据流量,可以选择GoReplay 和 TcpCopy。


网友回复

我知道答案,我要回答