3、wrk工具入门:wrk安装、基本参数讲解、第一个压测脚本、结果解读

3.1 为什么选wrk?

做压测这么多年,我试过不少工具。ab太老,jmeter太重,locust要写Python。wrk呢?轻量、高效、单机就能压出很高的并发。

说白了,wrk就是一个基于C语言的高性能HTTP压测工具。它利用操作系统的事件模型(epoll、kqueue),用很少的线程就能模拟大量并发连接。我刚开始用它的时候,第一反应是——这玩意儿怎么这么快?

嗯,这里要注意:wrk只支持HTTP协议,不支持HTTPS。如果你要压HTTPS接口,得用它的增强版wrk2,或者用其他工具。这个坑我踩过,后面会讲。

3.2 wrk安装

安装wrk其实很简单。我习惯在Linux上跑压测,因为性能损耗最小。Mac也行,但Windows就别想了——wrk原生不支持Windows。

Linux(CentOS/Ubuntu)安装:

# Ubuntu/Debian
sudo apt-get install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin/

# CentOS/RHEL
sudo yum install gcc openssl-devel git -y
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin/

# MacOS
brew install wrk

安装完验证一下:

wrk --version

看到版本号就说明装好了。我记得第一次装的时候,卡在make那一步,后来发现是没装libssl-dev。所以如果你make报错,先检查依赖。

3.3 基本参数讲解

wrk的参数不多,但每个都很关键。我列个表,方便你对照着看。

参数 全称 说明 示例
-t threads 线程数。一般设为CPU核心数的2倍左右 -t4
-c connections 并发连接数。模拟多少个客户端同时请求 -c100
-d duration 压测持续时间。支持s、m、h -d30s
--latency 延迟统计 输出详细的延迟分布数据 --latency
-s script 加载Lua脚本,用于自定义请求 -s script.lua
-H header 添加自定义请求头 -H "User-Agent: wrk"
--timeout 超时时间 每个请求的超时时间,默认2s --timeout 5s

你想想看,这些参数怎么搭配?我个人习惯是:先确定并发数,再根据CPU核数定线程数。比如4核机器压100并发,我会用-t4 -c100。

小技巧:线程数不是越多越好。线程太多反而会因为上下文切换降低性能。我一般用CPU核数或2倍核数。

3.4 第一个压测脚本

来,我们写第一个压测命令。假设你要压一个本地服务:

wrk -t4 -c100 -d30s --latency http://localhost:8080/api/test

这条命令的意思是:用4个线程,模拟100个并发连接,持续压30秒,同时输出延迟分布数据。

如果你想压POST接口,或者需要带请求体,那就得用Lua脚本了。我写个最简单的例子:

-- post.lua
wrk.method = "POST"
wrk.body = '{"username":"test","password":"123456"}'
wrk.headers["Content-Type"] = "application/json"

然后这样调用:

wrk -t4 -c100 -d30s -s post.lua http://localhost:8080/api/login

嗯,这里要注意:Lua脚本里的body和headers,每次请求都会带上。如果你需要动态生成数据,那就得在脚本里写循环逻辑。这个后面章节会细讲。

3.5 结果解读

跑完压测,你会看到类似这样的输出:

Running 30s test @ http://localhost:8080/api/test
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    45.23ms   12.34ms 234.56ms   78.90%
    Req/Sec   556.78    89.12     789.00    75.00%
  Latency Distribution
     50%   42.10ms
     75%   51.20ms
     90%   62.30ms
     99%   98.70ms
  66789 requests in 30.00s, 89.45MB read
  Requests/sec:   2226.30
  Transfer/sec:     2.98MB

我来一行行拆解给你看:

  • Thread Stats:每个线程的统计。Latency是延迟,Req/Sec是每秒请求数。Avg是平均值,Stdev是标准差,Max是最大值。
  • Latency Distribution:延迟分布。50%的请求在42.1ms内完成,99%在98.7ms内。这个数据很关键,能看出你的服务是不是有长尾延迟。
  • 66789 requests in 30.00s:总请求数和总耗时。
  • Requests/sec:吞吐量,也就是QPS。这里是2226.3。
  • Transfer/sec:网络吞吐量,每秒传输的数据量。

我曾经遇到过一个问题:压测结果里Latency的Max值特别大,比如几秒钟。后来发现是服务端有GC停顿。所以你看结果的时候,别只看平均值,一定要看99%甚至99.9%的延迟。

避坑指南:如果你发现Requests/sec比预期低很多,先检查是不是wrk所在机器的资源瓶颈。我曾经在虚拟机里压测,结果CPU被打满了,QPS上不去。后来换到物理机,数据直接翻倍。

3.6 核心知识体系

我把这一章的核心逻辑画了张图,方便你理解wrk的工作流程:

wrk压测核心流程 用户输入参数 参数解析 线程池(-t参数) 连接池(-c参数) 发送HTTP请求 接收HTTP响应 图:wrk压测核心流程

这张图展示了wrk的工作逻辑:用户输入参数后,wrk解析参数,然后创建线程池和连接池。每个线程负责维护一组连接,并发发送请求并接收响应。整个过程是异步非阻塞的,所以效率很高。

核心要点:wrk的威力在于它用很少的线程就能管理大量连接。你想想看,传统方式一个线程一个连接,100并发就要100个线程。wrk用4个线程就能搞定,这就是epoll/kqueue的功劳。

好了,这一章的内容就这些。安装、参数、脚本、结果解读,四个步骤走下来,你已经能用wrk做基本的压测了。下一章我们会深入Lua脚本,让wrk能做更复杂的压测场景。

想要更多资料,联系可可