性能测试之性能问题分析

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

  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(部分server fullgc,其他server也会fullgc),这时可以制定策略让不同的server不同时fullgc,或者等夜间交易量少时写定时任务重启服务。

九、LR报连接超时

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

  注意:

  服务器日志为error下测试。

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

 性能问题分析流程

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

原文地址:https://www.cnblogs.com/wsy0202/p/12104070.html

时间: 2024-11-05 18:38:11

性能测试之性能问题分析的相关文章

性能测试之操作系统计数器分析方法

内存分析方法: 内存分析用于判断系统有无遇到内存瓶颈,是否需要通过增加内存等手段提高系统性能表现.内存分析需要使用计数器:Memory & Physical Disk类别的计数器,以下是内存分析的主要方法和步骤 1>.查看Memory\Available Mbytes指标,该计数器是描述系统可用内存的直接指标,在对系统进行操作系统级别的内存分析时,首先通过该指标建立一个初步的印象,了解性能测试过程中系统是否仍然有足够的内存可用,如果该指标的数据比较小,系统可能出现了内存方面的问题,这时需要继

[Android Pro] Android应用性能测试之CPU和内存占用(转载)

首先稍做分析一下测试环境:我们知道CPU和内存占用是一个实时变化的状态,而市面上还没有具体的哪款android应用能做到实时监控CPU和内存占用并使用log日志保存.考虑到android的底层框架是基于Linux的平台,所有我们可以通过Linux的资源监控命令来实现对android平台的资源实时监控. 要做到上边的测试环境的实现,需要具备以下几点: 1.被测试的手机具备root权限:因为涉及到底层的linux命令,需要读取或执行相应的文件.至于如何root你的手机,不同型号的手机root的方法不

性能测试之-wrk(转)

性能测试之-wrk(转) 转载地址:http://zjumty.iteye.com/blog/2221040 http://www.cnblogs.com/rainy-shurun/p/5867946.html 测试先行是软件系统质量保证的有效手段. 在单元测试方面, 我们有非常成熟的 xUnit 方案. 在集成测试方面, 我们 selenium 等自动化方案. 在性能测试方面也有很多成熟的工具, 比如 LoadRunner, Jmeter 等. 但是很多工具都是给专门的性能测试人员使用的, 功

性能测试之Windows常见性能计数器

性能计数器(counter)是描述服务器或操作系统性能的一些数据指标.计数器在性能测试中发挥着“监控和分析”的关键作用,尤其是在分析系统的可扩展性.进行性能瓶颈的定位时,对计数器的取值的分析非常关键.但必须说明的是,单一的性能计数器只能体现系统性能的某一个方面,对性能测试结果的分析必须基于多个不同的计数器. 与性能计数器相关的另一个术语是“资源利用率”.该术语指的是系统各种资源的使用状况.为了方便比较,一般用“资源的实际使用/总的资源可用量”形成资源利用率的数据,用以进行各种资源使用的比较. 性

【原创】性能测试之——网络环境分析

性能测试之——网络环境分析 首先,我们需要了解宽带上网时的网络带宽环境概念: 这里指的是带宽网速的单位计算方式方法及关系. 在计算机网络.IDC机房中,其宽带速率的单位用bps(或b/s)表示:换算关系为:1Byte=8bit 1B=8b             ---------- 1B/s=8b/s(或1Bps=8bps) 1KB=1024B     ---------- 1KB/s=1024B/s 1MB=1024KB  ---------- 1MB/s=1024KB/s 在实际上网应用中

Swift 性能探索和优化分析

Swift 性能探索和优化分析 Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程语言之名.前两点在 Swift 的语法和语言特性中已经表现得淋漓尽致:像是尾随闭包,枚举关联值,可选值和强制的类型安全等都是 Swift 显而易见的优点.但是对于高效一点,就没有那么明显了.在 2014 年 WWDC 大会上 Apple 宣称 Swift 具有超越 Objective-C 的性能,甚至某些情况下可以媲美和超过 C.但是在 Swift 正式发布后,很多开发者发现似乎 Swift

【原创】性能测试之——性能测试需求分析

性能测试之——性能测试需求分析 这里以一个电商购物(B2C)网站为例: 客户的购物网站性能测试(业务)需求: 从12月下旬至农历年底(来年2月初)(<=50天)网站预计营业额(400万),这里营业额可以理解为网站完成购买订单总金额: 访问订单转化率:10%,这里理解为百分之多少的访问量会转化为实际的网站订单: 每日访问时间:24小时×80%,这里理解为正常用户会在早6点至凌晨0点之前进行电子购物,下午18点下班至晚上22点为购物高峰期: 每个订单平均选购商品数:3件左右共计300元左右的金额,这

老李分享知识:性能测试之TPS和吞吐率

老李分享知识:性能测试之TPS和吞吐率      当增大系统的压力(或添加并发用户数)时,吞吐率和TPS的改变曲线呈大体一致,则系统基本稳定. 若压力增大时,吞吐率的曲线添加到一定程度后出现改变缓慢,甚至平坦,同时TPS也趋于平坦,查看系统资源运用,假如资源运用率比较低,说明服务器硬件资源不存在疑问,查看网络流量,估计网络带宽存在疑问. 同理若点击率/TPS曲线出现改变缓慢或者平坦, 点击率(用户每秒发出的请求数)假如在压力添加时,趋于平坦,很可能是服务器响应时间添加,观察服务器资源运用情况,确

性能测试培训:Ajax接口级性能测试之jmeter版

性能测试培训:Ajax接口级性能测试之jmeter版 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest认为工具不是问题,jmeter还是loadrunner都是工具级别的,真的提高性能测试水平,还是需要具备一定架构知识,网络知识,服务器方面的知识,poptest通过大量的实战案例的讲解提高学员的实战经验,尽快上手性能测试.(大家对课程感兴趣,请加qq:908821478) 1.  被测程序环境部署 对于自动化测