wrk服务器性能测试

wrk服务器性能测试转载地址 http zjumty iteye com blog 测试先行是软件系统质量保证的有效手段 在单元测试方面 我们有非常成熟的 xUnit 方案 在集成测试方面 我们 selenium 等自动化方案 在性能测试方面也有很多成熟的工具 比如 LoadRunner Jmeter 等 但是很多工具都是给专门的性能测试人员使用的 功能虽然强大 但是安装和操

转载地址:http://zjumty.iteye.com/blog/

git clone https://github.com/wg/wrk.git cd wrk make 
src/wrk.h:11:25: fatal error: openssl/ssl.h: No such file or directory #include 
   
  

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

sudo apt-get install libssl-dev 

sudo yum install openssl-devel 

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

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

30秒钟结束以后可以看到如下输出:

Running 30s test @ http://www.baidu.com threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 538.64ms 368.66ms 1.99s 77.33% Req/Sec 15.62 10.28 80.00 75.35% requests in 30.09s, 75.28MB read Socket errors: connect 0, read 5, write 0, timeout 64 Requests/sec: 168.59 Transfer/sec: 2.50MB
Thread Stats Avg Stdev Max +/- Stdev Latency 538.64ms 368.66ms 1.99s 77.33% Req/Sec 15.62 10.28 80.00 75.35% 
5073 requests in 30.09s, 75.28MB read Socket errors: connect 0, read 5, write 0, timeout 64 Requests/sec: 168.59 Transfer/sec: 2.50MB 
./wrk -t12 -c100 -d30s -T30s http://www.baidu.com

可以看到超时数就大大降低了, Socket errors 那行没有了: 

Running 30s test @ http://www.baidu.com threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.16s 1.61s 14.42s 86.52% Req/Sec 22.59 19.31 108.00 70.98% requests in 30.10s, 67.25MB read Requests/sec: 150.61 Transfer/sec: 2.23MB

通过 -d 可以设置测试的持续时间. 一般只要不是太短都是可以的. 看你自己的忍耐程度了.wrk服务器性能测试 
时间越长样本越准确. 如果想测试系统的持续抗压能力, 采用 loadrunner 这样的专业测试工具会更好一点. 

想看看响应时间的分布情况可以加上–latency参数: 






wrk -t12 -c100 -d30s -T30s --latency http://www.baidu.com
Running 30s test @ http://www.baidu.com threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.22s 1.88s 17.59s 89.70% Req/Sec 14.47 9.92 98.00 77.06% Latency Distribution 50% 522.18ms 75% 1.17s 90% 3.22s 99% 8.87s requests in 30.09s, 57.82MB read Socket errors: connect 0, read 2, write 0, timeout 0 Requests/sec: 129.19 Transfer/sec: 1.92MB
wrk.method = "POST" wrk.body = "foo=bar&baz=quux" wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
wrk -t12 -c100 -d30s -T30s --script=post.lua --latency http://www.baidu.com
local wrk = { scheme = "http", host = "localhost", port = nil, method = "GET", path = "/", headers = {}, body = nil, thread = nil, }

schema, host, port, path 这些, 我们一般都是通过 wrk 命令行参数来指定. 

function response(status, headers, body) if status ~= 200 then print(body) wrk.thread:stop() end end
done = function(summary, latency, requests) io.write("------------------------------\n") for _, p in pairs({ 50, 90, 99, 99.999 }) do n = latency:percentile(p) io.write(string.format("%g%%,%d\n", p, n)) end end

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

