28号在公司分享的内容,打算脱敏以后也放到自己的博客里好了。
第一部分 为什么需要性能测试?
用户体验:怎么这么慢?为什么打不开?卡?
———正是基于这些问题,才引出性能测试的概念。 性能测试需要考虑的是最大并发用户数和响应时间: 并发用户数大约理解为一个用户等于一个请求的话,每秒接收到的请求数。 如何评估最佳并发用户数? 1. 开发给出 2. 最大并发用户数 * 80% 那么如何获得最大并发用户数? 通过性能测试获取,这个时候就需要性能测试工具来帮助我们完成这些事情。响应时间
从用户角度来说,软件性能就是软件对用户操作的响应时间。对用户来说,当用户单击一个按钮,从用户单击开始到应用系统把本次操作的结果以用户能察觉的方式展示出来,这个 过程所消耗的时间就是用户对软件性能的直观印象。 制定一个测试计划,说明每秒增加的用户数并计算平均响应时间,如果平均响应时间出现明显增加,甚至开始出现error,可以理解为,我们碰到了最大并发用户数。使用哪些工具来帮助我们获取呢?
第二部分 工具介绍
Jmeter
Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于C/S的软件。
JMeter可以用于测试多种协议/应用程序/服务器(SMTP,FTP,HTTPS, etc)。 JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能。 JMeter 因其测试脚本的易维护性及可生成动态HTML格式的测试报告,支持多线程测试备受欢迎。JMeter的文章多不胜数,让我们跳到下个工具。
wrk
wrk是什么?
github地址是 https://github.com/wg/wrk 它是一个非常小巧高效的开源性能测试工具,支持使用lua脚本来创建复杂的测试场景。wrk 的一个很好的特性就是能用很少的线程压出很大的并发量,原因是它使用了一些操作系 统特定的高性能 I/O 机制, 比如 select, epoll, kqueue 等。 其实wrk是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知. 遗憾的是,wrk 只能运行在 Unix 类的系统上. 比如 linux, mac, solaris 等. 也只能在这些系统上编译.看一下wrk的文件包含什么内容?
将wrk的源码clone到本地进行编译(MacOS可以采用brew install wrk),以下是编译完成后的结果:
当我们操作wrk的时候,是依赖最后一个文件来操作的。
看一下wrk的参数介绍。
执行wrk -h可以看到以下内容 wrk: invalid option -- h Usage: wrk <options> <url> Options: -c, --connections <N> Connections to keep open -d, --duration <T> Duration of test -t, --threads <N> Number of threads to use -s, --script <S> Load Lua script file -H, --header <H> Add header to request --latency Print latency statistics --timeout <T> Socket/request timeout -v, --version Print version details一条完整的wrk执行命令包括以下几个参数 wrk -c2 -t1 -d1m -T10s -s ../base-arch-testscripts/alarm.lua --latency "http://1.2.3.4:8282"
-c 表示使用多少个链接对被测的服务器端来说,这代表了多少个用户-t 表示使用了多少个线程来发送请求一般来说在核数的2-4倍为最佳-d 表示测试时长 支持d(day) h(hour) m(minute) s(second)-T 表示timeout,也就是等待服务器返回的时间,默认为1s-s 表示脚本,需包含脚本的绝对路径—latency 表示需要进行响应时长计算,主要计算50%,75%,90%,99% 4个基线,用于描述服务端的响应时间"http://1.2.3.4:8282" 这里就是被测服务端的地址了
也可以填写域名。使用—laterncy后得到的结果:
Thread Stats Avg Stdev Max +/- StdevLatency 807.86ms 134.63ms 1.97s 75.92%Req/Sec 6.95 6.22 70.00 87.60%Latency Distribution50% 794.69ms75% 885.46ms90% 955.05ms99% 1.15s 18208 requests in 1.00m, 6.26MB readSocket errors: connect 0, read 0, write 0, timeout 1129Requests/sec: 302.94Transfer/sec: 106.74KB如果返回中包含4xx,5xx的结果,也会统计出这些特殊response的个数。说到wrk,就需要介绍一下lua,毕竟lua是wrk支持的脚本语言,那么我们开看一下lua.
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。其它特性:支持面向过程(procedure-oriented)编程和函数式编程(functional programming);自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;注:LuaJIT 是wrk支持lua脚本的基础,确保在编译wrk之前,你的操作系统支持LuaJIT。注:table是一个很重要的概念,在wrk中,我们使用table来拼接顺序请求的request。一个完整的wrk脚本怎么写??
--初始化阶段的唯一方法
function setup()
end
--运行时方法,包括init,request,delay,response
function init(args)
end
--发送请求
function request()
end
--是否延迟
function delay()
end
--返回处理
function response(status,header,body)
end
--运行后结果计算
function done(summary, latency, requests)
end