性能测试常见故障和解决思路详解

news2024/11/19 0:29:27

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快   

一、性能问题分析流程

1、查看服务器的CPU、内存 、负载等情况,包括应用服务器和数据库服务器

2、查看数据库健康状态,数据库死锁、连接池不释放

3、查看项目日志(查看无报错现象)

4、查看jvm的gc等情况

二、内存溢出

1、堆内存溢出

现象:

(1)压测执行一段时间后,系统处理能力下降。这时用JConsole、JVisualVM等工具连上服务器查看GC情况,每次GC回收都不彻底并且可用堆内存越来越少。

(2)压测持续下去,最终在日志中有报错信息:java.lang.OutOfMemoryError.Java heap space。

排查手段:

(1)使用jmap -histo pid > test.txt命令将堆内存使用情况保存到test.txt文件中,打开文件查看排在前50的类中有没有熟悉的或者是公司标注的类名,如果有则高度怀疑内存泄漏是这个类导致的。

(2)如果没有,则使用命令:jmap -dump:live,format=b,file=test.dump pid生成test.dump文件,然后使用MAT进行分析。

(3)如果怀疑是内存泄漏,也可以使用JProfiler连上服务器在开始跑压测,运行一段时间后点击“Mark Current Values”,后续的运行就会显示增量,这时执行一下GC,观察哪个类没有彻底回收,基本就可以判断是这个类导致的内存泄漏。

解决方式:

优化代码,对象使用完毕,需要置成null。

2、永久代/方法区溢出

现象:

压测执行一段时间后,日志中有报错信息:java.lang.OutOfMemoryError: PermGen space。

产生原因:

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

解决方法:

修改JVM参数,将XX:MaxPermSize参数调大。尽量减少静态变量。

3、栈内存溢出

现象:

压测执行一段时间后,日志中有报错信息:java.lang.StackOverflowError。

产生原因:

线程请求的栈深度大于虚拟机所允许的最大深度,递归没返回,戒者循环调用造成。

解决方法:

修改JVM参数,将Xss参数改大,增加栈内存。栈内存溢出一定是做批量操作引起的,减少批处理数据量。

4、系统内存溢出

现象:

压测执行一段时间后,日志中有报错信息:java.lang.OutOfMemoryError: unable to create new native thread。

产生原因:

操作系统没有足够的资源来产生返个线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。

因此,当线程数量达到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。

解决方法:

(1)减少堆内存

(2)减少线程数量

(3)如果线程数量不能减少,则减少每个线程的堆栈大小,通过-Xss减小单个线程大小,以便能生产更多的线程。

三、CPU过高

1、us cpu过高

现象:

压测过程中,使用top命令查看系统资源占用情况,us cpu过高,超过50%以上。

排查手段:

(1)使用top命令是哪个进程消耗CPU高

(2)再找到CPU消耗高的线程:top -H -p 进程号

(3)把线程号转换成16进制:printf "%x\n" 线程号

(4)再用jstack命令分析这个线程是在干什么:jstack 进程号 | grep 16进制的线程号

(5)通过JProfiler的CPU Views视图的层层分析,可以清楚的找到造成CPU高的原因

2、Sy cpu过高

现象:

压测过程中,使用top命令查看系统资源占用情况,sy cpu过高,超过50%以上。

排查手段:

(1)首先查看磁盘繁忙程度、磁盘的队列(iostat、nmon)

(2)如果磁盘没有问题,则使用strace查看系统内核调用情况

四、TPS上不去

(一)网络带宽

在压力测试中,有时候要模拟大量的用户请求,如果单位时间内传递的数据包过大,超过了带宽的传输能力,那么就会造成网络资源竞争,间接导致服务端接收到的请求数达不到服务端的处理能力上限。

(二)连接池

最大连接数太少,造成请求等待。连接池一般分为服务器中间件连接池(比如Tomcat)和数据库连接池(或者理解为最大允许连接数也行)。

(三)垃圾回收机制

从常见的应用服务器来说,比如Tomcat,如果堆内存设置比较小,就会造成新生代的Eden区频繁的进行Young GC,老年代的Full GC也回收较频繁,那么对TPS也是有一定影响的,因为垃圾回收时通常会暂停所有线程的工作。

(四)数据库

高并发情况下,如果请求数据需要写入数据库,且需要写入多个表的时候,如果数据库的最大连接数不够,或者写入数据的SQL没有索引没有绑定变量,抑或没有主从分离、读写分离等,就会导致数据库事务处理过慢,影响到TPS。

(五)硬件资源

包括CPU(配置、使用率等)、内存(占用率等)、磁盘(I/O、页交换等)。

(六)压力机

比如Jmeter和Loadrunner,单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会间接影响TPS(这个时候就需要进行分布式压测来解决其单机负载的问题)。

(七)业务逻辑

业务解耦度较低,较为复杂,整个事务处理线被拉长也会导致TPS上不去。

(八)系统架构

比如是否有缓存服务,缓存服务器配置,缓存命中率、缓存穿透以及缓存过期等,都会影响到测试结果。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

监控易监测对象及指标之:全面监控Sybase_New数据库

随着企业数据量的不断增长和业务的复杂化,数据库的稳定性和性能成为了保障业务连续性的关键因素。Sybase_New数据库作为众多企业选择的数据管理解决方案,其稳定性和性能对于企业的运营至关重要。 为了确保Sybase_New数据库的稳定运行和高效性能&#xff…

在类外定义的运算符重载函数

