性能测试之性能问题分析

news2024/11/23 13:05:53

目录

开始性能测试前需要了解的内容:

测试策略:

压测中遇到的性能问题及解决办法:

 性能问题分析流程


开始性能测试前需要了解的内容:

  1、项目具体需求。

  2、指标:响应时间在多少以内,并发数多少,tps多少,总tps多少,稳定性交易总量多少,事务成功率,交易波动范围,稳定运行时长,资源利用率,测哪些交易,哪些接口,测试哪些场景。

  3、环境:生产环境服务器数量,测试环境服务器数量,按照资源配比得出测试指标。

  4、协议:系统用什么协议进行通讯。

  5、压力机数量:如果并发用户数太多,需要把压力发到不同的压力机,不然可能会存在压力机瓶颈问题,导致tps和响应时间抖动。

  6、交易占比:分析线上日志得出tps占比。

  7、系统架构:请求流经过哪些环节,压测时监控这些环节。

            

 

测试策略:

  1、基准:一个用户迭代100次,关注响应时间,事务成功率100%。

  2、负载:10个用户跑10分钟,关注响应时间,事务成功率100%。

  3、容量:估算一个总tps,根据公式计算出每个交易的pacing和vu,获取系统最大处理能力(最优容量),再令外测出三个梯度作为对比(两组小于最优容量,一组大于最优容量),四组容量VU等差,tps等差,对比每组容量实际占比和测试占比(越接近越能模拟真实场景),关注响应时间,总tps,tps,事务成功率,AP cpu利用率,DB cpu利用率,线程死锁,数据库死锁。

  其中响应时间应小于负载测试时间,总tps应约等于预估总tps(相差不超过10是正常的),每个交易的tps应接近预估总tps*占比,事务成功率100%,AP cpu小于60%,DB cpu小于80%。dump线程栈检测是否有线程死锁,查看数据库日志看是否有数据库死锁。

  4、稳定性:采取最优容量的80%作为压力持续运行24小时,观察系统长时间运行的性能表现,关注响应时间,tps,总tps,事务成功率,交易总数,观察是否有内存溢出(堆溢出,栈溢出,持久代溢出),cpu利用率是否达标,mem是否不持续增长,是否能正常触发fullgc,gc时间,gc频率, fullgc时间,fullgc频率(重点关注,JVM调优就是为了减少fullgc频率)。

  

       监控:

  容量测试和稳定性测试时启动nmon监控。

压测中遇到的性能问题及解决办法:

一、容量测试过程中cpu过高

  1、用vmstat实时监控cpu使用情况。很小的压力AP cpu却到了80%多,指标是不能超过60%。

  2、分析是use cpu过高还是sys cpu过高,常见的是use cpu使用过高。

  3、如果是use cpu使用过高,先把消耗cpu最多的进程找出来(top命令),再找到该线程下消耗cpu过高的是哪几个线程,再把该线程转换成16进制,再用jstack命令来dump线程栈,看这个线程栈在调用什么东西导致use cpu过高。

 

二、内存溢出(堆溢出、栈溢出、持久代溢出)

  1、堆内存溢出

  产生的现象:稳定性压测一段时间后,LR报错,日志报Java.lang.OutOfMemoryError.Java heap space。

     排查手段:

       1)用jmap -histo pid命令dump堆内存使用情况,查看堆内存排名前20个对象,看是否有自己应用程序的方法,从最高的查起,如果有则检查该方法是什么原因造成堆内存溢出。

  2)如果前20里没有自己的方法,则用jmap -dump来dump堆内存,在用MAT分析dump下来的堆内存,分析导出内存溢出的方法。

  解决方式:如果应用程序的方法没有问题,则需要修改JVM参数,修改xms,xmx,调整堆内存参数,一般是增加堆内存。

  2、栈内存溢出

  产生的原因:稳定性压测一段时间后,LR报错,日志报Java.Lang.StackOverflowError。

    解决方式:修改jvm参数,将xss参数改大,增加栈内存。

                          栈溢出一定是做批量操作引起的,减少批处理数据量。

  3、持久代溢出

  产生的现象:稳定性压测一定时间后,日志报Java.Lang.OutOfMenoryError.PermGen Space。

       解决方式:

  1)这种原因是由于类、方法描述、字段描述、常量池、访问修饰符等一些静态变量太多,将持久代占满导致持久代溢出。

  2)修改jvm配置,将XX:MaxPermSize=256参数调大。尽量减少静态变量。

            

 

三、线程死锁
  产生的原因:在多线程程序的编写中,如果不适当的运用同步机制,则有可能造成程序的死锁,经常表现为程序的停顿,或者不再响应用户的请求。

       产生的现象

  1、容量测试压测一段时间后,LR报连接超时。

  2、造成这种现象的原因很多,比如带宽不够,中间件线程池不够用,数据库连接池不够,连接数占满等都会造成连接不上而报超时错误。

       排查手段:

  1、jstack命令dump线程栈,搜索线程栈里有没有block,如果有的话就是线程死锁,找到死锁的线程,分析对应的代码。

   jstack -F pid >jts.log(java进程id,可以用jps或者ps aux|grep java 去找),将线程的状态输出到jts.log文件

       值得关注的线程状态有:
       死锁,Deadlock(重点关注)
       执行中,Runnable  
       等待资源,Waiting on condition(重点关注)
       等待获取监视器,Waiting on monitor entry(重点关注)
       暂停,Suspended
       对象等待中,Object.wait() 或 TIMED_WAITING
       阻塞,Blocked(重点关注) 
       停止,Parked

       后置处理:把生成的文件,让开发排查几个重点的状态下的业务代码逻辑

