jmeter压力测试实战分析详解,一定要看完哦

news2024/11/17 7:17:56

目录

1.从压力测试说起

2.压力测试到底要关注什么

3.你想要的到底是个什么东西

4.面试总问的jvm调优到底是要干什么

5.常用的压力测试工具及命令

6.性能诊断到底难在哪里?

7.到底是加机器还是优化服务?

总结:


1.从压力测试说起

压力测试的理解,xxx的性能10w/s,对你有意义么?

没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最理想环境下的,毫无参考意义。

举个栗子,Redis官网压测的例子,256字节的读速度11w/s,写速度8.1w/s,都知道redis优点是多变的数据结构,string、List、hash、set、sortset,实际工作稍微复杂的环境往往都是各种结构混合使用,字符串长度各异,你需要的是真正在你的工作环境下,即:你混合使用的数据结构下,你的访问压力下,你的字符串长度下redis的x响应性能。这个值往往跟官方公布的差异很大。我的经验,我们是视频行业,相对字符串长度较长,在压缩序列化之后,主要使用String和List,性能在访问client=200-400左右,qps相应能到5w,超过这个client值,qps下降而且服务器负载上扬,容易引起服务器雪崩效应,这个5w,才是真正基于我们业务使用下redis的性能瓶颈。

我这个服务压力2000tps,你觉得很牛逼?

看着很牛逼对不对,好像tps值越高显得能力越强一样,其实很可笑,如果性能好只是比这个,那写一个1+1=2的程序估计是无敌了吧。具体问题要具体分析,你牛逼你要说明你牛逼在哪里,在什么条件下,什么样子的背景,才能说你的tps是多少,这样才有意义。

反正线上没出现过问题,我们撑得住,你确定?

线上没出现过问题,不代表流量不会增加,流量不会增加不代表业务不会复杂,业务复杂性能下降是很有可能的,没有压力测试做保证,出问题就是大问题。

压力测试都是qa在做,有问题会反馈给我,你的服务极限到底在哪里?

你应该关注一下qa是怎么做压力测试的,无论从服务的角度还是从个人发展的角度。qa只能给你测试结果,不会告诉你性能瓶颈在哪里。

 

2.压力测试到底要关注什么

压测不是玩笑,你的4个9的指标呢

好的服务都会有一项指标,叫4个9,即99.99%得服务可靠性。这是衡量一个服务是否优秀的普世标准,压力测试的好坏最直观的影响4个9的保障。压力测试就是用来确保服务的稳定,给出服务稳定极限条件。稳定指的是服务负载,cpu利用率,接口的响应时长,网络的延迟,结果准确性等等都在你的标准之内。而这些指标又相互影响。

条件,用尽量多的已知去推测未知,模拟仿真,你要做的预测未来

硬件条件:服务器cpu核数、内存大小、网络条件、同宿主机下其他服务影响,软件条件:虚拟访问用户数、gc的稳定程度,响应时长要求,第三方依赖的可用程度、jdk的不同版本等都会严重影响压力测试的结果,造成你的压测结果上线之后达不到逾期。如果这些条件不注意,很可能你压测时按照达标条件tps=1000,其实线上tps才500的时候,服务已经崩溃了。压测的时候,最好保障压测环境与线上一致。你的结果才更有意义。

3.你想要的到底是个什么东西

tps只是结果,虚拟用户数,线程数,平均响应时长,错误数,90%的平均响应时长,服务器负载,结果准确性尽量用越来越多的点来评估你的服务。

tps:服务处理的吞吐量,每秒响应请求的数量,tps是压力测试最直观的结果,是衡量服务性能的一个结果性指标,一般说压力测试性能值就是tps值。最浅显直白的理解,统计access日志每秒的总数就是那一秒的tps值。

错误数:一般服务压力测试的时候是不允许出现错误的,即错误数:0%,但是复杂条件下,有的服务是允许出错率不超过x%的,看服务而定。

平均响应时长:移动互联网时代,你让一个用户打开app等你1s,用户早就跑了,打开app立刻看见内容是最起码的要求,一般好的app接口相应时间都是毫秒级别的,但是不同的场景不同的要求,我的上一家公司要求平均相应时长在20ms以内。可是上上家公司的算法接口,平均相应时长在100ms,不同的服务不同的要求,你需要找到适合你自己的要求。