对基本的数据类型,C提供了许多预定义的运算符,如,-,*,/,等,他们可以用一种简洁的方式工作,例如 运算符: int x, y, z; x 3; y 5; z x y; 这是将两个整数相加的方法…

急!现在转大模型还来得及吗?零基础入门到精通,收藏这一篇就够了

大模型的出现,让行内和行外大多数人都感到非常焦虑。 行外很多人想了解却感到无从下手,行内很多人苦于没有硬件条件无法尝试。想转大模型方向,相关的招聘虽然层出不穷,但一般都要求有大模型经验。而更多的人,则一直处…

指数级增长使Hugging Face上的人工智能模型达到100万个

本周四,人工智能托管平台Hugging Face的人工智能模型列表首次突破100 万个,这标志着快速扩张的机器学习领域的一个里程碑。 人工智能模型是一种计算机程序(通常使用神经网络),通过数据训练来执行特定任务或进行预测。 …

【算法】字符串相关

【ps】本篇有 4 道 leetcode OJ。 一、算法简介 字符串是一种数据结构,大多与别的算法结合在一起出题,例如模拟、高精度算法、双指针、dp、回溯等,因此这个专题的题型本身是特别丰富的。本篇选取了较为典型的字符串题型,除了涵盖一…

双端之Nginx+Php结合PostgreSQL搭建Wordpress

第一台虚拟机:安装 Nginx 更新系统包列表: sudo apt update安装 Nginx及php扩展: sudo apt install nginx php-fpm php-pgsql php-mysqli -y启动 Nginx 服务: sudo systemctl start nginx检查 Nginx 是否正常运行: xdg-open http://localhost注意:终端命令打开网址 …

【射频通信电子线路第六讲】射频信号与调制包括调幅和部分调频的内容

一、调制(Modulation)与解调(Demodulation) 1、相关概念 调制是指使一个信号(如光信号、高频电磁振荡等)的某些参数(振幅、频率和相位)按照另一个欲传输的信号的特点变化的过程。 …

Linux基础(二):磁盘分区

1.磁盘在Linux中的文件名 SATA接口的磁盘在Linux中名字为/dev/sdx。/dev 几乎是所有外接设备存放的文件夹: 磁盘在Linux中的文件名是不确定的,比如拿一个U盘插到Linux主机,可能第一次名字为sda,拔插后名字为sdc,这取…

新160个crackme - 067-CarLitoZ.1

运行分析 需要破解Code PE分析 VB程序,32位,无壳 静态分析&动态调试 使用VB Decompiler分析,发现注册模块需要满足var_18 var_ret_7var_18 abt.Label1.MousePointer 即输入框填入的信息var_ret_7 Mid(var_1C, 6, 1) Mid(var_20, 9, 1…

《Linux运维总结:使用 MongoDB工具备份和恢复mongodb 7.0.14分片集群(方案一)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、备份说明 1、要使用mongodump备份分片集群,您必须 停止负载均衡器、 停止写入,避免备份的数据出现状态不一致问题。 2、从MongoDB7.0.2开始(也可以从6.0…

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】, 但是从可读…

芝法酱学习笔记(0.3)——SpringBoot下使用mybatis做增删改查和报表

零、前言 书接上回,我们搭建了windows下的开发环境,并给出了一个hello world级别的多模块SpringBoot项目。 毕竟java后端开发,离不开数据库的操作,为方便后面内容的讲解,这里再做一期铺垫,core模块下新增一…

国际版多语言点赞抖音分享点赞任务平台源码

>>>系统简述: 本系统是一个国际化的点赞、分享任务平台的源代码,特别针对抖音这个短视频社交平台进行了定制。源码支持十二种不同的语言,旨在为用户提供一个全球化的服务环境,促进内容的传播和互动。首页可领取脸书tikt…

如何使用 DomCrawler 进行复杂的网页数据抓取?

在互联网时代,数据是宝贵的资源。无论是市场分析、客户洞察还是内容聚合,从网页中抓取数据都是一项关键技能。Symfony 的 DomCrawler 是一个强大的工具,可以帮助开发者从复杂的网页中提取所需的数据。本文将详细介绍如何使用 DomCrawler 进行…

学习Python的难点分析

一、语法灵活性带来的困惑 缩进规则 Python使用缩进来表示代码块,而不是像其他编程语言(如C或Java)使用大括号。这虽然使代码看起来简洁,但对于初学者来说可能会造成困扰。例如: if True:print("This is insid…

C语言开发基础新手快速入门及精通系列学习教程(系统性完整C语言学习笔记整理)

关注我,一起学编程 前言 作为一名拥有多年开发经验的码农,我的职业生涯涵盖了多种编程语言,包括 C 语言、C、C# 和 JavaScript。在这一过程中,我深刻地意识到扎实的基础对于编程学习的重要性,尤其是对于 C 语言…

React 启动时webpack版本冲突报错

报错信息: 解决办法: 找到全局webpack的安装路径并cmd 删除全局webpack 安装所需要的版本

这条挣钱的路,离我好遥远啊

近日,笔者在发表的《乱篇弹(54)让子弹飞》一文中写道:“ 当然,笔者在《博客中国-狼头长啸的作家专栏》耕耘期间,也赚了一些用以补贴自己养老的‘ 散碎银两’。那么笔者是否可以依照知乎网的‘申请开通权限’…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-28目录前言1. Cognitive phantoms in LLMs through the lens of latent variables摘要研究背景问题与挑战创新点算法模型实验效果…

Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着大学城规模的不断扩大和学生数量的急剧增加,大学城内的水电管理面临着前所未有的挑战…