本文作者:Linkflow首席架构师 – 王鼎,11年软件研发经验,6年SaaS(基于公有云或私有云),熟悉ERP, CDP, omin渠道销售解决方案。参与SaaS产品的大型开发,成员400余人。在一家初创公司从零开始开发新产品。从事SaaS架构和技术管理工作。建立新的开发团队,专注于CDP和Martech SaaS解决方案。

这两天抽空使用了一下两款压测工具
wrk
Artillery
并且通过两款工具对产品的两个环境进行了测试

wrk

wrk自身性能就非常惊人,使用epoll这种多路复用技术,所以可以用少量的线程来跟被测服务创建大量连接,进行压测,同时不占用过多的CPU和内存。

命令非常简单
wrk -t8 -c200 -d30s --latency “http://www.baidu.com”
这样就可以进行最简单的压测。但是真实使用起来肯定会有复杂的场景,比如先要登录取到token再进行下一步。好在wrk支持lua脚本,提供了几个阶段的hook来让用户自定义逻辑,具体可以看github上的官方提供的script sample。

我这里举一个获取token的例子

– @Author: wangding
– @Date: 2017-12-06 15:13:19
– @Last Modified by: wangding
– @Last Modified time: 2017-12-06 23:57:49
local cjson = require “cjson”
local cjson2 = cjson.new()
local cjson_safe = require “cjson.safe”

token = nil
path = “/api/auth/login”
method = “POST”

wrk.headers[“Content-Type”] = “application/json”

request = function()
return wrk.format(method, path, nil, ‘{“username”:“demo@demo.com”,“password”:“demo”}’)
end

response = function(status, headers, body)
if not token and status == 200 then
value = cjson.decode(body)
token = value[“token”]
method = “GET”
path = “/api/contact?size=20&page=0”
wrk.headers[“Authorization”] = token
end
end
request 和 response 分别是两个hook,每次请求都会调用,那么这里request的逻辑就是一开始就使用POST请求/api/auth/login并且带有body,请求完成进入response,第一次token肯定是nil,所以把repose的token解析出来付给全局变量token,之后改写全局变量为GET请求地址/api/contact并且设置了header包含Authorization。

这样实际是变通的实现了一个简单scenario的测试,那么问题来了,如果场景更复杂怎么办?写肯定是可以写的,但是并不直观,所以wrk不太适合一个包含有序场景的压力测试。

再来看一下wrk的report,这一点是我最喜欢的

wrk -t8 -c200 -d30s -H “Authorization: token” --latency “http://10.0.20.2:8080/api/contact?size=20&page=0”
Running 30s test @ http://10.0.20.2:8080/api/contact?size=20&page=0
8 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 769.49ms 324.43ms 1.99s 72.08%
Req/Sec 33.37 21.58 131.00 62.31%
Latency Distribution
50% 728.97ms
75% 958.69ms
90% 1.21s
99% 1.74s
7606 requests in 30.03s, 176.69MB read
Socket errors: connect 0, read 0, write 0, timeout 38
Requests/sec: 253.31
Transfer/sec: 5.88MB
开启8线程,每个线程200个连接,持续30s的调用,可以看到报告中直接给出了最关键的指标QPS,这里的值是253.31。平均响应时间是33.37ms。简单直接,非常易懂。

但是这里面有个坑就是cjson这个lua module的使用,不可以使用lua5.2,必须使用lua5.1而且需要特定的wrk和cjson。我直接使用docker来封装这个运行环境,坏处是docker使用host模式本身性能可能就有影响。

Artillery

一开始看到Artillery主要是因为它支持带场景的测试,也就是带有步骤,看一眼获取token再进行下一步的脚本。

config:
target: “http://10.0.20.2:8080”
phases:
- duration: 30
arrivalRate: 100
scenarios:

  • flow:

    • post:
      url: “/api/auth/login”
      json:
      username: “demo@demo.com”
      password: “demo”
      capture:
      json: “$.token”
      as: “token”
    • log: “Login token: {{ token }}”
    • get:
      url: “/api/contact?size=20&page=0”
      headers:
      Authorization: “{{ token }}”
      flow就是表示步骤,duration表示持续30s,跟wrk不同的是没有thread的概念,Artillery是nodejs写的,arrivalRate表示每秒模拟100个请求,所以两个参数乘起来就是3000个请求。看一下报告什么样:

All virtual users finished
Summary report @ 12:45:41(+0800) 2017-12-08
Scenarios launched: 3000
Scenarios completed: 3000
Requests completed: 3000
RPS sent: 98.33
Request latency:
min: 15.7
max: 179.1
median: 19
p95: 25.8
p99: 37.5
Scenario duration:
min: 16.4
max: 191.4
median: 19.8
p95: 27
p99: 44.6
Scenario counts:
0: 3000 (100%)
Codes:
200: 3000
这里的RPS sent是指前10s平均发送请求数,所以这个和我们常说的QPS还是不一样的。如果想提高request的总数就要增加arrivalRate,比如上文wrk一共发了7606请求,那么这里arrivalRate提高到200一共可以在30s发6000次,但是改完就悲剧了,

Warning: High CPU usage warning.
See https://artillery.io/docs/faq/#high-cpu-warnings for details.
Artillery一直在不断的告警,说明这个工具自身的局限性导致想要并发发送大量请求的时候,自己就很占CPU。

小结
wrk小巧而且性能非常好,报告直观。但是对于带多个步骤的压测场景无力。
Artillery太耗资源,而且报告不直观。不建议采用。
除此之外唯一带场景的测试工具就是Jmeter了,但是Jmeter本身使用JVM是否可以短时间模拟大量并发,还是需要测试,建议与wrk做对比实验。