90%的平均响应时长:jmeter学来的,表示90%的事务,服务器的响应都维持在某个值附近。比如有三个时间:1秒、5秒、12秒,则平均时间为6秒,而另外一种情况:5秒、6秒、7秒,平均时间也为6秒,显然第二种比第一种要稳定多了。所以,我们在查看平均事务响应时间的时候,先看整体曲线走势,如果整体趋势比较平滑,没有忽上忽下的波动情况,取“Average Time”与“90 Percent Time”都可以,如果整体趋势毫无规律,波动非常大,我们就不用“Average Time”而使用“90 Percent Time”可能更真实些

结果准确性:多线程下访问下结果的正确性。这个在压测的时候往往容易被忽略。这个需要你在压力测试的时候抽查访问接口,查看结果是否正确,曾经碰到过qa测试通过的接口,上线之后发现返回结果不正确,内网回测正确,后来内网压力测试的时候成功复现,是由于使用了不安全的多线程代码导致的,其实压测的时候抽查看一眼,很容易看出来。

线程数:这个指标不在各大压力测试工具监控之内,但是这其实是压力测试非常重要的服务指标。根据经验,好多时候服务崩掉的时候,线程数已经满了,好多时候应用服务器的线程在某个范围之内,服务是最健康的状态,超过某个范围,服务处于不稳定状态,处于有点网络抖动延迟都容易崩溃的临界点,所以熟悉这个值,你就心里清楚你的服务当前在什么状态下。

虚拟用户数(并发线程数):好多人容易把tps和虚拟用户数搞混,虚拟用户数表示当前正在访问你服务的用户数,就是说压力测试工具启动多少个线程来不停访问你的接口。但是实际上,哪个用户会像疯狗一样疯狂一直不间断的访问的你接口,对用户来说,访问你的接口,点进去看内容,好久不再访问才是常态(专业术语叫思考时间),可是这个值的大小,严重影响tps的值。那这个值多少合适呢?我知道的有2种做法,一种是求得tps的最大值,在压力测试的时候虚拟用户数不可测,那干脆不管,我就管好我服务的tps吞吐量,服务的吞吐量极限就是我的真实极限。做法就是找一个tps最高时的虚拟用户数,记做压力测试的虚拟用户数指标,当然,这有个严重的问题,做过压力测试的就知道,有的服务虚拟用户很低时tps很高,但是虚拟用户一但稍有提升,性能下降的非常快,怎么弥补这种情况呢,策略是补区间,得到最好tps的虚拟用户之后,在这个虚拟用户数之上加减某个值(例如30),得到3个压力测试结果,3个压力测试结果的趋势作为服务的性能指标。第二种是估算,当前服务的tps是多少,用压测工具可以得到达到当前tps的并发线程数是多少,但这个值肯定也只是一个估计值而已。

多说一句,这个值为什么又可以不去管它:其实真正线上流量大的时候经常会有一种现象:服务直接重启撑不起来当前流量,调整前端流量分配(部分nginx摘除重启server等做法),慢慢启动就可以支持起线上流量,再打开所有流量,发现server又可以支持没问题了(ps:所以nginx有一个流量缓增的收费模块就是干这个的),但是慢慢启动线上流量和一次打过来线上流量,其实在同一时刻虚拟用户数是差不多,斯以为这种现象是因为服务刚启动时流量全打过来时需要创建的可复用复用对象和线程很多,容易造成了服务的不稳定,那么其实压力测试时虚拟用户数重要么?它真的是不可代替的么?其实虚拟用户数只是用来探测服务性能的一个表现的总结而已,服务真正的健康情况其实反映在线程数,响应时长,服务器负载,性能瓶颈点(比如事务或者锁)等等,而虚拟用户数只是这些健康极限情况的表象总结而已。就是说,当压力测试总结的虚拟用户数在某一个范围值tps达到多少,其实内在真正描述的是在这个虚拟用户时,由于线程数是多少,负载是多少,平均相应时长是多少,线程数是多少,gc稳定程度是多少达到了tps值是多少。