四、数据库死锁

  产生的现象:容量测试压测一段时间后,LR报连接超时。

  排查手段:数据库日志中搜索block,能搜到block的话就是存在数据库死锁,查看对应的sql,优化造成死锁的sql。

五、数据库连接池不释放

  产生的现象:容量测试压测一段时间后,LR报连接超时。

  排查与解决方式:去数据库查看应用程序到数据库的连接有多少个( show full processlist),假如应用程序里面配置的数据库连接为30,在数据库查看应用程序到数据库的连接也是30,则表示连接池占满了。将配置改成90试试,去数据库看如果连接到了90,则可以确定是数据库连接池不释放导致的。查看代码,数据库连接部分是不是有创建连接但是没有关闭连接的情况。基本就是这种情况导致的,修改代码即可。

六、TPS上不去

  产生的现象:压力大的时候tps频繁抖动,导致总tps上不去。查看是否有fullgc(tail -f gc_mSrv1.log | grep full)。

       排查手段:

  1、pacing时间间隔设置太大也会导致tps上不去,减小pacing时间间隔。

  2、单压抖动大的交易,发现很平稳,这时怀疑是不是压力太大导致,所以发容量的时候把压力最大的那只交易分到其他压力机,然后发现tps不抖动了。注意:多台压力机只影响tps抖动,不会影响服务器的cpu。

  3、看响应时间有没有超时,看用户数够不够,都在指标内,可以添加用户数。

七、服务器压力不均衡(但相差1%-2%是正常的)

  1、跑最优容量的时候,四台APP只有一台cpu超过60%,其他三台都在60%以下。

  2、查看服务器是否有定时任务。

  3、查看是否存在压力机瓶颈。

  4、是否存在带宽瓶颈(局域网不存在此问题)。

  5、查看部署的版本,配置是否一样。

  6、可能别人也在用这些APP,因为同一台物理机上有很多虚拟机,因为别人先用,资源被别人先占了。

       7、前置服务器承担负载调度(Nginx,lvs)分配策略问题

八、fullgc时间太长

       产生的原因及排查手段:

  1、跑容量和稳定性的时候,出现LR报请求超时错误

       2、查看后台日志是fullgc了,看LR几点报的错和日志里fullgc的时间是否对应,fullgc会暂停整个应用程序,导致LR前端没响应,所以报错,这时可以减少old代内存,从而减少fullgc时间,减少fullgc时间LR就不会报错,让用户几乎感觉不到应用程序暂停。

  解决方式:四台APP轮流着full gc(部分severfullgc,其他server也会fullgc),这时可以制定策略让不同的server不同时fullgc,或者等夜间交易量少时写定时任务重启服务。

九、LR报连接超时

       1、造成这种现象的原因很多,比如数据库死锁、数据库连接池不释放、fullgc时间太长、堆内存溢出、栈内存溢出、持久代溢出、带宽不够,中间件线程池不够用,数据库连接池不够,连接数占满等都会造成连接不上而报超时错误。

  注意:

  服务器日志为error下测试。

  服务启动后几分钟内发压压力会很大,最好是服务启动两三分钟后再开始跑压力。

 性能问题分析流程

1、查看服务器的CPU、内存 、负载等情况
2、查看数据库健康状态
3、查看项目日志(查看无特殊现象)
4、查看jvm的gc等情况
5、回滚上一个版本(一般是最后的手段)

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

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

相关文章

从技术出发or从场景出发:大模型开始“路线分化”?

文 | 智能相对论 作者 | 叶远风 大模型时代,厂商们狂奔突袭,技术创新一浪高过一浪。 在这个过程中,先赶上风口做出一个大模型产品,宣传一波、站稳脚跟,再慢慢谈场景应用、价值落地,是很多厂商的做法——…

第二届计算与人工智能国际会议 | ACM-ICPS独立出版 | 快速检索

会议简介 Brief Introduction 第二届计算与人工智能国际会议(ISCAI 2023) 会议时间:2023年10月13 -15日 召开地点:中国上海 大会官网:www.iscai.org 2023年第二届计算与人工智能国际会议(ISCAI 2023)将围绕“计算与人工智能”的最新研究领域而…

【学会动态规划】使用最小花费爬楼梯(3)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

webpack项目和vue项目发布,浏览器存在缓存

项目是webpack搭建的每次发步到线上,经常需要手动清楚浏览器缓存才能有效果。vue项目设置在最下面 项目打包的js(css也是一致)名称都采用哈希值 问题:哈希值在有些情况下打包会不变,导致浏览器使用自己缓存的资源 解…

