`
喜欢蓝色的我
  • 浏览: 370854 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

性能测试小工具WRK

 
阅读更多

       wrk 是一个比较先进的 HTTP 压力测试工具。wrk负载测试时可以运行在一个或者多核CPU,wrk结合了可伸缩的事件通知系统epoll和kqueue等多线程设计思想。目前wrk可以安装在Linux系统和Mac系统。 只有一个命令行, 就能做很多基本的 http 性能测试.

       wrk 的开源的, 代码在 github 上. https://github.com/wg/wrk

首先要说的一点是: wrk 只能运行在 Unix 类的系统上. 比如 linux, mac, solaris 等. 也只能在这些系统上编译.

这 里不得不说一下, 为什么很多人说 mac 是最好的开发环境. 不是因为使用 mac 逼格有多高. 而是你可以同时得到 windows 和 linux 的好处. 多数 linux 下的开发工具都可以在 mac 上使用. 很多都是预编译好的, 有些只需要编译一下就能用.

wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知.

要用 wrk, 首先要编译 wrk.
你的机器上需要已经安装了 git 和基本的c编译环境. wrk 本身是用 c 写的. 代码很少. 并且没有使用很多第三方库. 所以编译基本不会遇到什么问题.

1. git clone https://github.com/wg/wrk.git

 

2. cd wrk

 

3. make

 


就 ok了.
make 成功以后在目录下有一个 wrk 文件. 就是它了. 你可以把这个文件复制到其他目录, 比如 bin 目录. 或者就这个目录下执行.

如果编译过程中出现:

 

1. src/wrk.h:11:25: fatal error: openssl/ssl.h: No such file or directory

 

2. #include <openssl/ssl.h>


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

sudo apt-get install libssl-dev

sudo yum install openssl-devel

 

安装完成配置环境变量 /etc/profile

export PATH=$PATH:/letv/wrk

生效profile 文件

source /etc/profile

 

我们先来做一个简单的性能测试:

1.wrk -t2 -c10 -d30s -T30s  --latency http://10.58.100.90/jsondatedemo.txt

等待完成本次测试

Running 30s test @ http://10.58.100.90/jsondatedemo.txt
  2 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   209.38ms  300.23ms   1.99s    90.36%
    Req/Sec    21.81     10.55    60.00     62.24%
  Latency Distribution
     50%  106.14ms
     75%  188.97ms
     90%  491.26ms
     99%    1.56s
  1218 requests in 30.04s, 1.76MB read
  Socket errors: connect 0, read 540, write 0, timeout 30
  Non-2xx or 3xx responses: 540
Requests/sec:     40.55
Transfer/sec:     60.02KB

------------------------------------------------------------------------------------------------

参数含义:

-t 线程模式 -c模拟并发数 -d 持续时间 m 分钟 s秒 -T 设置延时时间,默认1秒   --latency 显示百分之多少用户的响应时间

 

 

 

-------------------------------------------------------------------------------------------------

 -c  一般线程数不宜过多. 核数的2到4倍足够了. 多了反而因为线程切换过多造成效率降低. 因为 wrk 不是使用每个连接一个线程的模型, 而是通过异步网络 io 提升并发量. 所以网络通信不会阻塞线程执行. 这也是 wrk 可以用很少的线程模拟大量网路连接的原因. 而现在很多性能工具并没有采用这种方式, 而是采用提高线程数来实现高并发. 所以并发量一旦设的很高, 测试机自身压力就很大. 测试效果反而下降.

-T wrk 默认超时时间是1秒. 这个有点短. 我一般设置为30秒. 这个看上去合理一点.

 

Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   209.38ms  300.23ms   1.99s    90.36%
    Req/Sec    21.81     10.55    60.00     62.24%

Latency: 可以理解为响应时间, 有平均值, 标准偏差, 最大值, 正负一个标准差占比.
Req/Sec: 每个线程每秒钟的完成的请求数, 同样有平均值, 标准偏差, 最大值, 正负一个标准差占比.

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

 

--latency

  Latency Distribution
     50%  106.14ms
     75%  188.97ms
     90%  491.26ms
     99%    1.56s

 

30秒钟总共完成请求数1218和读取数据量30.04s.
然后是错误统计, 上面的统计可以看到, 540个读错误, 30个超时.
然后是所以线程总共平均每秒钟完成40.55个请求. 每秒钟读取60.02兆数据量.

  1218 requests in 30.04s, 1.76MB read
  Socket errors: connect 0, read 540, write 0, timeout 30
  Non-2xx or 3xx responses: 540
Requests/sec:     40.55
Transfer/sec:     60.02KB

wrk 支持lua语言脚本 ,在这个脚本里你可以修改 method, header, body, 可以对 response 做一下自定义的分析. 因为是 lua 脚本, 其实这给了你无限的可能. 但是这样一个强大的功能如果不谨慎使用, 会降低测试端的性能, 测试结果也受到影响.

一般修改method, header, body不会影响测试端性能, 但是操作 request, response 就要格外谨慎了.

我们通过一些测试场景在看看怎么使用 lua 脚本.

POST + header + body.

首先创建一个 post.lua 的文件:

1. wrk.method = "POST"

2. wrk.body = "devId=C80E7776704A"

3. wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"


就这三行就可以了, 当然 headers 可以加入任意多的内容.
然后执行:

1. wrk -t12 -c100 -d30s -T30s --script=post.lua --latency http://h5.itv.cp21.ott.cibntv.net/api/lottery/draw.json?

---------------------------------------------------------------------------------------------------------------------------------------------

下面没有验证过:

wrk 提供的几个 lua 的 hook 函数:

setup 函数
这个函数在目标 IP 地址已经解析完, 并且所有 thread 已经生成, 但是还没有开始时被调用. 每个线程执行一次这个函数.
可以通过thread:get(name), thread:set(name, value)设置线程级别的变量.

init 函数
每次请求发送之前被调用.
可以接受 wrk 命令行的额外参数. 通过 -- 指定.

delay函数
这个函数返回一个数值, 在这次请求执行完以后延迟多长时间执行下一个请求. 可以对应 thinking time 的场景.

request函数
通过这个函数可以每次请求之前修改本次请求的属性. 返回一个字符串. 这个函数要慎用, 会影响测试端性能.

response函数
每次请求返回以后被调用. 可以根据响应内容做特殊处理, 比如遇到特殊响应停止执行测试, 或输出到控制台等等.

1. function response(status, headers, body)

2. if status ~= 200 then

3. print(body)

4. wrk.thread:stop()

5. end

6. end



done函数
在所有请求执行完以后调用, 一般用于自定义统计结果.

1. done = function(summary, latency, requests)

2. io.write("------------------------------\n")

3. for _, p in pairs({ 50, 90, 99, 99.999 }) do

4. n = latency:percentile(p)

5. io.write(string.format("%g%%,%d\n", p, n))

6. end

7. end



下面是 wrk 源代码中给出的完整例子:

1. local counter = 1

2. local threads = {}

3.

4. function setup(thread)

5. thread:set("id", counter)

6. table.insert(threads, thread)

7. counter = counter + 1

8. end

9.

10. function init(args)

11. requests = 0

12. responses = 0

13.

14. local msg = "thread %d created"

15. print(msg:format(id))

16. end

17.

18. function request()

19. requests = requests + 1

20. return wrk.request()

21. end

22.

23. function response(status, headers, body)

24. responses = responses + 1

25. end

26.

27. function done(summary, latency, requests)

28. for index, thread in ipairs(threads) do

29. local id = thread:get("id")

30. local requests = thread:get("requests")

31. local responses = thread:get("responses")

32. local msg = "thread %d made %d requests and got %d responses"

33. print(msg:format(id, requests, responses))

34. end

35. end



测试复合场景时, 也可以通过 lua 实现访问多个 url.
例如这个复杂的 lua 脚本, 随机读取 paths.txt 文件中的 url 列表, 然后访问.:

1. counter = 1

2.

3. math.randomseed(os.time())

4. math.random(); math.random(); math.random()

5.

6. function file_exists(file)

7. local f = io.open(file, "rb")

8. if f then f:close() end

9. return f ~= nil

10. end

11.

12. function shuffle(paths)

13. local j, k

14. local n = #paths

15. for i = 1, n do

16. j, k = math.random(n), math.random(n)

17. paths[j], paths[k] = paths[k], paths[j]

18. end

19. return paths

20. end

21.

22. function non_empty_lines_from(file)

23. if not file_exists(file) then return {} end

24. lines = {}

25. for line in io.lines(file) do

26. if not (line == '') then

27. lines[#lines + 1] = line

28. end

29. end

30. return shuffle(lines)

31. end

32.

33. paths = non_empty_lines_from("paths.txt")

34.

35. if #paths <= 0 then

36. print("multiplepaths: No paths found. You have to create a file paths.txt with one path per line")

37. os.exit()

38. end

39.

40. print("multiplepaths: Found " .. #paths .. " paths")

41.

42. request = function()

43. path = paths[counter]

44. counter = counter + 1

45. if counter > #paths then

46. counter = 1

47. end

48. return wrk.format(nil, path)

49. end



关于 cookie
有些时候我们需要模拟一些通过 cookie 传递数据的场景. wrk 并没有特殊支持, 可以通过 wrk.headers["Cookie"]="xxxxx"实现.
下面是在网上找的一个例子, 取 Response的cookie作为后续请求的cookie

1. function getCookie(cookies, name)

2. local start = string.find(cookies, name .. "=")

3.

4. if start == nil then

5. return nil

6. end

7.

8. return string.sub(cookies, start + #name + 1, string.find(cookies, ";", start) - 1)

9. end

10.

11. response = function(status, headers, body)

12. local token = getCookie(headers["Set-Cookie"], "token")

13.

14. if token ~= nil then

15. wrk.headers["Cookie"] = "token=" .. token

16. end

17. end


wrk 本身的定位不是用来替换 loadrunner 这样的专业性能测试工具的. 其实有这些功能已经完全能应付平时开发过程中的一些性能验证了.

转:http://sanwen8.cn/p/1d4kAUJ.html

 

安装:224 /letv/wrk

 

 

 

分享到:
评论

相关推荐

    性能测试工具——WRK

    wrk是一款简单的HTTP压测工具,托管在Github上,wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis ...

    性能测试工具wrk-4.1.0-linux

    ### wrk与其它性能测试工具对比 wrk以其轻量级、高性能和易于扩展性,区别于其他性能测试工具,如Apache JMeter、ab(Apache HTTP Server Benchmarking Tool)等。它更适合对高并发、短连接场景下的Web服务进行压力...

    wrk.zip 压测工具wrk 下载

    wrk是一款高性能的HTTP基准测试工具,由Liz Rice和Matt T. Proud共同开发,主要用于Web服务器的压力测试。它基于LuaJIT脚本语言,可以进行复杂的HTTP请求定制,并能生成详尽的性能报告。在本文中,我们将深入探讨wrk...

    压力测试工具wrk在centos7,ubuntu18,20,wsl-ubuntu18,20的二进制包

    wrk-wsl-ubuntu18和wrk-wsl-ubuntu20是针对WSL环境优化的版本,适用于在Windows下进行Linux性能测试。 ### 安装与使用wrk - 解压下载的二进制包到合适目录,例如`/usr/local/bin`,然后通过命令行直接调用`wrk`...

    cpp-wrk是一种现代的HTTP基准测试工具

    cpp-wrk,基于wrk的C++实现,是一种高效的、现代的HTTP性能测试工具。它被设计用来在单个多核CPU环境中产生大量负载,以评估Web服务器和应用程序的性能极限。wrk利用了多线程技术以及操作系统级别的事件通知机制,如...

    wrk.tar.gz 压测工具,已经编译完

    wrk是一款高性能的HTTP基准测试工具,用于评估Web服务器或应用程序的性能。它由Steve Leach创建,使用了LuaJIT脚本语言,允许用户自定义测试场景,进行复杂的负载测试。在提供的wrk.tar.gz压缩包中,包含了编译好的...

    wrk-master

    "wrk-master" 是一个与网络基准测试工具...综上所述,"wrk-master"是一个强大的网络性能测试工具,它的特点是高度可定制和高效的性能测试能力。通过理解和掌握wrk,我们可以更有效地进行系统性能调优,提升服务质量。

    WRK线程调度改进实验

    WRK是一个高性能的HTTP服务器和负载测试工具,由著名的软件工程师Alexis Ohanian开发,它利用了异步I/O和事件驱动模型,以实现高并发的网络服务。在此次实验中,我们将探讨WRK的线程调度机制,并分析如何通过修改源...

    wrk—小巧轻盈的http性能测试工具

    在性能测试方面也有很多成熟的工具,比如Load  测试先行是软件系统质量保证的有效手段.在单元测试方面,我们有非常成熟的xUnit方案.在集成测试方面,我们selenium等自动化方案.在性能测试方面也有很多成熟的工具,比如...

    此案仅使用wrk对各web框架进行qps测试

    接下来,我们将深入探讨WRK工具和Web框架性能测试的相关知识点: 1. **WRK工具**:WRK由Doug MacEachern开发,采用C语言编写,可以进行高并发的HTTP负载测试。它使用LuaJIT脚本语言扩展功能,允许用户自定义测试...

    nginx性能测试与优化1

    ApacheBench(ab)是Apache服务器自带的一款简单实用的HTTP服务器性能测试工具。它可以模拟多个并发用户向服务器发送请求,从而测量服务器的处理能力。在Linux系统中,通常通过`yum install httpd-tools`命令安装,...

    压测工具之wrk

    wrk作为一款强大的HTTP性能测试工具,提供了丰富的选项和详细报告,对于开发者和运维人员来说,是监控和优化Web服务性能不可或缺的利器。通过理解其工作原理和使用方法,我们可以更好地评估和提升系统的性能。

    wrk-v1.2-master.zip

    总的来说,wrk是IT行业中一款强大的性能测试工具,尤其对于Web服务器开发者和运维人员来说,它能够帮助识别和优化性能瓶颈,提升服务的稳定性和效率。通过深入研究“wrk-v1.2-master.zip”中的源代码,不仅可以了解...

    WRK-V1.2-VS版本

    此外,VS还提供了性能分析工具,帮助优化代码性能。 8. **移植与兼容性**:从VS2005到VS2012的迁移可能涉及到代码的调整以解决兼容性问题,确保代码在新环境下正确运行。开发者可能需要关注API的变更、库的升级以及...

    Web程序压力测试的客户端工具

    LoadRunner则是另一款强大的企业级性能测试工具,它支持多种应用类型,包括Web、移动、数据库等。LoadRunner提供了一个强大的脚本语言VUGen,可以录制和回放用户操作,模拟大规模并发测试。 至于命令行工具,ab是...

    wrk-v1.2(windows research kernal)

    8. **调试工具**:了解如何使用WRK提供的调试工具来诊断和修复内核级问题。 9. **性能优化**:学习内核级别的性能调优技巧,如锁优化、减少上下文切换等。 10. **编程模型**:熟悉Windows内核编程模型,包括内核...

    wrk:关于使用 wrk 的信息

    wrk是一个强大的HTTP性能测试工具,它的线程模型和Lua脚本支持使得测试更加灵活且具有针对性。通过理解和利用这些特性,开发者和运维人员能够准确地评估Web服务的性能瓶颈,优化服务器配置,提升整体系统性能。在...

    wrk源码分析之WinDbg+Bochs调试

    尽管其性能相比其他商业虚拟机稍逊一筹,但其强大的功能使得它成为理想的调试工具之一。 2. **调试通信**:传统的虚拟机调试通常通过串口或命名管道进行通信。然而,Bochs默认并不支持命名管道,因此需要对其进行...

Global site tag (gtag.js) - Google Analytics