ab和JMeter进行GET/POST压力测试的使用心得和比较

引言: 互联网服务压测是非常重要的评价方法,ab,webbench,jmeter等都是业界流行的测试工具,ab和webbench作为shell模式下轻量级的测试工具,jmeter则作为有GUI界面的更高级测试工具,各有特点,ab比webbench功能更多一些,所以这里选择ab和jmeter来做一个对比。

【测试环境的安装】
【ab】

ab就是Apache Benchmark的缩写,顾名思义它是Apache组织开发的一款web压力测试工具,优点是使用方便,统计功能强大。

ab作为一款非常流行的压测工具,使用细节这里就不多介绍了,直接给出个人的使用体会:

首先是安装,UbuntuCentOS目前都提供自动安装命令 (至少ubuntu 14, centos 6可以)

ubuntu:sudo apt-get install apache2-utils

centos:yum install httpd-tools

安装好之后就可以开始进行测试。

ab一般常用参数就是 -n, -t ,和 -c。

-c(concurrency)表示用多少并发来进行测试;

-t表示测试持续多长时间;

-n表示要发送多少次测试请求。

一般-t或者-n选一个用。

对于模拟GET请求进行测试,ab非常简单,就是:ab -n 100 -c 10 'http://testurl.com/xxxx?para1=aaa&para2=bbb'

对于模拟POST请求进行测试,则稍微复杂些,需要把将要post的数据(一般是json格式)放在文件里。比如一个post接口需要如下方式访问

curl -H 'Content-Type:application/json' -X POST  -d '{"actionType":"collect","appId":1,"contentId":"1770730744","contentType":"musictrack","did":"866479025346031","endType":"mobile","recommendId":"104169490_1_0_1434453099#1770730744#musictrack#USER_TO_SONG_TO_SONGS#gsql_similarity_content2content","tabId":0,"uid":"104169490"}' :8083/query/leui/v0/post/user/behavior/content

需要吧-d 后面的json数据放在一个文件里,比如建立一个文件post_data.txt,放入:

{"actionType":"collect","appId":1,"contentId":"1770730744","contentType":"musictrack","did":"866479025346031","endType":"mobile","recommendId":"104169490_1_0_1434453099#1770730744#musictrack#USER_TO_SONG_TO_SONGS#gsql_similarity_content2content","tabId":0,"uid":"104169490"}

然后用-p参数解析并发送这个json数据:ab -n 100 -c 10 -p post_data.txt -T 'application/json' :8083/query/leui/v0/post/user/behavior/content

【Jmeter】
jmeter是一个非常强大和用户友好的GUI工具,http访问的参数设置基本应有尽有,软件的help里的用户手册图例比较丰富,对于初学者来说很好上手

对于http测试的可配置参数有(1)http请求配置:测试目标host,端口,url路径,http请求参数,post的数据,http header(2)测试全局策略:测试发送的并发量,测试循环次数(jmeter没有测试时间的设定,只有不断发送测试请求反复重复多少次loop,或者无限重复)。对于(1)里每个可配置的参数都可以用变量${varaible_name}来代替,而araiable可以来自CSV格式的外部输入,GUI有“测试计划(test plan)右键点击-----添加-----配置元件-----CSV Data Set Config 里可以设置CSV 文件来源和CSV里每列数据对应的变量名称。

上面说的功能还有其他强大功能设置,在help文档和很多网上资料里都有详细介绍,比如CSV输入设置(博客),这里不再赘述。

一般来说,主要用到以下设置界面

新建测试计划(Test Plan)

Test Plan ---- 新建 Thread Group(线程组)

线程组 ---- 配置元件----HTTP Header Manager

线程组-----配置元件---CSV Data Set Config

线程组---sampler(采样器) -----HTTP 请求, 这里面有两个tab,一个是“parameters“ tab, 配置http请求参数,一个是“post data” tab,可配置post的数据,一般是一个json串,json串里的字段都可以用${xxx}这样的变量来表示。

这几个界面配置好即可,而且jmeter的配置保存时会生成.jmx文件,这个不只是用来保存修改配置用,而且还有一个更大的用处,就是在非GUI(命令行,shell)下运行。

因为我们的压测环境往往是linux系统,而且为了最大程度的发挥压测工具的性能,不论系统还是压测工具都最好运行在非GUI模式

linuxshell下,因为jmeter是Java开发的,无需安装,只需要把jmeter解压后,在解压路径下,运行

{jmeter_install_dir)/}bin/jmeter -n -t $target -l xxxx.jtl

-n 就是静默模;

-t 后面就跟.jmx配置文件的路径;

-l 跟一个输出文件用于记录每次请求的时间,可以用jmeter GUI打开生成最终统计聚合报告。

在命令行模式下运行jmeter,还可以从命令行(shell)输入参数,只要在jmeter命令后的参数列表里加上  -JXXXX = value , XXXX被jmeter识别为一个外部输入变量,其值是value, 在jmerter配置里用${__P(XXXX)}来使用这个外部输入变量,注意"__P"开头是连着的两个下划线。

【测试构建和效果对比】

下面我们用一个实际的例子来进行ab和jmeter压力测试的效果对比, 首先是GET请求。

【ab】

先用10个并发压测100秒。

]# ab -t 100 -c 10 'http://localhost:8083/xxxx?uid=1233435&did=123456789&appId=1'

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd,
Licensed to The Apache Software Foundation,

Benchmarking xxx.xxx.xxx.xxx (be patient)
Finished 733 requests

Server Software:        CppCMS-Embedded/1.0.4
Server Hostname:      xxx.xxx.xxx.xxx
Server Port:            8083

Document Path:        / xxx?uid=79057533&did=123456789&appId=1
Document Length:        4601 bytes

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9afd1bf81702d976ed377af9ee16cf0e.html