local counter = 1 local threads = {} function setup(thread) thread:set("id", counter) table.insert(threads, thread) counter = counter + 1 end function init(args) requests = 0 responses = 0 local msg = "thread %d created" print(msg:format(id)) end function request() requests = requests + 1 return wrk.request() end function response(status, headers, body) responses = responses + 1 end function done(summary, latency, requests) for index, thread in ipairs(threads) do local id = thread:get("id") local requests = thread:get("requests") local responses = thread:get("responses") local msg = "thread %d made %d requests and got %d responses" print(msg:format(id, requests, responses)) end end
counter = 1 math.randomseed(os.time()) math.random(); math.random(); math.random() function file_exists(file) local f = io.open(file, "rb") if f then f:close() end return f ~= nil end function shuffle(paths) local j, k local n = #paths for i = 1, n do j, k = math.random(n), math.random(n) paths[j], paths[k] = paths[k], paths[j] end return paths end function non_empty_lines_from(file) if not file_exists(file) then return {} end lines = {} for line in io.lines(file) do if not (line == '') then lines[#lines + 1] = line end end return shuffle(lines) end paths = non_empty_lines_from("paths.txt") if #paths <= 0 then print("multiplepaths: No paths found. You have to create a file paths.txt with one path per line") os.exit() end print("multiplepaths: Found " .. #paths .. " paths") request = function() path = paths[counter] counter = counter + 1 if counter > #paths then counter = 1 end return wrk.format(nil, path) end
function getCookie(cookies, name) local start = string.find(cookies, name .. "=") if start == nil then return nil end return string.sub(cookies, start + #name + 1, string.find(cookies, ";", start) - 1) end response = function(status, headers, body) local token = getCookie(headers["Set-Cookie"], "token") if token ~= nil then wrk.headers["Cookie"] = "token=" .. token end end

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222538.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:34
下一篇 2026年3月17日 下午3:34


相关推荐

  • Excel中VBA编程学习笔记(一)「建议收藏」

    Excel中VBA编程学习笔记(一)「建议收藏」1、注释及编码规则注释:单引号:可以位于句子结尾或者单独一行; Rem:单独一行 编码规则:如果VB中的关键字是由多个英文字母组成,则系统自动将每个单词的首字母转换成大写字母,其余字母一律转换成小写字母。 对于用户自定义的变量名、过程名、函数名,VB以第一次定义的为准,以后输入的自动转换成首次的形式。 如果在同一行写多条语句,语句间要用冒号“:”隔开。例如:Form1…

    2022年6月1日
    128
  • 第一次有人把“分布式事务”讲的这么简单明了

    第一次有人把“分布式事务”讲的这么简单明了

    2022年2月10日
    47
  • java子窗口获取父窗口句柄_java获得窗口句柄[通俗易懂]

    java子窗口获取父窗口句柄_java获得窗口句柄[通俗易懂]学会用按键精灵获取子窗口句柄来源:按键学院【按键精灵】电脑的桌面是最顶级的…Windows通过句柄(Handle)识别每个窗体、控件、菜单和菜单项,当程序运行时,它所包含的每个部件都有一个惟一确定的句柄同其他的部件相区别句柄在WindowsAPI中具有举足……其实呢,“抓抓”抓句柄的功能,实现起来是很容易的,我们一起来操作看看。实现功能点击图片控件之后鼠标不松开,到了需要…

    2022年7月14日
    20
  • networkmanager配置文件在哪_需要运行networkmanager

    networkmanager配置文件在哪_需要运行networkmanager原文链接http://live.gnome.org/action/login/NetworkManagerConfiguration 本文对了解NetworkManager的使用和开发有很大帮助,澄清了一些NetworkManager中使用的概念,对阅读源代码和修改Bug有很大的帮助。 设置服务(SettingsServices)通过D-Bus服务提供配置给N

    2022年10月4日
    4
  • apache 配置跨域

    apache 配置跨域<VirtualHost*:80>DocumentRoot“D:/project/xuanhua_shop/public”ServerName192.168.18.182#servername后的ip为接口所在服务器IP<Directory“D:/project/xuanhua_shop/public”>OptionsIndexesFollowSymLinksMultiViews Options+Indexes+Includes+FollowSymLi

    2022年7月14日
    16
  • SQL语句–mysql高级查询[关联查询|多表查询](连接查询、子查询、联合查询、图解说明几种常见的连接[联合]查询)

    SQL语句–mysql高级查询[关联查询|多表查询](连接查询、子查询、联合查询、图解说明几种常见的连接[联合]查询)一 常用的高级查询语句连接查询 如果条件和结果分布于多张表 使用多表连接 子查询 如果最终结果在一张表中 优先选择子查询 再考虑连接查询 嵌套查询 将一个查询结果作为另一个查询条件或组成部分的查询 联合查询 全连接 联合查询 并集去交集等 将两个结果集联合到一起的查询 应用 连接查询和子查询配合使用 数据量较大时连接查询较慢 先过滤再连接 子查询嵌套层次较大也影响性能 s

    2026年2月7日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号