4.面试总问的jvm调优到底是要干什么

请注意,jvm调优,调的是稳定,并不能带给你性能的大幅提升。服务稳定的重要性就不用多说了,保证服务的稳定,gc永远会是Java程序员需要考虑的不稳定因素之一。复杂和高并发下的服务,必须保证每次gc不会出现性能下降,各种性能指标不会出现波动,gc回收规律而且干净,找到合适的jvm设置。详细了解jvm的话请看神书《深入理解java虚拟机》。说些题外话,面试发现,jvm调优很多人都没有经验,有人甚至怀疑这东西真正是否有用,有的公司统一jvm的设置贯穿所有服务。其实只是没碰到生产条件复杂的情况而已,举个简单例子:我曾经的公司,碰到过服务运行超过14h直接死机的问题,头天下午压测,第二天上午服务自动重启了,按照当时习惯,新服务需要压力测试满12h,原则上我的服务通过测试,由于测试环境复杂,所有开发都可以登陆而且脚本很多,qa认为可能是有脚本误杀了,但是当时离上线deadline时间还早,于是决定再压力一次,成功复现,最后查看jvm发现每次fullgc之后o区总是会多一点,jmap打印内存栈发现char对象使用逐渐增大,最后撑满内存, 最后定位到调用JNI发生内存泄露,解决了这个问题。这只是简单的一次,在那家公司,由于服务偏算法而且流量很高,碰到过很多这种问题。还有一次,压力测试loadrunner图像显示每隔一段时间的点上响应时间立刻下降,过2s又恢复正常,规律性很强,通过jstat发现频繁生成大对象直接进入老年代,老年代很快撑大触发full gc回收,回收时间过长造成服务暂停明显,立刻反应到压测的响应上。解决的办法是调大年轻代,让大对象可以在年轻代触发yong gc,调整大对象在年轻代的回收频次,尽可能保证大对象在年轻代回收,减小老年代缩短回收时间,服务果然稳定下来。当时这么调整下来会有一点性能损失,基本可以忽略不计,但是提升了服务的稳定性,这才是这次jvm调优最重要的。

5.常用的压力测试工具及命令

loadrunner,jmeter,自写jar包,tcpcopy等。

压力工具,大同小异,用什么都行,tcpcopy是拷贝线上流量,对于已有接口和服务做压力测试是个神器,jmeter和loadrunner是压力测试工具,loandrunner压测结果更详细可视化不过笨重收费而且需要很多客户机,jmeter相对是平民版的loadrunner,胜在免费。之前也有由于数据需要实时从数据库查询,自己写http的client,就需要辅助一些shell和awk命令统计相应指标。

jmap,jstack,jstat,详细的讲解推荐《深入理解java虚拟机》,其实不神秘但是特别实用,jstat查看内存回收概况,实时查看各个分区的分配回收情况,jmap查看内存栈,查看内存中对象占用大小,jstack查看线程栈,死锁,性能瓶颈,某个线程使用cpu过高导致服务整体慢等都可以通过在这些命令辅助Linux命令看出来。

top,vmstat,sar,dstat,traceroute,ping,nc,netstat,tcpdump,ss等等具体请百度。

你的服务是跑在linux系统上的,是依赖第三方服务出问题了?是受别的服务影响还是自己利用资源过高?是网络抖动了?是网卡满了么?是cpu性能不够么?是写入磁盘瓶颈了?内核数据交换频繁?负载变高了?都需要linux命令才能看出来。

6.性能诊断到底难在哪里?

收到服务报警了,怎么办?打印的log日志都是连接不上memcache,难道是memcache的问题,手动客户端连接memcache没问题,难道是网络的问题,测试网络延迟很低,那到底怎么了?

