web系统优化之压测组件wrk的使用

wrk是一个简单的压测工具,相比于jmeter,loadrunner更轻量级,相比于ab(apache bench)安装更简单

一、wrk的安装

1、下载

在github上搜索wrk即可,或者直接进入wrk的github地址:https://github.com/wg/wrk

  1. git clone https://github.com/wg/wrk.git
2、安装
  1. cd wrk
  2. make
3、将编译好的二进制文件wrk可以放入到PATH目录下,或者通过软链接的形式放于PATH中
  1. cd wrk /usr/bin/
4、编译时的修改

根据春哥在微博上说,他们的客户在使用wrk时,发现其报告的延时结果错的离谱,发现是wrk的作者在代码中加入了一个stats_correct的函数来模拟真实网络环境的延时,如果你在使用时也发现这个问题,可以重新编译wrk.

修改源码src/wrk.c,注释掉stats_correct这一行,重新编译即可

  1. //stats_correct(statistics.latency, interval);

注:在wrk.c中的170行左右

二、wrk的使用

1、用法:wrk
  • options表示使用的参数
  • url表示要压测的URL
2、参数如下:
  • -c或—connections :使用的连接数(即模拟的连接数,为指定的连接数)。如: wrk -c2000
  • -d, —duration :压测的时间(要压测多久,可以使用s(秒)/m(分)/h(小时)等单位)
  • -t, —threads :使用的线程数,表示使用多秒线程来模拟-c提定的连接数(线程数应该为CPU核数的2-4倍)
  • -s, —script :指定使用的lua脚本路径
  • -H, —header :设置请求头
  • —latency :打印所有响应时间消耗分布统计
  • -T, —timeout :指定连接超时时间
  • -v, —version :打印wrk的版本
(1)基本用法:
  1. wrk -5000 -t10 -d30s -T30s --latency http://127.0.0.1/50x.html

以上表示使用10个线程模拟5000的并发连接数,执行时间(压测时间)为30s,超时时间也为30s,并打印请求响应过程时间分布,压测地址为http://127.0.0.1/50x.html

(2)压测post请求(除get之外的请求)

压测除Get之外的请求,则需要使用到lua脚本,如下:

  1. -- post.lua
  2. wrk.method = "POST"
  3. wrk.body = "name=shixinke"
  4. wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
  • wrk对象(在lua中叫表)有以下属性:
  • scheme:表示使用的协议(如http/https等)
  • host表示主机或IP或域名
  • port表示服务器端口号
  • method为请求方式(GET/POST等)
  • path为请求的路径
  • headers为请求头
  • body请求体参数
  • thread线程对象
    3、运行结果分析:

解读上面,其表示:

  • 第一行:表示正在执行一个30秒的压力测试,地址为http://127.0.0.1/50x.html
  • 第二行:使用了10个线程,模拟的连接数为5000
  • 第三行:--
  • 第四行:使用的时间分布
  • 第五行:请求数分布(包括平均、偏差、最大请求数,偏差率)
  • 第六行:--
  • 第七行至十行:表示请求响应时间分布
  • 第十一行:总共的请求数,总花的时间,和数据传输量
  • 第十二行:socket连接错误统计
  • 第十三行:每秒的请求数
  • 第十四行:第秒的数据传输量
    注:
    这里的socket errors主要是受系统配置所限,通过修改net.core.somaxconn的值可以解决这个问题