附录:简单的性能调优
在用wrk测试GET请求的时候,发现无论如何提高连接数,QPS都是在250左右,此时CPU和内存都没有占满。怀疑是有其他瓶颈。最后发现Spring Boot内嵌的tomcat线程无法突破200,所以看了一下文档,发现默认最大线程数就是200,对application.yml进行了调整(同时调整了多个服务,包括gateway)

server:
tomcat:
max-threads: 1000
max-connections: 2000
调整之后开启8线程,每个100个连接测试

Running 30s test @ http://10.0.10.4:8769/api/contact?size=20&page=0
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 235.56ms 267.57ms 1.98s 91.07%
Req/Sec 72.12 30.19 190.00 68.17%
Latency Distribution
50% 166.46ms
75% 281.10ms
90% 472.03ms
99% 1.45s
15714 requests in 30.03s, 4.77MB read
Requests/sec: 523.29
Transfer/sec: 162.56KB
可以看到QPS达到了500以上直接翻倍了,再尝试提高连接数发现瓶颈就在内存了。

此外之前用公网做了一次压测,QPS只有10左右,看了一下阿里云的监控原来是出口带宽造成的,只有1MB的出口带宽,连接数调多大也没用。

未来还需要进行场景的细化,再决定是否使用不同的工具进行测试。

技术丨压测工具wrk和Artillery的比较相关推荐

  1. 压测工具wrk和Artillery的比较

    这两天抽空使用了一下两款压测工具 wrk Artillery 并且通过两款工具对产品的两个环境进行了测试 工具比较 wrk wrk自身性能就非常惊人,使用epoll这种多路复用技术,所以可以用少量的线 ...

  2. Http压测工具wrk使用指南【转】

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  3. Http压测工具wrk使用指南

    用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持 ...

  4. HTTP压测工具Wrk 介绍和使用

    介绍 wrk是一款简单的HTTP压测工具,托管在Github上,https://github.com/wg/wrk. wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操 ...

  5. linux系统单机性能压测工具Wrk —— 筑梦之路

    安装 # 安装编译工具和下载源码 sudo yum groupinstall 'Development Tools' sudo yum install -y openssl-devel git git ...

  6. http接口压测工具wrk

    wrk是一款简单的HTTP压测工具,当运行在单个多核CPU上时,它能够产生巨大的负载. github:https://github.com/wg/wrk 国内镜像: https://gitee.com ...

  7. Linux下性能压测工具WRK,性能测试神器 wrk 使用教程

    wrk 是一个类似 ab(apache bench).jmeter 的压力测试工具,底层基于 epoll 和 kqueue 实现,能充分利用 cpu 资源,降低测试工具本身性能开销对测试结果准确性的影 ...

  8. 性能压测工具:wrk

    一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如. 1.系统性能的维度 1.1 延迟 简单易懂.green:一般指响应时间 95线:P95.平均100%的请求中95%已经响应的时间 99线 ...

  9. web版本 开源压测工具_Web服务压测神器wrk

    wrk是一款开源的高性能http压测工具(也支持https),很是小巧,能够执行文件只有3M(其中主要是luajit和openssl占用绝大多数空间),别看核心代码3-5年没更新了,但依旧很是好用.虽 ...

最新文章

  1. 毕业后五年之内将决定你的一生
  2. [2774]小P的故事——神奇的发票报销 (sdut)
  3. android SQLite数据库(转)
  4. maven 公用仓库_Maven系列(二):Maven 核心概念
  5. 电脑显示服务器负载信息失败,线上服务mcelog负载异常分析处理流程
  6. 全球首发!计算机视觉Polygon Mesh Processing总结8——Remeshing Global Structure和Correspondences
  7. idea 查看实现类快捷键及类里面的方法对应的快捷键、跳到下一行
  8. python特点 可移植性_下面的选项中,不属于Python特点的是( )_学小易找答案
  9. Java常量什么时候被回收,JVM GC调优(2)-GC算法判定对象可以被回收(部分摘自深入理解Java虚拟机) - Java 技术驿站-Java 技术驿站...
  10. Ubuntu使用U盘把从互联网上下载的安装包及其依赖更新到内部机
  11. 二维码自动生成器批量将表格整行数据制作二维码
  12. R语言ggplot2可视化为轴标签添加下标实战:符号下标、百分比下标、带括号的下标
  13. 什么是思维导图?有哪些好用的思维导图工具
  14. 西门子PC ADAPTER USB A2无法连接PLC的坑
  15. 地图定位技术揭秘(一)
  16. 附录3:RMA算法原理
  17. HTC A510C金卡制作流程
  18. 如何申请网站的SSL证书
  19. 爱普生630k linux驱动下载,爱普生lq-630k驱动
  20. 单场淘汰制场次计算方法_淘汰赛_羽毛球新闻

热门文章

  1. 年入三百万的他,是怎么自动赚钱的
  2. day14-面向对象作业
  3. 鼠标样式:cursor属性值(含自定义光标图案) - 代码篇
  4. tomcat闪退问题一些解决办法
  5. PrivacyIN Week1课程回顾 | 张宇鹏博导开讲零知识证明密码学基础研究导论
  6. Apache-Trace method服务问题
  7. 机器学习之利用SMO算法求解支持向量机—基于python
  8. DASCTF x SU 春季挑战赛
  9. C语言--NULL和NUL
  10. java url地址加密_Java实现url加密处理的方法示例