jemeter wrk ab siege 简单安装使用

2021-04-26  本文已影响0人  prope

背景

在开发出的系统在交付上线时候,需要知晓整个系统的运行边界,通常情况下需要了解系统的性能和吞吐量。

关键词解释

压测工具介绍

jmeter安装使用

Apache JMeter是Apache组织开发的基于Java的压力测试工具

安装

需要提前安装好对应的jdk版本

windows平台

1):下载安装包:点击链接 进入下载官网

官网下载示意图
2):解压:解压包后放在系统中自定义位置。
3):环境变量:在系统的全局或者某个用户下配置环境变量。变量名称为 JMETER_HOME,变量值为D:\soft\jmeter\apache-jmeter-xxx(步骤2中解压后的文件目录,bin的上一层路径)。
添加classpath变量示意图
4):在系统变量中的"CLASSPATH"追加
;%JMETER_HOME%\lib\ext\ApacheJmeter_core.jar;\%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar"
注意:
a)分号和斜杠都为英文模式下的分号和斜杠,否则会出现未知错误。
b)如果没有logkit-xxx.jar包就需要手动去maven仓库下载,不展开详细讲述。
5):启动:打开相应文件夹,点击jmeter.exe即可启动。 安装成功启动示意图

mac平台

一般安装

1):下载:下载mac对应的安装包,参考windows下 下载步骤。
2):解压:使用命令tar``或者双击这个安装包。 3):运行:进入到相应的文件夹下sh jemter``即可启动。

brew安装:

1):安装:终端使用命令brew install jmeter
2):启动:终端使用命令jmeter即可。

linux平台

1):下载:可以同mac下载一样的安装包。也可使用命令wget http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-3.2.zip
2):增加权限:进入相应的文件夹下面后chmod +x jemter
3):运行脚本:进入相应的文件夹目录执行./jmeter。

使用

1): 新建一个线程组

JMeter是java实现的,并且使用一个java线程来模拟一个用户,因此线程组就是一组虚拟用户的意思。这些虚拟用户是用来模拟访问被测系统。 新建线程示意图
2): 设置线程参数

wrk

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

安装

linux

下载

mac平台

安装

brew install wrk

安装成功

在控台台敲命令 wrk 出现

安装成功

使用

参数解析

-c, --connections <N> 跟服务器建立并保持的TCP连接数量
-d, --duration <T> 压测时间
-t, --threads <N> 使用多少个线程进行压测,压测时,是有一个主线程来控制我们设置的n个子线程间调度
-s, --script <S> 指定Lua脚本路径
-H, --header <H> 为每一个HTTP请求添加HTTP头
-latency 在压测结束后,打印延迟统计信息
--timeout <T> 超时时间
-v, --version 打印正在使用的wrk的详细版本信息
注意:

统计信息分析

Running 30s test @ http://xxx(压测时间30s)
8 threads and 200 connections(共8个测试线程,200个连接)
Thread Stats Avg Stdev Max +/- Stdev
(平均值) (标准差)(最大值)(正负一个标准差所占比例)
Latency 46.67ms 215.38ms 1.67s 95.59%
(延迟)
Req/Sec 7.91k 1.15k 10.26k 70.77%
(处理中的请求数)
Latency Distribution (延迟分布)
50% 2.93ms
75% 3.78ms
90% 4.73ms
99% 1.35s (99分位的延迟:99%的请求在1.35s以内)
1790465 requests in 30.01s, 684.08MB read (30.01秒内共处理完成了1790465个请求,读取了684.08MB数据)
Requests/sec: 59658.29 (平均每秒处理完成59658.29个请求)
Transfer/sec: 22.79MB (平均每秒读取数据22.79MB)

使用lua脚本定制化压测

lua脚本共有三个阶段,启动阶段,运行阶段,结束阶段,wrk可以支持在这三个阶段进行定制化。

function init(args)  --由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数;
function delay()  --在每次发送request之前调用,如果需要delay,那么delay相应时间;
function request()  --用来生成请求;每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;
function response(status, headers, body)  --在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body;
wrk = {
    scheme  = "http", 
    host    = "localhost",
    port    = nil,
    method  = "GET",
    path    = "/",
    headers = {},
    body    = nil,
    thread  = <userdata>,
  }
function wrk.format(method, path, headers, body)  --根据参数和全局变量wrk,生成一个HTTP rquest string。
function wrk.lookup(host, service)  --给定host和service(port/well known service name),返回所有可用的服务器地址信息。
function wrk.connect(addr)  --测试与给定的服务器地址信息是否可以成功创建连接
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"charset":"utf-8","data":{}}'
function request()
    return wrk.format('POST', nil, nil, body)
