python接口压力测试(HTTP压力测试工具-wrk介绍)

一、压力测试

压力测试是确保系统稳定性的一种测试方法,主要检测服务器可承受的最大qps(每秒请求数),数据存取导致数据库承压数,还有性能相关:被压服务器的cpu,内存,响应时间等;

压测工具也有很多,较常见的有jmter,wrk,roadrunner等,我用的是wrk,优点是操作简单,采用线程 网络异步IO模型,可以用很少的线程压出很大的并发量。

缺点是只能在Linux上用命令行执行,只允许单机测试,对我们的产品来说并发量足够了~

二、wrk安装

1、可以从git上直接下载,安装命令:

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

2、进入wrk路径内执行make命令

make之后,会在项目路径下生成可执行文件wrk,随后就可以用其进行HTTP压测了。可以把这个可执行文件拷贝到某个已在path中的路径,比如/usr/local/bin,这样就可以在任何路径直接使用wrk了。

三、运行wrk

首先进入wrk路径下,输入请求就可以进行http压测了

1、get类型

我们先看一个例子,这是一个get请求:./wrk -t12 -c100 -d30s "http://www.baidu.com"

下面是参数解释:

输入:

-t:需要执行的线程数

-c:总连接数(每个连接不停地发送请求)

-d:压测的时间,s是单位秒

--timeout:超时的时间(选填)

--latency:显示延迟统计信息(选填)

输出:

threads表示线程数,connections表示连接数

latency表示响应时间——平均值(Avg),标准偏差(Stdev),最大值(Max),正负一个标准差占比( /-) Stdev

req/sec表示每个线程每秒完成请求书——平均值(Avg),标准偏差(Stdev),最大值(Max),正负一个标准差占比( /-) Stdev。主要看avg平均值和max最大值,

request in 30s是30秒内总共完成的请求数和读取数据量。

socket errors是压测时的错误数据,连接错误,读写错误,和timeout错误数

Requests/sec: 平均每秒请求数

Transfer/sec: 平均每秒读取数

分析下请求和输出结果:使用了12个线程100个连接,对百度首页进行了30秒的压测;

输出结果:20秒内完成了30390个请求,读取数据量445.98MB;请求有3642个读数据错误,16个响应时间延迟;每秒请求数是1009.67;每秒读取数是14.82MB

2、post类型

学习完了get类型的请求如何发压,再介绍post请求如何发压

刚刚的get请求可以看到,参数很少,如果我们压测要携带一些数据,单用这个命令是无法实现的;我们可能还需要为每一次请求使用不同的参数,以更好的模拟服务的实际使用厂家,还好wrk想到了这一点,可以用lua语言编写脚本来定制压测过程,满足需求,让我们接着往下看吧~

lua脚本

wrk支持在三个阶段对压测进行个性化,每个测试线程,都拥有独立的Lua运行环境。

变量:wrk

一个table类型的变量wrk,是全局变量,修改该table,会影响所有请求。

wrk = {

scheme = "http",

host = "localhost",

port = nil,

method = "GET",

path = "/",

headers = {},

body = nil,

thread = <userdata>,

}

init = function (args):init由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数;

request = function ():每一次请求都会调用该方法; 代码示例中:i也是变量,随机获取1-500名称的文件,保证body值不同;cookie的值每次都不一样取得随机值,保证请求头不同;每次请求都会输出body参数;

response = function(status, headers, body):在每次收到一个响应时调用; 代码示例中:输出请求状态码,每个线程要先进行认证,认证之后获取token以进行压测

之前的代码示例:

wrk.method = "POST" wrk.headers["Content-Type"] = "application/x-www-form-urlencoded" 获取指定路径下文件内容 function get_body(path) local file, errorMessage = io.open(path, "rb") if not file then error("Could not read file: "..errorMessage.."\n") end local content = file:read("*a") file:close() return content end init = function (args) request = function () body_table={} i = math.random(500) body_table[1] = get_body("./data/"..i ..[[.jpg]]) body_table[2] = "content=" .. urlEncode(body_table[1]) wrk.body = body_table[2] print(wrk.body) #mock每个请求header的cookie值都是不一样的 num=math.random(1000000000,9999999999) wrk.headers["Cookie"] = "cuid=C5055AA8B0A287D3DE9CD7A084EB28BE|" .. num return wrk.format(nil, nil, nil, wrk.body) end response = function(status, headers, body) print("dump from status: " .. status .."body:" .. body ) if not token and status == 200 then token = headers["X-Token"] path = "/resource" wrk.headers["X-Token"] = token end end

lua脚本一般都放到scripts路径下,使用直接-s后面加上文件名即可

./wrk -t1 -c15 -d10m -s scripts/picsearch.lua --timeout=5s "http://172.30.8.56:8080/coversearch.php"

python接口压力测试(HTTP压力测试工具-wrk介绍)(1)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页