美文网首页
jemeter wrk ab siege 简单安装使用

jemeter wrk ab siege 简单安装使用

作者: prope | 来源:发表于2021-04-26 15:47 被阅读0次

    背景

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

    关键词解释

    • RT(响应时间):系统对请求从请求到做出的响应时间。
    • TPS(吞吐量):系统在单位时间内处理请求事务的数量。
    • QPS(每秒查询的能力):系统在执行的查询。

    压测工具介绍

    • jmeter:apache组织开发的基于Java的压力测试工具。
    • ab:ab是apache自带的压力测试工具。
    • siege:Siege是一个开源的压力测试和基准工具,属于Linux系统下的一个测试工具,完全使用C语言实现,可以对HTTP和FTP服务器进行负载和性能测试,siege的设计主要用于WEB的性能测试。
    • wrk:一款针对 Http 协议的基准测试工具,它能够在单机多核 CPU 的条件下,使用系统自带的高性能 I/O 机制,如 epoll,kqueue 等,通过多线程和事件模式,对目标机器产生大量的负载。
    • tcpcopy:网易的王斌开发的一款。

    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): 设置线程参数
    • 线程数(用户):想要模拟的虚拟用户的数量。
    • 循环次数:设置一个虚拟用户循环多少次测试,默认为1。选择forever就永远不会停止,自动一直循环下去,只能手动停止。
    • Ramp-Up Period (in seconds)(虚拟用户增长时长):设置的虚拟用户访问url的时长,是在一个时间同时访问,还是在一段时间持续访问。

      3): 添加被测试的接口url或者页面 添加被测试的接口url
      4):点击运行
      点击运行
      5):查看运行日志 查看运行日志
      6):新增监听,辅助用以压测结果 增加监听

    wrk

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

    • 注意:wrk只能运行在unix环境,例如 linux,mac,solaris

    安装

    linux

    下载
    • 下载代码
      git clone https://github.com/wg/wrk.git 或者进入github直接下载,或者使用wget https://github.com/wg/wrk.git命令
    • 进入下载目录
      cd wrk/
    • 编译wrk文件
      make
    • 创建软连接到制定目录
      ln -s /usr/local/src/wrk/wrk /usr/local/bin

    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的详细版本信息
    注意:

    • <N>代表数字参数,支持国际单位 (1k, 1M, 1G)
    • <T>代表时间参数,支持时间单位 (2s, 2m, 2h)

    统计信息分析

    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 setup(thread)
      在脚本文件中实现setup方法,wrk就会在测试线程已经初始化但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次setup方法,
      并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。
    • 运行阶段
    function init(args)  --由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数;
    function delay()  --在每次发送request之前调用,如果需要delay,那么delay相应时间;
    function request()  --用来生成请求;每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;
    function response(status, headers, body)  --在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body;
    
    • 结束阶段
      function done(summary, latency, requests)--在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。
    • 自定义可访问变量
    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)  --测试与给定的服务器地址信息是否可以成功创建连接
    
    • 使用案例
      1: 携带json参数,post请求
    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 即可。

    说明和一般使用

    参数详解

    • -V, –version : 打印版本号
    • -h, –help : 打印帮助信息
    • -C, –config : 打印当前配置信息
    • -g, –get : 拉去http头信息
    • -p, –print :打印
    • -c, –concurrent=NUM :并发用户数量,默认10个
    • -r, –reps=NUM :运行次数
    • -d, –delay=NUM :随机时间延迟(秒)
    • -b, –benchmark :请求没有延迟
    • -i, –internet :模拟网络用户随机点击url
    • -f, –file=FILE :选择指定的URL文件
    • -R, –rc=FILE :指定siegerc文件
    • -l, –log[=FILE] :日志文件,默认是 PREFIX/var/siege.log
    • -H, –header="text" :给请求添加头,支持多个
    • -A, –user-agent=”text” :给请求设置User-Agent
    • -T, –content-type=”text” :给请求设置Content-Type

    响应详解

    • Transactions : 命中次数
    • Availability : 命中次数
    • Elapsed time : 整个压测花费的时间,从第一个开始到最后一个结束
    • Data transferred : 整个压测数据传输的总和
    • Response time :响应时间是响应每个模拟用户请求所花费的平均时间
    • Transaction rate :事务速率是服务器每秒能够处理的平均事务数. 简而言之:事务除以经过的时间。
    • Throughput :吞吐量是从服务器到所有模拟用户每秒传输的平均字节数
    • Concurrency :并发是同时连接的平均数,这是一个随服务器性能下降而上升的数字
    • Successful transactions :成功事务次数
    • Failed transactions :失败事务次数
    • Longest transaction :最长事务时间
    • Shortest transaction :最短事务时间
    • Failed transactions :失败事务次数

    使用案例

    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进程。

    安装和使用

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

    相关文章

      网友评论

          本文标题:jemeter wrk ab siege 简单安装使用

          本文链接:https://www.haomeiwen.com/subject/nvderltx.html