5年经验之谈 —— 性能测试如何定位分析性能瓶颈?

news2024/11/16 4:32:22

你好,我是小牛,目前在一家准一线互联网大厂做测试开发工程师。

对于一般公司普通测试工程师来说,可能性能测试做的并不是很复杂,可能只是编写下脚本,做个压测,然后输出报告结果,瓶颈分析和调优的事都丢给开发去做。

在一些大厂都有专门的性能测试团队去定位分析系统性能瓶颈,并进行调优。

但是,这并不意味着对于那些不想进大厂或者限于学历暂时无法进入大厂的人学习性能测试就没有意义了。

相反,我觉得很有意义,首先,做性能测试有利于你更好的理解系统架构以及整个链路数据的流转调用情况,从而加深你对业务的理解,更好的进行手工业务测试。

其次,学好性能测试对于你跳槽找工作面试来说是一大利器。之前不止一次提过,对于想拿高薪或者想进大厂的同学来说,其实就是看你编程,自动化,性能这几块掌握的怎么样。

至于其它工具使用,测试思维说实话都比较虚,也比较基础,没什么亮点。

那么接下来详细聊聊如何定位分析性能瓶颈,并调优呢?首先,说一下相对专业一些的性能测试在压测之前一般是怎么做的?

压测之前,一般会先对各个数据流转系统做好监控,比如服务器硬件资源cpu,磁盘,网络,io以及数据库服务器,数据库连接数,是否有sql慢查询,包括线程状态,JVM,中间件redis,nginx等等做监控。

关于如何做监控就看公司性能测试这块投入成本和建设的怎么样了,比如有的公司有自己的监控平台,可以同时监控很多东西。

像一些规模不大的团队简陋一点的可以借助于现有的开源平台和工具做监控。

比如Grafana+Prometheus可以监控服务器操作系统资源和数据库。jvisualvm可以监控JVM和线程状态,包括线程阻塞,死锁等等。nmon可以监控linux服务器,cpu,磁盘,内存,网络等。

除了这些工具还可以使用一些命令来做一些简单监控,比如监控cpu可以用top命令,内存用free命令等。监控中间件redis可以用info命令,监控nginx连接数使用netstat命令等等。

为什么讲性能瓶颈分析之前要先讲监控呢?

原因很简单,监控就像是人的眼睛一样,或者说就像是做手工测试时定位分析bug需要先去看日志报什么错一样,那么一通百通,性能测试问题瓶颈定位分析也是如此。遇到问题需要结合监控来看。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

下面列几个经常遇到的性能测试问题定位分析思路,抛转引玉~

一.TPS压上不去什么原因,怎么排查?

这个原因比较多,压测整个链路上任何一个环节有瓶颈或者问题都有可能导致

  1. 首先是压力机压力不够,比如用我们笔记本基本压不到那么高TPS, 所以我们公司有自己的压测平台,分布式集群压测。
  2. 网络带宽,单位时间内网络传输数据量过大,超过带宽处理能力
  3. 数据库连接数太少,最大连接数不够
  4. Cpu,内存,磁盘硬件资源达到瓶颈
  5. 中间件redis也有可能存在瓶颈比如缓存穿透,缓存过期等等
  6. 存在大量线程阻塞,线程死锁等
  7. 中间件消息队列拥堵

这个定位分析方法其实就是结合监控一个一个去排查,查看究竟哪条链路有问题,这也是性能测试比较复杂或者难的地方,需要你对每一个组件和链路都懂,然后还需要大量经验积累,才能在最短的时间内找到问题所在。

二.响应时间过长,什么原因怎么分析?

一般响应时间过长有下面几个原因:

  1. 服务器硬件资源cpu,内存,磁盘达到瓶颈,可以使用监控命令排查
  2. 网络问题导致,比如丢包,带宽不够等等
  3. 线程出现死锁,阻塞等问题可以用jstack查看
  4. 中间件比如mq消息队列拥堵排队等
  5. 数据库层面sql不够优化,没有索引,联合索引失效等,数据库连接数不够。

