# 性能压力测试小工具 wrk

### 性能测试相关名词 <a href="#e6-80-a7-e8-83-bd-e6-b5-8b-e8-af-95-e7-9b-b8-e5-85-b3-e5-90-8d-e8-af-8d" id="e6-80-a7-e8-83-bd-e6-b5-8b-e8-af-95-e7-9b-b8-e5-85-b3-e5-90-8d-e8-af-8d"></a>

* QPS每秒查询率 (Query Per Second)

每秒查询率 QPS 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准

* 并发用户数

指系统可以同时承载的正常使用系统功能的用户的数量

* 吞吐量 (Throughput)

吞吐量是指系统在单位时间内处理请求的数量

* 响应时间 (RT)

指系统对请求作出响应的时间\


### wrk 是什么 <a href="#wrk-e6-98-af-e4-bb-80-e4-b9-88" id="wrk-e6-98-af-e4-bb-80-e4-b9-88"></a>

wrk 是 github 的一个项目

[github.com/wg/wrk](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fwg%2Fwrk)

根据官方的说明，**wrk 是一个HTTP基准测试工具**

当运行在单个多核CPU上时，它能够产生巨大的负载。它结合了多线程设计和可伸缩的事件通知系统，如 epoll 和 kqueue 等等

wrk 中的一个可选的 LuaJIT 脚本可以执行 HTTP 请求生成、响应处理和自定义报告

### wrk 如何使用 <a href="#wrk-e5-a6-82-e4-bd-95-e4-bd-bf-e7-94-a8" id="wrk-e5-a6-82-e4-bd-95-e4-bd-bf-e7-94-a8"></a>

那么 wrk 如何使用呢，我们就来实操一下看看效果 ， 既然是 开源工具，下载安装编译的方式都很类似

1、**下载编译**

```bash
git clone https://github.com/wg/wrk.git
cd wrk 
make
cp wrk /usr/local/sbin/
```

2、这个时候，我们就可以**开始使用 wrk 工具**了

```bash
# wrk
Usage: wrk <options> <url>
  Options:
    -c, --connections <N>  Connections to keep open // 和服务器建立连接并保持的 TCP 连接数量  
    -d, --duration    <T>  Duration of test  // 具体的压测时间
    -t, --threads     <N>  Number of threads to use // 使用的线程数量

    -s, --script      <S>  Load Lua script file	// 加载 lua 文件
    -H, --header      <H>  Add header to request // 添加请求头
        --latency          Print latency statistics // 打印延迟统计数据
        --timeout     <T>  Socket/request timeout // 超时时间
    -v, --version          Print version details // 版本信息

  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)
```

上面的 N 表示数字参数，可以是 1k, 1M, 1G

T 表示时间参数，可以是 2s, 2m, 2h

#### **尝试使用 wrk 工具** <a href="#e5-b0-9d-e8-af-95-e4-bd-bf-e7-94-a8-wrk-e5-b7-a5-e5-85-b7" id="e5-b0-9d-e8-af-95-e4-bd-bf-e7-94-a8-wrk-e5-b7-a5-e5-85-b7"></a>

我们使用 wrk 同样的参数来性能**测试一下 掘金 和 百度的地址**

* 200个链接
* 8个线程
* 测试 40 s

```bash
# wrk -c200 -t8 -d40 --latency https://juejin.cn/
Running 40s test @ https://juejin.cn/
  8 threads and 200 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.53s   481.41ms   2.00s    87.68%
    Req/Sec    10.27      7.50    70.00     73.61%
  Latency Distribution
     50%    1.67s
     75%    1.85s
     90%    1.95s
     99%    2.00s
  2406 requests in 40.05s, 476.65MB read
  Socket errors: connect 0, read 0, write 0, timeout 1797
Requests/sec:     60.08
Transfer/sec:     11.90MB
```

解释上面测试报告相关字段的含义：

* Latency 延迟
* Avg 平均值
* Stdev 标准差
* +/- Stdev 标准差占比
* Requests/sec 平均每秒处理的请求数，通常说的 qps 这里可以看出 掘金是 60.08

**实践完毕之后，我们来捋一捋 wrk 的优势和劣势**

优势：

* wrk 是轻量级性能测试工具，用起来非常方便，且安装也很简单，学习成本低
*   根据官方介绍，我们知道 wrk 基于系统自带的高性能 I/O 机制，如 epoll, kqueue

    这些机制是利用异步的事件驱动框架 多路 IO 复用来提高并发性能的

劣势：

* 仅支持单机压测，如果需要测试多台机器，wrk 就不合适了\
  \
