最近打算对一个线上HTTP接口做下压力测试,选择JMeter做为压测工具。

关于JMeter

Apache JMeter是Apache组织开发的基于Java的压力测试工具。可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

官网:http://jmeter.apache.org/download_jmeter.cgi

环境准备

  • 安装Java环境。我机器上的是JAVA1.8版本。
  • JMeter下载,我下载的版本为5.2.1,解压后无需安装直接可以使用的。进入bin目录,双击 jmeter.bat 即可启动一个CMD窗口和一个GUI界面。

注意图片红圈的警告,意思就是:不要使用GUI运行压力测试,GUI仅用于压力测试的创建和调试;执行压力测试请不要使用GUI。使用下面的命令来执行测试

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

并且修改JMeter批处理文件的环境变量:HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"

测试计划-创建线程组

在测试计划右键 【添加】-->【线程(用户)】-->【线程组】。

设置线程数=300;Ramp-Up时间=5;循环次数=永远。

这里解释下,

Ramp-Up 默认0,表示如果启动后,300个线程会立即启动执行。设置一个时间后,线程数会分批启动执行。主要是为了保护服务端,不要被瞬间击穿。

循环次数 这里我选择的是永远,不代表真的是永远,这里表示线程会一直执行下去。后续的会设置停止条件。通常这里可以选择持续时间,或者循环几次。

测试计划-设置HTTP请求默认值

在线程组上右键 【添加】-->【配置元件】-->【HTTP请求默认值】。

设置协议=http;服务器/IP=你的服务域名/IP地址。

测试计划-创建HTTP请求取样器

在线程组上右键 【添加】-->【取样器】-->【HTTP请求】。

设置HTTP请求 方法=POST;路径=你的服务路径,注意上面已经设置了HTTP默认服务器,所以这里只需要设置相对路径;内容编码=utf-8;

请求参数选择【消息体数据】,输入:

{
"id": "${id}",
"Bid":"${Bid}",
"IP":"${IP}",
"Port":"${Port}",
"UniqueID":"${UniqueID}",
"DomainName":"${DomainName}",
"ProductType":"${ProductType}",
"Version":"${Version}",
"DeviceType":"${DeviceType}"
}

这里我们是Json传输对象,选择动态参数化,所以value是 "${xx}" 格式,会和后面的数据样本对应起来。

测试计划-设置HTTP请求Head

在HTTP请求上右键 【添加】-->【配置元件】-->【HTTP信息头管理器】。

添加接口所需要的Head头,包括接口认证授权等等。这样所有的HTTP请求都会自动添加Head。

测试计划-参数化请求数据

在HTTP请求上右键 【添加】-->【配置元件】-->【CSV数据文件设置】。

这里的文件我们使用的是.txt格式。具体格式如下,对应着上面HTTP请求参数化设置。

id,Bid,IP,Port,UniqueID,DomainName,ProductType,Version,DeviceType
1234567891011123,E35B2798-DBA0-47F3-9194-47CF21F91E32,10.205.11.11,80,10.205.11.11,test.passport.com,test,V2.0,Iphone
1234567891011124,E35B2798-DBA0-47F3-9194-47CF21F91E32,10.205.11.11,80,10.205.11.11,test.passport.com,test,V2.0,Iphone
1234567891011125,E35B2798-DBA0-47F3-9194-47CF21F91E32,10.205.11.11,80,10.205.11.11,test.passport.com,test,V2.0,Iphone
1234567891011126,E35B2798-DBA0-47F3-9194-47CF21F91E32,10.205.11.11,80,10.205.11.11,test.passport.com,test,V2.0,Iphone
1234567891011127,E35B2798-DBA0-47F3-9194-47CF21F91E32,10.205.11.11,80,10.205.11.11,test.passport.com,test,V2.0,Iphone

配置设置:

  • 遇到文件结束符再次循环=False ; 遇到文件结束符号停止线程=True ,限定了线程运行终结条件。
  • 线程共享模式=所有现场 表示所有线程依次从数据文件中读取每行数据,保证了数据不会重复请求执行。还有其他选择 当前线程组当前线程 可以依字面意思理解。

测试计划-设置监听器

在线程组上右键 【添加】-->【监听器】-->【察看观察树】、【聚合报告】。

结果树会记录每个请求的执行情况;聚合报告则是对执行结果的分析,一般这个就是我们要的压测结果数据。简单解释下各个字段的意思。

  • 样本:压测执行的HTTP请求总数
  • 平均值:平均每个HTTP请求耗时,单位毫秒
  • 中位数:按执行时间排序,排在中间的请求耗时,单位毫秒。
  • 90%百分位:90%的请求耗时不超过该时间
  • 95%百分位:95%的请求耗时不超过该时间
  • 99%百分位:99%的请求耗时不超过该时间
  • 最小值&最大值:请求耗时的最小值和最大值
  • 异常%:请求错误的请求数%。这项通常需要特别关注。服务端压力正常是不应该有异常。错误的标准可以在
  • 吞吐量:即每秒请求数。这个就是我们要的数据啦~~
  • 接收/发送:网络数据统计,单位KB/s

遇到的问题

到这里压测计划完成了,可以保存倒 ***.jmx 文件。拿到生产环境上,将线程数设置倒500运行了一下。

执行命令行

jmeter -n -t MyPlans/QueryInvits.jmx -l Report/query.csv -e -o Report/htmlreport_query

