个人技术分享

前言

wrk是一个用c语言写的压力测试工具,非常有用,但是ubuntu的软件仓库没有收录wrk,需要我们自己进行编译和安装,最近在学习一些性能测试、性能优化方面的知识,需要使用到这个强有力的工具,故此记录安装和使用的过程。

安装

首先若是没有安装编译工具那么就得先安装一下:

# 安装 make 工具
sudo apt-get install make
 
# 安装 gcc编译环境
sudo apt-get install build-essential

之后安装git

sudo apt-get install git

从git上拉源码

git clone git@github.com:wg/wrk.git

要是没有梯子等加速工具可以使用gitee

git clone git@gitee.com:ponponon/wrk.git

安装openssl库

sudo apt-get install libssl-dev

使用make编译源码

cd wrk
make

make之后在wrk目录下就可以使用./wrk指令了,不过为了全局能使用,可以将其添加到path

# 把生成的wrk移到一个PATH目录下面, 比如
sudo cp wrk /usr/local/bin

wrk一个特性就是用很少的线程可以压出很大的并发量,原因是啥它使用了一些操作系统特定的高性能io机制,例如select,epoll等。

使用一个简单的性能测试:

wrk -t12 -c100 -d30s http://www.baidu.com  

可以看到如下输出:

Running 30s test @ http://www.baidu.com
  12 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    41.00ms   12.53ms 421.23ms   92.02%
    Req/Sec   173.37     51.53   260.00     75.17%
  23100 requests in 30.10s, 231.29MB read
  Socket errors: connect 0, read 1888, write 0, timeout 0
Requests/sec:    767.48
Transfer/sec:      7.68MB

12 threads and 100 connections

用12个线程模拟100个连接.

对应的参数 -t 和 -c 可以控制这两个参数.

wrk中各个参数:

  • -t 需要模拟的线程数

  • -c 需要模拟的连接数

  • --timeout 超时的时间

  • -d 测试的持续时间

结果中:

  • Latency:响应时间

  • Req/Sec:每个线程每秒钟的完成的请求数

  • Avg:平均

  • Stdev:标准差

  • Max:最大

  • +/- Stdev: 正负一个标准差占比

  • Requests/sec:QPS(每秒请求数),这是一项压力测试的性能指标,通过这个参数我们可以看出应用程序的吞吐量。

  • Transfer/sec:每秒传输的数据量

如果想看响应时间的分布情况可以加上--latency参数

wrk -t12 -c100 -d30s -T30s --latency http://www.baidu.com  
Running 30s test @ http://www.baidu.com
  12 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    41.46ms   20.81ms 453.31ms   97.90%
    Req/Sec   169.27     57.92   250.00     75.02%
  Latency Distribution
     50%   38.59ms
     75%   42.03ms
     90%   46.62ms
     99%   96.43ms
  23100 requests in 30.03s, 231.29MB read
  Socket errors: connect 0, read 1277, write 0, timeout 0
Requests/sec:    769.24
Transfer/sec:      7.70MB

可以看到50%在38ms的量级,很可以

使用 wrk 测试 nginx

wrk http://192.168.31.203                             
Running 10s test @ http://192.168.31.203
  2 threads and 10 connections
​
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   657.87us  761.70us  19.66ms   97.90%
    Req/Sec     8.48k   743.41     9.74k    83.00%
  168665 requests in 10.00s, 138.16MB read
Requests/sec:  16865.61
Transfer/sec:     13.82MB

使用 wrk 测试 gunicorn

wrk http://192.168.31.203:63000/upload/                     
Running 10s test @ http://192.168.31.203:63000/upload/
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    10.91ms    7.41ms  93.90ms   79.23%
    Req/Sec   486.49     92.10   797.00     64.50%
  9692 requests in 10.01s, 3.47MB read
  Non-2xx or 3xx responses: 9692
Requests/sec:    968.38
Transfer/sec:    354.63KB