常见压力测试工具有: 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的具体用法有点复杂,可以自行查阅官方文档。