结果发现 异常% 40%,检查请求日志,发现大量的异常:

HTTP请求,Non HTTP response code: java.net.BindException,Non HTTP response message: Address already in use: connect,confirminvitations

请求并没有打到服务端,在压测客户端已经失败了。网上搜查了下,是由于windows端口被耗尽了(默认1024-5000)。有以下几种解决方式:

  • 修改操作系统注册表,找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters,新建 DWORD值,name:MaxUserPort,value:65534(十进制),然后重启系统。
  • 将HTTP请求改成短链接(去掉 使用 keepAlive 的勾)。

我这里选择的是第二种方式,并且将线程数也缩小倒300个,再次执行,顺利完成,异常%=0。

分布式压测

到这里,实际还并没有完成所有压测的需求。由于上面的问题,我们知道单机压测的瓶颈实际上在压测客户端,单机并不能模拟大量多线程(用户)来发起大量的并发请求,所以我们还需要多机器分布式来支持压测。

笔者之前采用的是笨笨的手工动分离数据+手动多机执行+手动数据汇总的方式~~~ 其实JMeter也支持该功能。

这里参考:https://www.cnblogs.com/UncleYong/p/10854152.html

JMeter尝鲜的更多相关文章

  1. Windows 10 周年版尝鲜

    早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...

  2. 【翻译】五步快速使用LINQPad尝鲜StreamInsight

    StreamInsight  学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Seri ...

  3. 小程序新能力-个人开发者尝鲜微信小程序

    个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...

  4. 【响应式】foundation栅格布局的“尝鲜”与“填坑”

      提到响应式,就不得不提两个响应式框架--bootstrap和foundation.在标题上我已经说明白啦,今天给大家介绍的是foundation框架. 何为"尝鲜"?就是带大伙 ...

  5. Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

    前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...

  6. 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅

    本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言   Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...

  7. Linux下尝鲜IDE Rider .NET又一开发利器

    RiderRS 扯淡:很多人说:jetbrains出品,必属精品,jetbrains确实出了不少好东西,但是他的产品总感觉越用越慢,我的小Y430P高配版也倍感压力,内存占用率高. Multiple ...

  8. Win10尝鲜体验——初识传说中不一样的Windows 分类: 资源分享 2015-07-24 18:27 13人阅读 评论(0) 收藏

    这几天,网上传来一个消息,虽然不知是好是坏,Win10可以下载安装了! 出于好奇,下载尝鲜,几个截图,留作纪念~ 中文,还是要好好支持的,毕竟中国有如此多的用户 可选的安装版本 许可条款也刚刚出炉,估 ...

  9. 微信小程序“满月”:尝鲜之后你还用过它吗?

    距离 2017 年 1 月 9 日微信小程序上线,整整过去了一个月时间.和互联网时代每天出现的众多新鲜事物相似,小程序甫一诞生,立即占据了各大科技媒体网站头屏并引起社交圈的兴奋讨论.由于背靠微信,纷纷 ...

随机推荐

  1. x86架构:实模式下的中断

    https://www.cnblogs.com/Philip-Tell-Truth/p/5317983.html   这里有详细的过程说明.文字很多,为了方便阅读和理解,提炼了一些要点后归纳.整理了如 ...

  2. 埋在MySQL数据库应用中的17个关键问题!

    作者:扎瓦陈序元 来源:https://blog.csdn.net/weixin_42882439 MySQL的使用非常普遍,跟MySQL有关的话题也非常多,如性能优化.高可用性.强一致性.安全.备份 ...

  3. ios 浅谈一下UITextFiled UITextView 在tableview的cell上边展示

    最近在项目中.要做到在tableview的cell上边加一个输入框.允许用户输入. 1.我首先选的是在uitextView  然后在通知键盘出现的时候,将tableview的内容设置在键盘的上边.但是 ...

  4. 12、Decorator 装饰器 模式 装饰起来美美哒 结构型设计模式

    1.Decorator模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式(Decorator Pattern)允许向一个现 ...

  5. PB级大规模Elasticsearch集群运维与调优实践

    导语 | 腾讯云Elasticsearch 被广泛应用于日志实时分析.结构化数据分析.全文检索等场景中,本文将以情景植入的方式,向大家介绍与腾讯云客户合作过程中遇到的各种典型问题,以及相应的解决思路与 ...

  6. 浅析Facebook LibraBFT与比原链Bystack BBFT共识

    如果说什么是区块链的灵魂,那一定是共识机制. 它是区块链的根基.无论公链或是联盟链,共识机制都从基础上限制了区块链的交易处理能力和扩展性. 2019年6月18日,Facebook 发布了自己 Libr ...

  7. Mac 系统更新怎么忽略

    1.在“终端”命令行中输入以下命令: sudo softwareupdate --ignore “macOS Catalina” 2.按回车键,然后输入管理员密码*,然后再次按回车键,以超级用户权限执 ...

  8. week4:周测错题

    4.如何在类外,给对象动态添加绑定方法 import types def qingtianzhu(obj,name): print("请我叫我一柱擎天,简称{},颜色是{}".fo ...

  9. nginx进程模型解析

    nginx进程模型解析 概念   master会发送请求给worker,用于处理用户的请求,模型图如下 nginx进程分类   master进程(只有1个)    接受信号传递给worker   wo ...

  10. C#LeetCode刷题之#206-反转链表(Reverse Linked List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3828 访问. 反转一个单链表. 输入: 1->2-> ...