性能测试之性能问题分析
开始性能测试前需要了解的内容:
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、回滚上一个版本(一般是最后的手段)
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取
相关文章:

性能测试之性能问题分析
开始性能测试前需要了解的内容: 1、项目具体需求。 2、指标:响应时间在多少以内,并发数多少,tps多少,总tps多少,稳定性交易总量多少,事务成功率,交易波动范围,稳定运行…...

错过了A股,别再错过AI表情包!N款变现攻略,你选哪个?
本文背景 据 Swyft Media 统计,全世界每天各类聊天 app 发送的表情符号有 60 多亿,我们国家每天表情包发送量大概 6 亿次。 表情包简直就是个大淘金池,最近用 AI 做表情包也挺火。所以今天给大家讲讲一个用 AI 做表情包变现的项目。 以前没…...

SpringBoot驱动的美发沙龙管理系统:优雅地管理您的业务
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...

prometheus + alertmanager 搭建告警通知
prometheus 下载prometheus-2.53.2 prometheus.yml文件修改 global:scrape_interval: 15sevaluation_interval: 15salerting:alertmanagers:- static_configs:- targets:- 127.0.0.1:9093rule_files:- "rules/rule-*.yml"scrape_configs:- job_name: "promet…...

爬虫案例——爬取腾讯社招
案例需求: 1.爬取腾讯社招的数据(搜索 | 腾讯招聘)包括岗位名称链接时间公司名称 2.爬取所有页(翻页) 3.利用jsonpath进行数据解析 4.保存数据:txt文本形式和excel文件两种形式 解析: 1.分…...

VAS1800Q奇力科技线性芯片电荷泵热处理
高效恒流LED驱动器——VAS1800Q在汽车应用中的卓越表现 VAS1800Q是一款专为汽车应用设计的高效恒流LED驱动器。它具备多个显著特点,不仅提升了LED驱动效率,还大大减少了热量的产生,使其在汽车照明领域中具有极高的应用价值。本文将详细介绍VA…...

SQL Inject-基于报错的信息获取
常用的用来报错的函数 updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。 extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor(): MYSQL中用来取整的函数。 思路: 在MySQL中使用一些指定的函数来制造报错&am…...

redistemplate宇jedis区别
redistemplate是Spring Data Redis提供的一个模板类,用于简化Redis操作的代码编写。它提供了常见的操作方法,如存储、读取、删除等,可以更方便地操作Redis数据库。 而Jedis是Redis官方推荐的Java客户端库之一。它提供了丰富的功能和灵活的接…...

JavaWeb--09Servlet深入:JavaWeb三层架构---注册系统
一套完整的网页到Java到数据库的创建: html:进行数据收集以及呈现 第一层:根据servlet处理前台html的响应和请求,对数据进行接收,封装和验证 第二层:业务,验证是否存在调用创建的dao查&#x…...

教育技术革新:SpringBoot在线教育系统开发指南
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...

EasyAnimate
https://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.mdhttps://github.com/aigc-apps/EasyAnimate/blob/main/README_zh-CN.md EasyAnimate v4是一个用于生成高分辨率和长视频的端到端解决方案。我们可以训练基于转换器的扩散生成器,训练用于处理长视频的VAE,…...

Unity实现自定义图集(五)
以下内容是根据Unity 2020.1.0f1版本进行编写的 在Unity编辑器上的自定义图集已经完成了,但是如何将自定义图集文件打包,以及在移动平台将自定义图集和对应的纹理图(Texture)加载出来是个问题,本篇就来解决这些问题 1、思路 首先是自定义图集的打包。 自定义图集实际…...

2024年最佳平替电容笔对比:西圣、摩米士、倍思,哪款更适合你?
作为一位专注于数码产品的博主,我深知近年来平替电容笔在消费者中的热度不断攀升。这种电容笔以其亲民的价格和卓越的书写体验引起了广泛关注,尤其适合那些需要用iPad学习和办公的无纸化爱好者。 西圣这款自带充电仓的电容笔备受关注,尤其因…...

关系型数据库索引操作
前言:关系型数据库索引总结-作用,类型,适用场景,缺点简介 在MySQL、SQL Server、Oracle中,建立、修改、删除索引的操作有很多相似之处,但由于每个数据库系统的语法和特性不同,具体操作有一些差异。以下是三种数据库中关于索引操作…...