end

使用命令 wrk -c 20 -t 8 -d 60 --script=/Users/wanter/foot/lua/wrk_post.lua --latency http://10.49.0.105:8081
2:打印出请求失败的请求

wrk.method = "POST"
wrk.headers["S-COOKIE2"]="a=2&b=Input&c=10.0&d=20191114***"
wrk.body = '{"time":"2021-07-21","data":{}}' --根据需求传自定义参数
wrk.headers["Host"]="api.shouji.**.com"
function response(status,headers,body)
        if status ~= 200 then --将服务器返回状态码不是200的请求结果打印出来
                print(body)
        --      wrk.thread:stop()
        end
end

3:实现随机header-cookie

id_arr = {}
falg = 0
wrk.method = "POST"
wrk.body = '{请求参数}'
function init(args)
        for line in io.lines("integral/cookies.txt") do
                print(line)
                idArr[falg] = line
                falg = falg+1
        end
        falg = 0
end
--wrk.method = "POST"
--wrk.body = "a=1"
--wrk.path = "/v1/points/reading"
request = function()
        parms = idarr[math.random(0,4)] --随机传递文件中的参数
        --parms = idarr[falg%(table.getn(idArr)+1)] 循环传递文件中的参数
        wrk.headers["S-COOKIE2"] = parms
        falg = falg+1
        return wrk.format()
end

4:实现随机参数

id_arr = {};
function init(args)
        id_arr[1] = "1";
        id_arr[2] = "2";
        id_arr[3] = "3";
        id_arr[4] = "4";
end
request = function()
        parms = id_arr[math.random(1,4)]
        path = "/v1/points/reading?id="..parms
        return wrk.format("GET",path)
end

ab

ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。

安装

windows下安装

1):下载工具包
请点击链接 到apache官网下载。
2):解压
用解压工具解压后放置在某一路径下即可。
3):配置环境变量
讲bin的路径配置到系统path中即可。

linux下安装

1):下载工具包
请点击链接 到apache官网下载。
2):工具包解压
tar -zxvf xxxxxx.zip
3):bin路径配置到path变量

# 或者 vim ~/.bash_profile
vim ~/.bashrc
# 在最后一行加上 将xxx替换成具体路径
export PATH=$PATH:/xxx/xxx/xxx/bin
# 保存后刷新下配置文件
source ~/.bashrc 

4):或者使用版本管理工具安装
apt-get/yum -y install httpd-tools

mac下安装

1):预先安装apr和pcre

brew install apr
brew install pcre

2):下载安装包
浏览器打开链接,下载后解压到任意目录中。
3):编译
进入的解压后的目录中,依次执行一下命令

./configure
make
make install

常用基本命令介绍

1):参数详解:
格式:ab [options] [http://]hostname[:port]/path
参数说明:
-n requests Number of requests to perform //在测试会话中所执行的请求个数(本次测试总共要访问页面的次数)。默认时,仅执行一个请求。
-c concurrency Number of multiple requests to make //一次产生的请求个数(并发数)。默认是一次一个。
-t timelimit Seconds to max. wait for responses //测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-p postfile File containing data to POST //包含了需要POST的数据的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt 。 (配合-T)
-Tcontent-type Content-type header for POSTing //POST数据所使用的Content-type头信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p)
-vverbosity How much troubleshooting info to print //设置显示信息的详细程度 – 4或更大值会显示头信, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。
-V 显示版本号并退出。
-w Print out results in HTML tables //以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i Use HEAD instead of GET // 执行HEAD请求,而不是GET。
-xattributes String to insert as table attributes
-yattributes String to insert as tr attributes
-zattributes String to insert as td or th attributes
-C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3″ (repeatable) //-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复,用逗号分割。
提示:可以借助session实现原理传递 JSESSIONID参数, 实现保持会话的功能,如-C 'c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8'。
-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Inserted after all normal header lines. (repeatable)
-Aattribute Add Basic WWW Authentication, the attributes are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes are a colon separated username and password. //-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message)
//-attributes 设置属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现 HTTP/1.x; 仅接受某些’预想’的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即你可能是在测试ab而不是服务器的性能。
2):返回参数详解
Server Software: nginx/1.14.0// nginx 版本 1.14.0
Server Hostname: youxi.test// 服务器主机
Server Port: 443//端口号
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256 //SSL/TLS协议
TLS Server Name: youxi.test// TLS服务器名
Document Path: /api/v1/test///文档地址
Document Length: 30 bytes//文档长度
Concurrency Level: 10 //并发数
Time taken for tests: 22.428 seconds// 整个持续时间
Complete requests: 100 // 完成请求数
Failed requests: 74// 失败请求次数
(Connect: 0, Receive: 0, Length: 74, Exceptions: 0)
Non-2xx responses: 30
Keep-Alive requests: 0
Total transferred: 258248 bytes //整个场景中的网络传输量
HTML transferred: 229838 bytes//整个场景中的HTML内容传输量
Requests per second: 4.46 [#/sec] (mean)//相当于 LR 中的 每秒事务数 ,后面括号中的 mean 表示这是一个平均值
Time per request: 2242.769 [ms] (mean) //相当于 LR 中的 平均事务响应时间 ,后面括号中的 mean 表示这是一个平均值
Time per request: 224.277 [ms] (mean, across all concurrent requests) //每个请求实际运行时间的平均值
Transfer rate: 11.24 [Kbytes/sec] received //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

使用例子

1):正常使用
ab -c 10 -n 100 http://a.ilanni.com/index.php
-c10表示并发用户数为10
-n100表示请求总数为100
2):post携带参数
abs -n 10 -c 10 -p d:\para.txt -T application/json https://xxx/login
其中 para.txt 中携带的是json请求参数 也有方案说要将.txt后缀修改的.json后缀才生效