关于响应时间这个问题定位分析,我们还可以使用jprofiler工具去统计每个方法耗费时间定位到代码级别

三.压测过程中cpu过高或者飙升如何定位分析?

  1. 使用了复杂的算法,比如加密,解密。
  2. 压缩,解压,序列化操作。序列化可以把Gson组件换成fastjson提升 性能
  3. 代码bug,死循环。

下面是定位分析过程,尽量定位到代码级别再去开发看问题。

  1. 查找进程,使用top命令进行排序查找出占用cpu最高的java进程
  2. 根据进程查找对应线程,使用top-H –p<pid>查看线程占用情况
  3. 使用jstack命令查询线程堆栈信息,定位到代码级别,Jstack<pid>|grep –a 线程id

以上,就是性能测试瓶颈分析的一些定位思路,供大家参考。

END今天的分享就到此结束了,点赞关注不迷路~

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

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

相关文章

SQL基础理论篇(八):视图

文章目录 简介创建视图修改视图删除视图总结参考文献 简介 视图&#xff0c;即VIEW&#xff0c;是SQL中的一个重要概念&#xff0c;它其实是一种虚拟表(非实体数据表&#xff0c;本身不存储数据)。 视图类似于编程中的函数&#xff0c;也可以理解成是一个访问数据的接口。 从…

STM32通用定时器产生PWM信号

STM32通用定时器产生PWM信号 PWM信号stm32定时器PWM生成模式PWM配置基本步骤PWM周期计算CubeMX配置代码展现 本期内容我将展示使用STM32通用定时器产生PWM信号&#xff0c;这里以定时器3通道3为例 PWM信号 如果还不懂的话&#xff0c;可以看看 &#xff1a; “蓝桥杯单片机学习…

使用sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube&#xff0c;sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示两行常规字符应用

基于基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示两行常规字符应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍通过液晶显…

【算法之路】高精度算法(实现加减乘除)

目录 一、高精度概念 二、高精度算法的实现 1、高精度加法&#xff08;大整数相加&#xff09; 2、高精度减法&#xff08;大整数减法&#xff09; 3、高精度乘法&#xff08;大整数*小整数&#xff09; 4、高精度除法&#xff08;大整数/小整数&#xff09; 一、高精度概…

硬件寿命警告!Windows11在特定情况下对【固态硬盘】执行与【机械硬盘】相同的磁盘碎片整理。

首图&#xff0c;无图无真相 据我所知 此bug已持续约3个月。 此bug目前仍可以在Windows Feature Experience Pack 1000.25997.1000.0版本复现&#xff08;截至2023/11/21&#xff0c;最新的Windows预览金丝雀通道&#xff09; 如何复现 1 手动运行系统维护&#xff0c;点…

<C++> 模板-下

目录 前言 一、非类型模板参数 二、类模板的特化 1. 概念 2. 函数模板特化 3. 类模板特化 4. 全特化 5. 偏特化 5.1 特化部分参数 5.2 对某些类型的进一步限制 三、模板的分离编译 1. 概念 2. 分离编译 3. 解决方法 1. 显式实例化 2. 在一个文件内写声明和定义 四、模板总结 …

UE5、CesiumForUnreal实现加载GeoJson绘制盒体(Box)功能(StaticMesh方式)

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试2.3.1 材质2.3.2 蓝图测试3.参考资料1.实现目标 与之前基于StaticMesh创建Polygon和Wall类似,本文通过读取本地GeoJson数据,在UE中以staticMeshComponent的形式绘制出盒体Box,支持Editor和Runtime模式,在…

HR人才测评,提高员工和岗位的适配度