深度学习基础—卷积神经网络示例
1.卷积神经网络的结构 在之前的博客《深度学习—简单的卷积神经网络》,仅由卷积层构成网络的全部,这还不是标准的网络结构,本文将继续介绍标准的卷积神经网络结构有哪些? 深度学习基础—简单的卷积神经网络https://blog.csdn.net…...

vite学习教程03、vite+vue2打包配置
文章目录 前言一、修改vite.config.js二、配置文件资源/路径提示三、测试打包参考文章资料获取 前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&…...

Java | Leetcode Java题解之第461题汉明距离
题目: 题解: class Solution {public int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s ! 0) {s & s - 1;ret;}return ret;} }...

ubuntu 开放 8080 端口快捷命令
文章目录 查看防火墙状态开放 80 端口开放 8080 端口开放 22端口开启防火墙重启防火墙**使用 xhell登录**: 查看防火墙状态 sudo ufw status [sudo] password for crf: Status: inactivesudo ufw enable Firewall is active and enabled on system startup sudo…...

关于头文件为什么要加条件编译语句
因为有些情况重复包含头文件会出现重复定义或者导致多次包含导致增加编译时间。 下述是没有假如条件编译和宏定义的例子: // common_functions.h int addTwoNumbers(int a, int b); // data_structures.h #include "common_functions.h"struct MyStruc…...

strstr
strstr函数原型: char *strstr(conset char *s, conset char *s2); 功能:在字符串s中查找字符串s2出现的位置 返回值: 成功:返回第一次出现的s2的地址 失败:NULL...

C语言 | Leetcode C语言题解之第454题四数相加II
题目: 题解: struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…...

Leetcode 删除链表倒数第 N 个节点
算法思想: 使用了双指针法。下面是详细的算法思想: 1. 引入虚拟头节点(dummy node) 为了处理链表的一些边界情况(比如删除头节点),我们在链表的头部引入了一个虚拟节点 dummy,并让…...

[移植] tgi 编译
这里写自定义目录标题 报错 报错 Collecting numpy1.26.4 (from -r requirements_cuda.txt (line 21))Downloading numpy-1.26.4.tar.gz (15.8 MB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.8/15.8 MB 15.0 MB/s eta 0:00:00Inst…...

vue-element-admin后台集成方案
文章目录 vue-element-admin后台集成方案介绍使用安装目录介绍 vue-element-admin后台集成方案 介绍 官方网站 https://panjiachen.github.io/vue-element-admin-site/zh/guide/#%E5%8A%9F%E8%83%BD使用 安装 这里有三个模板,我们一般选择基础模板进行开发就好…...

40条经典ChatGPT论文指令,圈定选题和进行论文构思
目录 1、用ChatGPT圈定选题范围2、用ChatGPT生成研究方法和思路3、用ChatGPT扩展论文观点和论证4、用ChatGPT辅助论文结构设计5、如何直接使用ChatGPT4o、o1、OpenAI Canvas6、OpenAI Canvas增强了啥?7、编程功能增强 👇 ChatGPT o1网页入口在文末&#…...

在不支持WSL2的Windows环境下安装Redis并添加环境变量的方法
如果系统版本支持 WSL 2 可跳过本教程。使用官网提供的教程即可 官网教程 查看是否支持 WSL 2 如果不支持或者觉得麻烦可以按照下面的方式安装 下载 点击打开下载地址 下载 zip 文件即可 安装 将下载的 zip 文件解压到自己想要解压的地方即可。(注意&#x…...

《Electron 基础知识》代码打开开发者工具DevTools
初始化 const mainWindow new BrowserWindow({width: 1400,height: 800 );打开 接口 openDevTools mainWindow.webContents.openDevTools();关闭 接口 closeDevTools mainWindow.webContents.closeDevTools();...

小米R3G刷机OP
小米R3G刷机OP 22年购买了一个小米R3G路由器,刷OP系统后可以中继校园网,从而让智能开关、小爱同学可以联网。 当年的价格还是55元,现在只需要30元了,价格越来越便宜,并且OP版本越来越完善了。 之前刷机过breed系统&…...

移动机器人规划控制合集
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!…...

Type-C接口桌面显示器的优势
随着科技的飞速发展,电子设备的连接性、便捷性和高效性成为了消费者关注的重点。在这个背景下,Type-C接口桌面显示器以其卓越的性能和广泛的兼容性,正逐步成为市场上的主流选择。本文将深入探讨Type-C接口桌面显示器的优势、应用场景、市场现…...