最近接到一个需求,产品说要对一个接口做负载均衡。当时我听到这个需求的时候,我的内心是奔溃的——这接口只有一个,怎么做负载均衡,负载均衡起码得有两个才能做啊!

最后理解了产品想要做的东西:由于线上某接口请求量过大,导致程序宕机,他想要做的是扩大这个接口的健壮性。通俗点说就是不要让程序挂掉,就可以了。

在做这个需求的时候,我首先简单对这个接口进行了简单的性能测试,在此记录。

性能测试工具

Jmeter

JProfile

测试指标介绍

响应时间(RT, Response Time):客户端从发起请求到接收最后一个字节数据为止所消耗的时间。

每秒查询数(QPS, Queries Per Second):服务器在一秒内处理的请求次数。

吞吐量(throughput):单位时间内系统处理用户的请求数

其他…

Jmeter配置

对于此次接口性能测试,我在 Jmeter 中添加的所有元件及处理器如下

<figcaption style="display: block; margin: auto; text-align: center;">所有元件及处理器</figcaption>

线程组:发起请求的线程数,循环次数等参数

HTTP请求:请求的协议、服务器、端口、请求地址、请求参数等

结果树:记录了请求的响应信息

响应时间图:以图表的形式反应请求的响应时间

汇总报告:自动统计本次测试数据,包括样本数、平均响应时间、最大最小响应时间、异常率、吞吐量、数据包接收等

生成概要结果:主要用于统计请求总时间,其他指标与汇总报告有重叠,不再赘述

单线程请求的性能测试

首先测试的是接口的平均响应时间,我在线程组中配置了一个线程,循环100次。 ramp-up period 参数的作用是在此时间内建立全部的线程,这里不需要改动。

<figcaption style="display: block; margin: auto; text-align: center;">线程组配置</figcaption>

关于响应时间图的配置,首先需要设置一个输出文件路径,然后配置合适的时间间隔(不同的时间间隔显示的图表会不一致),我这里配置的是10毫秒。

<figcaption style="display: block; margin: auto; text-align: center;">响应时间图配置</figcaption>

结果树在响应时间的测试中并不重要,汇总报告和概要结果不需要配置。

在完成了上述的配置之后,点击启动按钮,在等待一段时间后,整个测试流程结束,首先打开响应时间图中的 显示图表 。

<figcaption style="display: block; margin: auto; text-align: center;">响应时间图</figcaption>

从上面的图形中可以粗略看到,每次请求的平均响应时间大概在40ms左右。

同时,可以在 汇总报告 界面看到本次测试的数据结果。

<figcaption style="display: block; margin: auto; text-align: center;">汇总报告</figcaption>

从表格中可以看到,总共的样本数是100,平均响应时间为41ms,最小响应时间为28ms,最大响应时间为135毫秒,请求出错的概率是0.00%,吞吐量是每秒23.7次,数据包的统计值暂且不论。

由于本次测试是由一个线程顺序执行完成的,我么可以得出一个结论:在同一时间内只有一个用户对该接口发起请求时,该接口的平均响应时间为41ms。

以上对于单个用户请求的性能测试只是相当于一个试用 Jmeter 的 demo 工程,因为在正常情况下,线上系统的用户不可能只有一个,所以以上得出的结论不能代表这个接口的性能,我们需要找到一个合适的最佳并发数,然后进行并发测试。

并发请求的性能测试

将线程组中循环次数的配置项改为10次(为了缩短测试时间),然后通过改变线程数进行多次测试,得到的测试结果如下表。

线程数 样本数 请求总时间(ms) 平均响应时间RT(ms) 吞吐量ThoughPut(个/s) QPS(个/s)

QPS = 样本数/请求总时间,此接口为查询接口,故QPS与TPS可视为相同。

可以看到,当线程数为60个线程时,吞吐量和QPS都开始小于线程数,说明此时已经是一个瓶颈了,如果再往上加并发数,性能会越来越低,所以本接口的 最佳并发数 是50左右。

同时,观察到吞吐量呈一个先上升后下降的趋势,最高点即为 最大吞吐量 是79.4/s。

最后来测试 最大并发数 ,继续增加线程数,当程序开始抛出 Error 异常,同时 汇总报告 中错误率不再为0%时,就达到了最大并发数,通过漫长的伪二分测试,我得到了本程序的最大并发数为160。

基于 Jmeter 的性能测试到这里就结束了,主要涉及的指标有平均响应时间(RT)、吞吐量(Thoughput)、每秒查询数(QPS)、最佳并发数、最大吞吐量、最大并发数。

回到最初的需求——排查宕机原因——其实在日志里面说的很清楚了,是由于堆内存溢出。

而在上述的压测中,本程序的最大并发数只有160的原因是它的堆大小初始值只有256MB,使用 -Xms512m 启动附加命令将初始堆大小扩大为512MB,最大并发数也随之扩大,在相同的情况下就不会再出现堆内存溢出的情况了,后续就算并发数再扩大一倍也不会再出现宕机的情况(除非服务消费端循环调个几千次,并发数又增加好几倍…)。

再小结一次

在写完这篇性能测试小记之后,又有些新的内容做下分享:

