简单的 http 性能测试工具

wrk.git

一个简单的 http benchmark 工具, 能做很多基本的 http 性能测试.
wrk 的一个很好的特性就是能用很少的线程压出很大的并发量.
原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等.

其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知。

要用 wrk, 首先要编译 wrk

你的机器上需要已经安装了 git 和基本的c编译环境。wrk 本身是用 c 写的并且没有使用很多第三方库. 所以编译基本不会遇到什么问题(运行不会存在太大难度)。

安装

Mac 安装

brew install wrk

注意: mac 本身连接数有限制,不要做太大的测试

Linux 安装

git clone https://github.com/wg/wrk.git
cd wrk
make

成功以后在目录下有一个 wrk 文件,将这个文件复制到你的软件目录,配置好环境变量即可,这里就不细说了

编译错误

fatalerror: openssl/ssl.h: Nosuchfileor directory

是因为系统中没有安装openssl的库

sudo apt-get install libssl-dev
# or run
sudo yum install openssl-devel

使用

简单的性能测试

wrk -t12 -c100 -d30s http://192.168.31.107

# 输出为
12 threadsand 100 connections
ThreadStats Avg Stdev Max +/- Stde
Latency 538.64ms 368.66ms 1.99s 77.33
Req/Sec 15.62 10.28 80.00 75.35
5073 requestsin 30.09s, 75.28MB rea
Socketerrors: connect 0, read 5, write 0, timeout 6
Requests/sec: 168.5
Transfer/sec: 2.50M
  • -t12 为模拟12个用户线程 -c100模拟100个连接

一般线程数不宜过多. 核数的2到4倍足够,wrk 不是使用每个连接一个线程的模型, 而是通过异步网络 io 提升并发量. 所以网络通信不会阻塞线程执行

结果统计分析

线程统计分析

项目 名称 说明
Avg 平均值 每次测试的平均值
Stdev 标准偏差 结果的离散程度,越高说明越不稳定
Max 最大值 最大的一次结果
+/- Stdev 正负一个标准差占比 结果的离散程度,越大越不稳定

Latency: 可以理解为响应时间
Req/Sec: 每个线程每秒钟的完成的请求数

一般我们来说我们主要关注平均值和最大值.
标准差如果太大说明样本本身离散程度比较高. 有可能系统性能波动很大

读写分析

  • 总共完成请求数
  • 读取数据量
  • 错误统计
5073 requestsin 30.09s, 75.28MB rea
Socketerrors: connect 0, read 5, write 0, timeout 6
Requests/sec: 168.5
Transfer/sec: 2.50M

wrk Post 接口测试

首先需要准备一个lua文件

wrk.method = "POST"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
wrk.body = "youbody&youset"

这个文件内容建议自己填写,保存为 post.lua 文件

当然这个脚本内容可以再次定义,具体查看wrk的git文档

执行脚本

wrk -t4 -c2000 -d60s -T5s --script=post.lua --latency http://192.168.31.107/user/login

这样就是模拟4个线程,2000个连接,在60s内,间隔5s 执行 post.lua 的请求

  • 你可以扩展一下,制作 shell 脚本来批量测试各种接口
如测试post json:
post.lua
-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header
wrk.method = "POST"
wrk.body   = "{\"q\":1}"
wrk.headers["Content-Type"] = "application/json"

wrk 压力测试 http benchmark POST接口的更多相关文章

  1. 使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

    0. 简要介绍 WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果. PS:Wrk 并不能针对测试的 ...

  2. Redis(十九):Redis压力测试工具benchmark

    redis-benchmark使用参数介绍 Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求. (类似于 Apache ab 程序).你可以使用 ...

  3. apacheBench对网站进行压力测试

    apacheBench对网站进行压力测试 分类: 学习 2014-02-19 10:35 4154人阅读 评论(1) 收藏 举报 apacheBench压力测试 Apache Benchmark下载 ...

  4. jmeter进行的接口测试和压力测试

    1.接口测试 接口测试的内容我们之前已经讲过,values-key形式和json串传参形式: 包括的协议有http,webservice(soap),jdbc数据库,java请求 2.参数化 定义:把 ...

  5. 使用siege对web接口进行post方式的压力测试

    为了达到压力测试的效果,需要申请一台线上机器,并且安装压力测试的工具siege. 安装新版siege.资料说yum安装的版本2.70对于post方式支持的不好,验证后发现请求可以正常发过去,但是打开d ...

  6. 使用wrk进行压力测试

    最近需要对新的服务进行压力测试.比较了ab和jemeter以及wrk.最终选择wrk来作为压力测试工具,可以把cpu压到100%. 官方源码: https://github.com/wg/wrk 安装 ...

  7. 使用COSBench工具对ceph s3接口进行压力测试--续

    之前写的使用COSBench工具对ceph s3接口进行压力测试是入门,在实际使用是,配置内容各不一样,下面列出 压力脚本是xml格式的,套用UserGuide文档说明,如下 有很多模板的例子,在co ...

  8. [转] CentOS单独安装Apache Benchmark压力测试工具的办法

    Apache安装包中自带的压力测试工具 Apache Benchmark(简称ab) 简单易用,这里就采用 ab作为压力测试工具了. 1.独立安装 ab运行需要依赖apr-util包,安装命令为: 1 ...

  9. 使用Loadrunner进行http接口压力测试

    业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: ...

随机推荐

  1. vue-element-admin项目install出现的问题

    1.需要安装nodejs和git 2. 配置淘宝镜像源(经常是因为墙的原因下载缓慢或者出错) npm config set registry https://registry.npm.taobao.o ...

  2. IdnentiyServer-使用客户端凭据访问API

    情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限. 客户端通过clientid和secrect访问iden ...

  3. collect_list/collect_set(列转行)

    Hive中collect相关的函数有collect_list和collect_set. 它们都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重. 做 ...

  4. 提取Chrome插件为crx文件

    在Chrome浏览器输入 chrome://extensions/,点开右上角开发者模式 记录上图中的ID:gidgenkbbabolejbgbpnhbimgjbffefm 在资源管理器中找到Chro ...

  5. RNP项目遇到的坑

    1.nginx问题 和前端约定了在header中存放登录态k-v,选择的key是带下划线的. nginx 默认会丢弃带下划线的 header. 设置 underscores_in_headers on ...

  6. String的坑

       想必大家在熟悉不过了,不错今天就遇到了这个万年坑,哪怕喜欢翻源码的人,也不屑一顾翻它的源码,良言相劝最好翻下源码. 1. String为啥被定义为final ? 2. String是线程安全的么 ...

  7. WORLD 合并多个WORLD中的文本

    1,把多个文档放入一个文件夹中. 2,新建一个WORLD文档. 3,点击插入----对象----文件中的文字----选中文件中的多个WORLD文档----打开.

  8. CSS border-collapse 属性

    表格边框合并: table {  border-collapse:collapse; 边框会合并为一个单一的边框 } ----------------------------------------- ...

  9. JavaScript 基础(一) - JavaScript的引入方式,JavaScript 变量命名规则,JS 的五种基本数据类型,ECMAScript 算数运算符,逻辑运算符

    JavaScript的引入方式 直接编写 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  10. js 时间戳转换为‘yyyy-MM-dd hh:mm’格式(es6语法)

    function formatDate(date,fmt) { if(/(y+)/.test(fmt)){ fmt = fmt.replace(RegExp.$1,(date.getFullYear( ...