其实服务类似于人体,有的人感冒的时候鼻子通气嗓子疼,有的人头疼,有的人流清涕,有的人流黄涕,对症下药要治标治本。没有什么统一的答案,这就体现了经验的重要性。举个栗子:某天晚上突然收到报警,vpn登陆发现服务还正常返回,暂时没有报错,但是负载明显升高,resin线程数飙升到1000多(正常情况下该服务高峰期线程数500-700),cpu使用率偏高,排查:1.访问量激增?统计发现并没有。2.网络状况异常?通过访问服务器发现也没有,稍微慢些是因为负载稍高。3.程序有瓶颈?打印内存栈线程栈都没发现4.受其他同宿主服务影响?查看监控发现并没有。仔细观察发现流量稍有波动但是不明显。为什么负载高呢?最后排查发现是前端nginx带宽满了,带宽拥堵造成代理的后端服务无法及时返回数据,后端服务的句柄数拥堵造成服务器负载升高,服务器负载升高又使线程数和cpu利用率升高,造成服务的个别访问响应时长过长,触发报警。再严重些估计就会造成连接memcache超时,log打出连接memcache错误的日志。蝴蝶效应而已。想要快速抓住重点,其实跟医生一样,就需要你对服务足够了解,平时多关心服务状态而且经验真的很重要。

7.到底是加机器还是优化服务?

成本,加机器是一种成本,优化服务也是一种成本,很有可能你的服务很多依赖第三方,推动他们符合你的要求也是一种沟通成本,很多时候,老板的思路永远在于成本,如果他认为服务有很大的优化空间,那你找他加机器他多半是不会同意的,所以这种要资源的事情,请考虑成本,也有一个问题,大公司往往会哭的才有奶吃,这也很现实,反正归根到底,对于我们这些搞服务端的来说,成就感不就应该是把硬件服务器资源压榨到底么?

总结:

感谢每一个认真阅读我文章的人!!!

我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家评论区留言333免费领取。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

59 KVM Skylark虚拟机混部-概述、架构及特性

文章目录 59 KVM Skylark虚拟机混部-概述、架构及特性59.1 Skylark概述59.1.1 问题背景59.1.2 总体介绍 59.2 架构及特性59.2.1 总体实现框架59.2.2 功耗干扰控制59.2.3 LLC/MB干扰控制59.2.4 CPU干扰控制 59 KVM Skylark虚拟机混部-概述、架构及特性 59.1 Skylark概述 59.1.…

Android SPI

1.SPI SPI全称Service Provider Interface,服务提供方接口,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。服务通常指一个接口或者一个抽象类,服务提供方是对这个接口或者抽象类的具体实现&…

kafka常见问题

1.为什么要用mq(mq的作用)? 2.引入mq会多哪些问题? 3. 如何解决这些问题? 1.1实现异步发送 有些复杂的业务系统,一次用户请求可能会同步调用N个系统的接口,需要等待所有的接口都返回了&#…

虹科分享 | 高考大数据可视化志愿填报分析-基于虹科Domo BI工具

高考是中国教育系统中一项极为重要的考试,它不仅是学生完成高中学业的重要标志,也是进入大学的门槛。每年高考都会吸引数百万学生参加,同时也吸引了各地高校和招生部门的关注。高考招生数据是教育研究和政策制定的重要依据,通过对…

技术管理第二板斧建团队-知人善用

1、什么是知人善用 知人善用就是指技术 Leader 怎么用对人?用好人?核心在于怎么给事情安排对的人?怎么给人安排合适的事情?其中,“人”与“事”相辅相成,如果把事情安排给对的人,不光会取得好结…

干货丨如何实现WinApp的UI自动化测试?自动化工具如何选择人?

WinApp(WindowsAPP)是运行在Windows操作系统上的应用程序,通常会提供一个可视的界面,用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome,都属于WinApp。常见的WinApp&…

Arduino IDE 2.1.0 下安装ESP32(2.0.9)

很久没玩Arduino了。新装了一台电脑,想重新捡起ESP32-WROOM-32开发板玩玩。官网上下了Arduino IDE 2.1.0,然后配置ESP32开发环境。 下载及安装Arduino IDE略过不谈。装完后还是老规矩,文件 -> 首选项,先把自定义板管理地址填入…

好程序员:2023年自学Java四阶段学习法,真滴好用麻啦!