首先是在测试之前,需要知道线上JVM、服务器的各种配置,本地程序的环境尽可能地模拟线上环境。

第二是并发数,最好是线上环境有PV的统计,这样就可以知道在宕机时系统的访问量,在 Jmeter 的线程数的配置时直接填访问量就可以,这样做的目标最终其实也是模拟线上的真实环境。

第三是考虑从代码上进行优化,比如说配置文件中的配置项可以解析为配置类在程序启动时就加载进来,而不是每次使用到的时候就去解析一次配置文件,这样做毫无意义(我也不知道项目里面为什么这么写,过几天把它优化掉)。

第四,也是比较重要的一点,进行性能测试的时候一定不要连生产环境的数据库(一般来说正常公司都会做生产环境与开发环境的隔离的)或者第三方接口啥的,否则把生产环境搞炸就完了。

以上笔者的经历更像一张横向的知识网,创建了一个交流平台 914172719 ,群内有各种技术同行交流、学习资料、面试经验等。其中用到jenkins、docker、moutebank、python编程等,还需要花更多的精力去深入学习,当每项技能都能掌握到一定深度,才能称为一个完整的知识体系。

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

基于jmeter测试web接口,看完都说学会了相关推荐

  1. 使用JMeter测试WebSocket接口

    因为我之前对WebSocket接口也不是很了解,所以本篇文章先简单的概括的说明一下WebSocket的相关概念.在文章的后半部分,进行测试WebSocket接口的步骤说明. 1.什么是WebSocke ...

  2. jmeter 测试websocket接口(一)

    jmeter 测试websocket接口时,需要对jmeter添加测试websocket的jar包. 下载地址: https://download.csdn.net/download/qq_14913 ...

  3. 【接口测试】JMeter测试WebSocket接口

    目录 一.WebSocket简介 二.JMeter测试WebSocket接口 三.WebSocket和Socket的区别 最近老被问到WebSocket,突然想到以前大学时上Java课的时候,老师教我 ...

  4. Apache JMeter 测试 HTTP接口

    一.设置基础组件 1. Apache JMeter 测试 HTTP接口流程 原则:简单的http请求而已,例如:PostMan测试一样的 1.添加一个线程组 2给线程组添加一个取样器,用来发送HTTP ...

  5. python语法基础学习-Python基础语法精心总结!看完都知道的可以往下继续学习了...

    原标题:Python基础语法精心总结!看完都知道的可以往下继续学习了 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 1. input 用户自己输入值 2. print 打印值 可 ...

  6. 老师看完都吐血的五道题

    全世界只有3.14 % 的人关注了 爆炸吧知识 老师看完都要吐血的五道题哈哈哈哈哈 虽然小编觉得最后一答完全没问题 哈哈哈 图片来源于网络,如有侵权请联系删除. 你点的每个在看,我都认真当成了喜欢

  7. Apache JMeter 测试webservice接口

    文章目录 Apache JMeter 测试webservice接口流程 一.设置基础组件 1. 添加一个线程组 2. HTTP信息头管理器 3. HTTP请求 4. 添加一个察看结果树 5. 添加一个 ...

  8. 手把手教你制作手机底部导航栏,领导看完都说好

    手把手教你制作手机底部导航栏,领导看完都说好

  9. robotframework测试web接口

    robotframework 是一个简单易用的关键字驱动自动化测试框架,我这里用dbank的python的sdk作为目标测试程序简单使用robotframework Why Robot Framewo ...

最新文章

  1. AC日记——行程长度编码 openjudge 1.7 32
  2. python cv release_Python cv.GetSize方法代码示例
  3. C++ STL算法之accumulate函数
  4. newLisp使用初步
  5. android handler 主线程吗,[android开发]非主线程进行handler操作
  6. 打造安全的网站服务器
  7. css设置一个div显示在另一个div的上层_CSS工程中常见问题-1
  8. GMF学习系列(二) 一些知识点(续2)
  9. 《统一沟通-微软-实战》-3-部署-Exchange 2010-1-先决条件
  10. 解决xampp启动mysql失败
  11. 微信小程序开发的坑---vuex
  12. 腾讯优图实验室招聘计算机视觉研究员和实习生
  13. human pose estimation期刊简单汇总
  14. Android集成百度人脸识别(一)基础版SDK
  15. (小)算法题(长期更新)
  16. mysql导入dum_MySql 利用mysqlmysqldum导入导出数据
  17. Mingw下使用FTD2XX进行FTDI的开发
  18. open-falcon开源监控使用
  19. qlv格式无需工具快速转MP4
  20. 01-数据库MySQL[Python]

热门文章

  1. 如何将c语言中的文件,急求如何将下列C语言程序数据存储到文件中?
  2. java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...
  3. hp203b例程_飞思卡尔公司LIN总线的例程代码
  4. oracle vm win10,win10系统oraclevm卸载不了错误2503的解决方法
  5. HALCON 21.11:深度学习笔记---网络和训练过程(4)
  6. Java+包裹类型_java中的包裹类型
  7. if else 嵌套 来源微信公众号
  8. Moddable SDK为物联网开发提供JavaScript引擎:不到32KB
  9. 虚拟机网卡的相关知识
  10. 4个数之和 4Sum II