作为中小企业领导&#xff0c;除了操心企业的经营管理&#xff0c;还得经常为内部运行做考虑。某个岗位总是缺少匹配的员工&#xff0c;而公司的员工如何进行岗位优化&#xff0c;这都是人资管理中经常遇到的难题&#xff0c;归根结底&#xff0c;是对人才评价的难题。 人才&a…

【PHY6222】simpleBLEPeripheral剖析

源码剖析 main.c main函数中所有使用extern引用外部的函数均无源码&#xff0c;具体细节不可知。 可以看到源码函数有以下几个&#xff1a; hal_rfphy_init&#xff1a; 相关参数&#xff1a; hal_init&#xff1a; jump_table.c 因为rom的code是不开源的&#xff0c;rom代…

ubuntu 安装 gparted

前提环境&#xff1a; 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索&#xff1a;

新能源充电桩工业4G路由器应用,推动绿色出行,响应环保理念

在智慧城市环保事业发展领域&#xff0c;新能源技术应用成熟&#xff0c;物联网技术越来越广泛&#xff0c;充电桩物联网成为了智慧城市建设的热门应用。充电桩作为新能源汽车的重要配套设施&#xff0c;对于节能减排和推动环保理念可持续发展具有重要意义。而工业4G路由器作为…

OpenLayers入门,OpenLayers6的WebGLPointsLayer图层样式运算符详解

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解使用OpenLayers6的WebGL图层显示大量点情况下,列举出所有WebGLPointsLayer图层所支持的所有样式运算符大全。 二、基于的OpenLayers版本 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使…

Transformer——encoder

本文参考了b站的Eve的科学频道中的深入浅出解释Transformer原理和DASOU讲AI中的Transformer从零详解。 入浅出解释Transformer原理 Transformer从零详解 前言&#xff1a; 在自然语言识别中&#xff0c;之前讲过lstm&#xff0c;但是lstm有明显的缺陷&#xff0c;就是当文本过…

GNSS技术在灾害监测与应急响应中的关键作用

全球导航卫星系统&#xff08;GNSS&#xff09;技术在灾害监测与应急响应领域发挥着重要作用&#xff0c;为预防、监测和应对自然灾害提供了关键数据支持。本文将深入探讨GNSS技术在灾害监测与应急响应中的作用&#xff0c;并分析其对提高应对灾害能力的重要性。 一、GNSS在灾害…

78基于matlab的BiLSTM分类算法,输出迭代曲线,测试集和训练集分类结果和混淆矩阵

基于matlab的BiLSTM分类算法&#xff0c;输出迭代曲线&#xff0c;测试集和训练集分类结果和混淆矩阵&#xff0c;程序有详细注释&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。

大模型的实践应用7-阿里的多版本通义千问Qwen大模型的快速应用与部署

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用7-阿里的多版本通义千问Qwen大模型的快速应用与部署。阿里云开源了Qwen系列模型,即Qwen-7B和Qwen-14B,以及Qwen的聊天模型,即Qwen-7B-Chat和Qwen-14B-Chat。通义千问模型针对多达 3 万亿个 token 的多语言数据进行了…

轻量封装WebGPU渲染系统示例<37>- 多个局部点光源应用于非金属材质形成的效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialMultiLights.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class BasePbrMaterial…

5.4 Windows驱动开发:内核通过PEB取进程参数

PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息&#xff0c;进程环境块内部包含了进程运行的详细参数信息&#xff0c;每一个进程在运行后都会存在一个特有的PEB结构&#xff0c;通过附加进程并遍历这段结构即可得到非常多的有用信息。 在应用层下&am…

SQL基础理论篇(九):存储过程

文章目录 简介存储过程的形式定义一个存储过程使用delimiter定义语句结束符存储过程中的三种参数类型流控制语句 存储过程的优缺点参考文献 简介 存储过程Stored Procedure&#xff0c;SQL中的另一个重要应用。 前面说的视图&#xff0c;只能勉强跟编程中的函数相似&#xff…