siege

Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

安装

windows平台

1)下载:点击链接 下载zip包。
2)解压:解压双层包,将解压后的文件配置到c盘根目录。(官方推荐是根目录)。

解压后存放目录
3)环境变量:将该文件夹放置在系统的环境变量中,即可在全局命令窗口中使用。(详见系统的环境变量设置部分,上面部分操作也有添加环境变量部分)。
环境变量中添加 C:\siege-windows
添加环境变量

linux

1)安装openssl:有些请求是https的,为了支持该协议,需要额外安装openssl。(如没有安装git请安装或去github手动下载将包上传)

git clone https://github.com/openssl/openssl
cd openssl
./config --prefix=/usr/local/openssl
make
make install
openssl version``

2)安装siege:和openssl安装类似,都是使用编译安装的。

wget http://download.joedog.org/siege/siege-latest.tar.gz
tar zxvf siege-4.0.5.tar.gz
cd siege-4.0.5
make clean
./configure --prefix=/usr/local/siege --with-ssl=/usr/local/openssl
make 
make install

3)修改配置:使用vi命令修改当前~/.siege/siege.conf文件中的limit的值。

mac

1)brew模式安装:brew install siege 即可。

说明和一般使用

参数详解

响应详解

使用案例

1)基础引用:使用并发线程(连接)10测试基准http://127.0.0.1,持续60秒
siege -c10 -t60s http://127.0.0.1
2)不限制并发:测试基准http://127.0.0.1,不限制并发线程(连接)60秒
siege -b -t60s http://127.0.0.1
3)输出日志文件:测试和输出日志到文件
siege -c10 -t60s http://127.0.0.1 > log.txt

流量压测

可以将线上流量拷贝到测试机器,实时的模拟线上环境。在不影响线上用户的情况下,使用线上流量进行测试,以尽早发现bug。也可以通过放大流量,进行压力测试,评估系统承载能力。
tcpcopy可以从线上服务器的IP层抓取在线请求的数据包,修改相关属性,利用raw socket output技术(packet injection 技术之一)将其发送给测试服务器进行测试。
发送到测试服务器的数据包会在TCP/IP协议栈被识别,其中带有payload(tcp data)的数据包最终进入到测试服务器的上层应用(如nginx),上层应用在处理完请求之后,将响应传递给测试服务器的TCP/IP协议栈。

工作原理

底层工作原理

1:一个访问到达线上前端机;
2:socket数据包在ip层被拷贝了一份传给tcpcopy进程;
3:tcpcopy修改包的目的及源地址,发给目标测试机;
4:拷贝的包到达目标测试机
5:目标测试机的nginx处理访问,并返回结果;
6:返回结果在ip层被截获、丢弃,由intercpet进程拷贝返回结果的ip header并返回;
7:ip header被发送给线上前端机的tcpcopy进程。

安装和使用

安装和使用暂且比较复杂,且没有实验数据。故后续补全。

上一篇 下一篇

猜你喜欢

热点阅读