洗地机选哪个牌子好、洗地机排名

洗地机可以说是现代家居清洁首选设备。因为它比拖把拖地更加高效率,同时对比扫地机和吸尘器拥有更多的清洁功能,干湿垃圾一起拖少。并且自清洁功能能够帮助它更好的清理干净滚刷和管道,清洁使用非常省心省力。下面小编就给大家分享几款家庭清…

红队打靶:Brainpan打靶思路详解(vulnhub)

目录 写在开头 第一步:主机发现和端口扫描 第二步:web渗透 第三步:缓冲区溢出漏洞识别 第四步:定位eip寄存器(确定溢出字符串的长度) 第五步:ESP扩容(判断ESP寄存器的大小是否…

如何在 3ds Max 中使用 Mental Ray 制作逼真的草地和带有光晕的天空

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 首先,您将创建一个平面对象,然后添加一个噪点修改器。在此之上应用毛发和毛皮修饰符。 这将用于模拟逼真的草地。 我们用日光系统创造太阳和天空。为太阳添加镜头和戒指效果以及酷炫…

防火墙规则过期通知

作为规则管理最佳实践,大多数安全管理员为其防火墙规则设置到期日期。过期后,需要更正防火墙规则才能再次激活。但是,由于大多数组织都有数百个规则和多个安全管理员处理这些规则,因此几乎不可能查看过期的规则并手动纠正它们。这…

GPT的体验与思考

文章目录 一、GPT使用过程之对话二、AI大模型训练之文生图三、总结与思考 本文用到的词汇偏口语,甚至是小编自己创造;本文主要关注点在于使用和使用后的思考。 一、GPT使用过程之对话 在chart-gpt刚刚爆火出圈的时候,我并没有选择立马使用、…

力扣 309. 最佳买卖股票时机含冷冻期

一、题目描述 给定一个整数数组 prices,其中第 prices[i] 表示第 i 天的股票价格。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后&#xff0c…

Star History 月度开源精选|2023 年 6 月

上一期 Star History 月度精选是写给市场、运营人员的,而这一期回归到 DevTools 类别,我们六月发现了好一些开发者可以用的不错工具! AI Getting Started 还记得 Supabase “Build in a weekend” 的广告词吗!AI Getting Started…

10个项目瓜分5万美元,邀您参与Sui夏季黑客松最喜爱奖项投票

已经顺利完成第二阶段的项目选拔,40个项目成功入围最终的Demo Day。随着Sui Builder House巴黎站活动的临近,黑客松第三阶段Demo Day的气氛也逐渐热烈。 此次Demo Day将采用线上线下的形式为大家呈现精彩的项目路演,无法到达现场参与活动的朋…

vite + vue 白屏 Uncaught Syntaxerror: Unexpected token ‘?‘

如果可以实现记得点赞分享,谢谢老铁~ 一、问题的描述 突然收到业务方发来的反馈: 浏览器一片空白,开控制台输出:Uncaught Syntaxerror: Unexpected token ? 这个是语法错误。 二、 问题分析: 根据vit…

【数据分享】1929-2022年全球站点的逐年最大持续风速数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

母婴市场进入增长寒冬,AIGC能否为孩子王“供暖”?

文|螳螂观察 作者| 青月 人口负增长这件事,已经使母婴行业成了首批受到冲击的板块之一。用「母婴行业观察」的话来概括,就是“母婴行业正在进入销量低增长甚至零增长、营收利润低增长的挤压式竞争新阶段,并且已经开始了”。 行业内的玩家&…

BI分析中,经营和管理的关系到底是怎样的?

一家企业的CEO在聊BI的时候聊到的一个话题,这个级别的对话就不会聊具体的技术实现了,就会稍微务虚一些。但有时看似务虚的东西,深入去思考一下,其实也并不务虚,考虑的都是抽丝剥茧之后根源性的问题,把一些问…

接口测试原理及Postman详解

接口测试定义 接口是前后端沟通的桥梁,是数据传输的通道,包括外部接口、内部接口。内部接口又包括:上层服 务与下层服务接口,同级接口 生活中常见接口:电脑上的键盘、USB接口,电梯按钮,KFC下单 接口测试…

WebUI自动化必备技能-HTML和css知识详解

学习web自动化的前提条件:手工测试(了解各种测试的知识)、学习编程语言、学习Web基础、学习自动化测试工具 、学习自动化测试框架 、需要掌握前端的一些知识,无论学习语言还是前端知识,都是为了接下来的脚本和框架做铺…

【C语言】回调函数(qsort)与模拟实现

何思何虑,居心当如止水;勿取勿忘,为学当如流水。— 出自《格言联璧学问类》 解释:无思无虑,心境应当平静如水;不求冒进也不忘记,学业当如流水一般永无止境。 这篇博客我们将会理解回调函数这个概…

长达 1.7 万字的 explain 关键字指南!

当你的数据里只有几千几万,那么 SQL 优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL 优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让 MySQL 查询语句又快又好是一件很重要的事情。要让 SQL…