同学们,我是好程序员小源,今天给大家整理了自学Java的四个阶段,大家可以按照这四个阶段学习哦~会更加规划系统一点! 第一阶段: JavaSE[5周] 本阶段从零基础起步,荃面深入的学系JavaSE课程,主要内容包括Java…

支付“清结算”体系的设计方法

支付完成以后进行履约,履约完成以后就需要清算各方利益并最终进行结算,清结算体系与支付体系并行是支付范畴另一个非常庞大的体系。 一、清算系统设计 我们都知道一笔支付最终都是要进行清算的,业务一般都会有众多参与者或者利益方&#xff…

ESP32网络应用 -- ESP32-S3使用MQTT协议与其他设备进行数据交互

在嵌入式物联网技术领域,MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议是一种非常常见且应用广泛的消息协议,它基于发布/订阅范式进行数据传输。关于MQTT协议的详细介绍,网络上不乏相关文章,此处不再进行详细论述。 ESP32-S3是一款应用广泛的物联网…

WPF实现登录页面设计

1、文件架构 2、CommandBase.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace CourseManagement.Common {public class CommandBase : ICommand{public ev…

EXCEL和VBA如何改变字母大小写 和 大小写互换?我写的自定义函数

目录 1 EXCEL里改变大小写的内置函数 2.1 转换大小写的函数 2.2 神奇的把数字和中文大小写转换的函数 2 VBA里改变大小写的内置函数 2.1 改变大小写 的内置函数 2.2 使用 excel的WorksheetFunction. text() 函数 3 如果想交换字母的大小写呢? 3.1 ASCII码里…

Java Servlet 技术

一、Servlet 简介 Servlet 是 JavaEE 的规范之一,通俗的来说就是 Java 接口,将来我们可以定义 Java 类来实现这个接口,并由 Web 服务器运行 Servlet ,所以 TomCat 又被称作 Servlet 容器。 Servlet 提供了动态 Web 资源开发技术…

偷偷爆料下工资特别高的8个开发岗。。。。。

外国网站 devjobsscanner 统计了全年需求量大的8种编程语言,基本上薪资很高的,也就是这几个方向了。 对于跳槽、找工作、转行、转语言等,都有一定的参考意义。 接下来结合网站统计和招聘网站的数据,可以做一个对照。 NO.1 Java…

MongoDB的基本操作

MongoDB的基本操作 MongoDB MongoDB是一个基于分布式文件存储的数据库,由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数…

游泳带什么防水耳机好,最佳游泳耳机的推荐排行榜

在炎炎夏日,玩水无疑是降温的最佳方式。既可以在室内游泳馆通过游泳锻炼身体,也可以到海滨浴场享受游泳和日光浴的乐趣。因此,选购一款适合水上活动的游泳耳机变得尤为重要。音乐的力量可以让原本单调乏味的游泳运动变得更具活力,…

Linux基础服务4——ftp

文章目录 一、基本了解1.1 C/S型架构1.2 数据连接模式1.3 用户认证 二、安装服务端2.1 安装vsftpd2.2 配置文件2.3 主配置文件参数2.4 windows访问服务端2.4.1 系统用户访问2.4.2 匿名用户访问2.4.2 开启客户端上传权限2.4.3 开启客户端其他权限2.4.4 开启客户端删除、修改权限…

hvv 文件上传和文件包含考点

天眼如何判断文件上传漏洞是否成功 数据包分析 观察客户端请求数据:是否包含webshell流量特征观察服务器返回信息:是否有“上传成功”或“success upload”等信息提示 尝试寻找上传的文件:访问上传的文件看是否存在;查看文件上传…

Redisson分布式锁-源码分析

Redisson分布式锁整体流程图 Redisson分布式锁源码流程图 Redisson分布式锁源码解析 获取分布式锁lock private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {//获取当前线程IDlong threadId Thread.currentThread().get…

参与 2023 第二季度官方 Flutter 开发者调查

Flutter 3.10 已经正式发布,每个季度一次的 Flutter 开发者调查也来啦!邀请社区的各位成员们填写: 调研旨在了解你对 Flutter 的满意程度以及对其各个子系统的反馈。你的意见将对我们改进 Flutter 的功能和性能产生重要影响。 在这次调研中&a…