常见压力测试工具有: ab, wrk,locust等。此外,还有 GoReplay 和 TcpCopy 等,可以拷贝线上服务器的真实流量并转发到测试服务器上去,用真实流量来测试,如此得到的数据更可信。不过它们的用法更复杂。
ab
ab(ApacheBench),是目前最常见的压力测试工具。需要单独安装.
安装
yum -y install httpd-tools
命令选项
- -n 请求数
- -c 并发数
- -s 等待响应的时间默认 30 秒
- -H 自定义请求头参数,可多次使用该选项
- -T 设置 Content-Type 请求头信息
- -k 启用 HTTP KeepAlive 功能,即在一个 HTTP 会话中执行多个请求。默认时,不启用 KeepAlive 功能。
典型应用
shell>
ab -k -n 1000 -c 10
-t 100 http://www.isTester.com/zhichang/177.html
其中,参数「c」表示的是并发,
参数「t」表示的是整个测试持续的时间。
一个很容易被忽视的参数是「k」,它会增加请求头Connection: Keep-Alive,相当于开启了HTTP长连接,这样做一方面可以降低测试服务器动态端口被耗尽的风险,另一方面也有助于给目标服务器更大的压力,测试出更接近极限的结果。
wrk
wrk 是一种高效的 HTTP 基准测试工具,能够在单个多核 CPU 上运行时产生大 量负载。它将多线程设计与 epoll 和 kqueue 等可伸缩事件通知系统相结合。 因此,使用 wrk 使用较少的线程即可以压测出非常可观的请求数据。wrk 所有请求都是异步非阻塞模式的,因此对系统资源能够应用到极致,可以压满 cpu。
相对于ab来说最大的优点是支持多线程,这样更容易发挥多核CPU的能力,从而更容易测试出系统的极限能力。
参数说明
-c, --connections: 总的连接数(每个线程处理的连接数=总连接数/线程数)
-d, --duration: 测试的持续时间,如2s(2second),2m(2minute),2h(hour)
-t, --threads: 需要执行的线程总数
-s, --script: 执行Lua脚本,这里写lua脚本的路径和名称,后面会给出案例
-H, --header: 需要添加的头信息,注意header的语法,举例,-H “token: abcdef”,说明一下,token,冒号,空格,abcdefg(不要忘记空格,否则会报错的)。
--latency: 显示延迟统计信息
--timeout: 超时的时间
返回结果说明
- Latency:响应时间Req/Sec:每个线程每秒钟的执行的连接数
- Avg:平均
- Max:最大
- Stdev:标准差+/- Stdev: 正负一个标准差占比
- Requests/sec:每秒请求数(也就是QPS),这是一项压力测试的性能指标,通过这个参数可以看出吞吐量
- Latency Distribution,如果命名中添加了
- latency就会出现相关信息
其典型用法如下:
wrk -t2 -c30 -d30s --latency http://192.168.31.92/
Running 30s test @ http://192.168.31.92/
2 threads and 30 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.59ms 1.16ms 47.58ms 91.91% // 线程延迟状态
Req/Sec 9.23k 846.07 12.38k 68.83% // 单个线程每秒请求数平均9.23k, 最大12.38k
Latency Distribution // 所有请求的延迟分布, 75%的请求延迟小于1.77毫秒
50% 1.38ms
75% 1.77ms
90% 2.39ms
99% 5.95ms
551551 requests in 30.05s, 2.02GB read // 2个线程, 30s内55万次请求
Requests/sec: 18355.61 // 2个线程每次请求1.8万次
Transfer/sec: 68.95MB
# 2. POST|GET 传参请求测试
wrk -t2 -c10 --latency --script=params.data http://192.168.31.91/api/test/
请求参数 params.data
cat > post.data <<EOF
wrk.method = "POST"
wrk.body = "username=chris&password=123456"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
EOF
# 3. 修改请求头信息 User-Agent 测试
wrk -t2 -c10 -d10s --latency \
-H "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" \
http://192.168.31.92/
# 4. 基于 lua 脚本定制测试报告
wrk -t2 -c10 -d10s -s setup.lua --latency http://192.168.31.92/
有些介绍参考
locust
相对于ab、wrk来说最大的优点是它不再只是测试一个url,而是可以测试一个「自定义的场景」,其中可以包含多个有相互关联的url
此外,它还是分布式可扩展的,可以模拟大量用户的访问,由此可以得到更贴近真实环境的测试数据。
关于locust的具体用法有点复杂,可以自行查阅官方文档。