当前位置: 首页 > news >正文

性能测试分析和调优

  • 步骤

    性能调优的步骤

性能调优的步骤:

  • 1.确定问题:根据性能测试的结果来分析确定bug。–测试人员职责

  • 2.分析原因:分析问题产生的原因。----开发人员职责

  • 3.给出解决方案:可以是修改软件配置、增加硬件资源配置、修改代码等-----开发人员职责

  • 4.验证问题:按照给出的解决方案,重新进行测试—测试人员职责

  • 5.分析验证结果—既要保证有问题指标得到解决,又要保证其他指标没有新问题

注意:

  • 性能分析和调优需要经过很多轮,才能得到最终解决。
  • 性能问题产生的原因分析:

在实际的性能测试中,会遇到各种各样的问题,比如TPS压不上去,导致这种现象的原因很多,作为测试人员应配合开发人员进行分析尽快找出瓶颈的所在。
在这里插入图片描述
性能问题可以产生的原因:
在这里插入图片描述

  • 硬件服务器资源指标:

    硬件服务器资源指标

  • 1、服务器的硬件

CPU、内存、磁盘、外设(键盘、鼠标、显示器、散热器、机箱)

运行速度从快到慢:CPU>>内存>>磁盘

存储空间从大到小:磁盘>>内存>>CPU

  • 2、CPU时间的介绍

CPU:单位HZ

  • 将CPU划分为若干个时间片,为每个程序分配对应的时间片,保证所有的程序占用时间片来串行执行

  • CPU使用率:表示一段时间内,正在使用的CPU时间段/总的CPU时间段*100%

    • 已使用的时间片=用户CPU+系统CPU
    • 总时间片=用户CPU+系统CPU+空闲CPU
    • 用户CPU:所有应用程序运行时消耗的CPU
    • 系统CPU:操作系统运行消耗的CPU
  • CPU使用率分为用户态、系统态和空闲态

    • 用户态:表示cpu处于应用程序执行的时间
    • 系统态:表示系统内核执行的时间
    • 空闲态:表示空闲系统进程执行的时间
  • 查看CPU使用率的命令:top
    在这里插入图片描述

  • 测试关注点:

    • 当CPU使用率高时,确定是用户CPU高,还是系统CPU高
    • 如果是用户CPU高,说明某个软件程序的CPU资源占用率高,需要定位代码程序运行的效率
    • 如果是系统CPU高,同步观察是否是其他资源(磁盘IO、内存、网络等)不足
  • 内存和虚拟内存

    内存和虚拟内存

  • 内存:又称主存储器/物理内存,计算机中所有程序的运行都在内存中进行

  • 虚拟内存:是计算机系统内存管理的一种技术,当计算器内存不足时,可以使用虚拟内存进行补偿。

    • 在程序运行时,可以将程序的一部分装入内存,而将其余部分留在外存(磁盘),就可以启动程序来执行。
    • 在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。
    • 同时,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息
    • 这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟内存。
  • 命令:

    • 查看总量:top
    • 查看虚拟内存的使用量:vmstat
      在这里插入图片描述
  • 测试关注点:

    • 实际内存:查看内存使用百分比,检查是否超过80%
    • 虚拟内存:查看swap的si和so是否为0,如果不为0,说明内存可能不足。
  • 磁盘IO

    磁盘IO

磁盘IO瓶颈:影响性能的时磁盘的读写速度(Input和Output速率),不是磁盘大小。

查看磁盘IO使用的命令:iostat -x 1 1
第一个1表示1s取一次数据,第二个1表示取1次数据
在这里插入图片描述

  • %iowait:CPU等待输入输出完成时间的百分比
  • %util:表示一秒钟有百分之多少的时间用于I/O

测试关注点:

  • 如果%iowait高,说明磁盘IO传输数据的任务很多,在等待,说明磁盘传输速度不足,存在瓶颈
  • 如果%util高,说明磁盘长时间占用CPU在发送数据,说明磁盘传输速度不足,存在瓶颈。
  • 网络

    网络

网络瓶颈:影响性能的是网络的传输速度,与网络的总带宽进行对比,接近总带宽,说明网络存在瓶颈。

查看网络使用的命令:sar -n DEV 1 2
在这里插入图片描述
rxkB/s:每秒接收的数据量(千字)
txkB/s:每秒发送的数据量(千字)
测试关注点:

  • 实际统计的发送速率和接收速率,与网络的总带宽进行对比,查看使用的百分比(如果无限接近100%,说明存在网络性能瓶颈)

  • 补充介绍:

    • 宽带:用户(业务)维度来描述网络速率的方式。例如20M宽带、100M宽带、1000M宽带 速率单位:b(bit)/s
    • 带宽:数据在网络中传输的速率,在技术中都是通过带宽来描述速率。 速率单位:B(Byte)/s 1B = 8bit
    • 实际情况:1000M宽带——对应着的宽带速率为1000/8=125M
  • 数据库监控

    数据库监控

数据库瓶颈分析——慢查询

1、慢查询:

慢查询

概念:找出查询速度慢的sql语句

  • 慢:查询时间超过设置的阈值

慢查询的相关参数:
在这里插入图片描述

  • slow_query_long:慢查询开关

  • slow_query_long_file:慢查询日志存放位置

  • slow_query_time:慢查询时间阈值
    在这里插入图片描述
    修改完重新新建查询在这里插入图片描述

  • 查询慢查询的相关参数:show avriables like “”

  • 设置慢查询的相关参数:set global 参数名=值

  • 设置完成,并运行脚本抓取到慢查询的日志信息为:
    在这里插入图片描述

测试关注点:

  • 基于当前记录下来的慢查询sql进行进一步的分析,判断是否存在问题,需要修改。

2、数据库连接池

数据库连接池

  • 数据库连接池:事先建立好连接,当程序请求sql执行时,直接分配空闲连接,使用完成后释放连接。节省了SQL语句执行前后连接的建立和关闭的时间。

  • 作用:可以提高对数据库操作的性能

  • 工作原理:
    在这里插入图片描述

  • 查看方法:

    • 最大连接数:show variable like “max_connections”
    • 当前使用的连接数:show status like “threads_connected”
      在这里插入图片描述
  • 测试关注点:

    • 关注:利用率=当前使用的连接数/最大连接数,建议:85%左右 ;
    • 如果利用率超过85%,连接池可能会被占满
    • 如果利用率过低,说明资源存在浪费,可能会影响其他性能指标。

3、mysql锁

数据库死锁

数据库瓶颈分析——数据库死锁

锁的介绍:

  • 一个用户修改数据时,对该数据进行加锁操作,其他用户不能进行修改。
  • 只有当第一个用户修改完成后,其他用户才能修改

MySQL主要有两种锁:表级、行级。

  • 表级锁:开销小,加锁快;不会出现死锁,锁定粒度最大,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁,锁定粒度最小,并发度也最高。

死锁:

  • 两个进程同时使用资源时,出现的相互争抢的现象
  • 死锁后需要等待很长的时间,要么有程序校验机制来释放,要么手动释放。

数据库中锁的介绍:
在这里插入图片描述
测试关注点:

  • show open tables where in_user>=1:查看当前正在使用的表(可能是锁定的表)
  • show pricesslist:查看执行时间长的线程,找到对应的sql
    在这里插入图片描述
  • Java应用瓶颈分析—JVM内存

    JVM内存

JVM(JAVA Virtual Machine)JAVA虚拟机管理JAVA程序运行时,所管理的内存

  • 堆内存:存储动态数据,创建对象时申请的空间。给程序员使用
  • 非堆内存:存储静态数据。共JVM运行使用。
    在这里插入图片描述
    在这里插入图片描述
  • JAVA应用:

JVM监控—Jvisualcm.exe
@TOC

1、在java程序启动时,添加启动参数
在这里插入图片描述
2、进入jdk的bin目录下,选择“exeisualvm.exe”
在这里插入图片描述
3、点击远程,右键选择“添加远程主机”,并设置服务器IP
在这里插入图片描述
4、点击主机IP,右键点击“添加JMX连接”,并设置JVM监控的端口
在这里插入图片描述
5、点击IP+Port,右边选择“监视”,可以查看JVM内存的实际使用情况
在这里插入图片描述

  • 压测机:

    压测机

  • 压测机影响性能测试结果的原因主要是:

    • Jmeter单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会导致TPS压不上去
  • 监控的方法:

    • windows压测机——任务管理器
    • linux压测机——PerFMon 或者top命令
  • 解决方法:

    • 添加资源 添加多台压测机,进行分布式测试
  • 性能测试报告

    性能测试报告

在这里插入图片描述

  • 性能调优案例

    性能调优案例

案例1——获取首页数据(CPU高)

  • 场景描述:进入首页后,加载首页的相关数据,包括:轮播图、频道、优惠券、团购专区品牌商直供、新品首发、热卖商品、专题精选等数据。

  • 测试结果数据:
    在这里插入图片描述

  • 分析过程:

    • 每发送一个HTTP请求,需要查询27个SQL语句,当TPS为100时,每秒要处理2700个SQL语句
  • 解决方案:

    • 增加CPU
    • 通过分批次、异步加载的方式,第一次进入首页时只加载第一屏的内容,下拉时再加载后续的数据

案例2——查看商品详情(网络)

  • 场景描述:
    进入商品详情页面时,加载商品的详细信息
  • 测试结果数据:
    在这里插入图片描述
  • 原因:
    已使用的网络带宽已接近于总带宽
  • 解决方案:
    • 增加网络带宽
    • 减少进入商品详情页时的数据请求量

案例3——搜索商品(慢查询)

  • 场景描述:
    进入首页,在搜索框中输入关键字搜索商品

  • 测试结果数据:

    • 搜索关键字“床”时,出现慢查询SQL语句
    • 查看慢查询语句cat/var/lib/mysql/localhost-slow.log,包含如下SQL语句:
      在这里插入图片描述
  • 分析步骤:

    • 当搜索关键字匹配到大量的商品时,第3条SQL语句会返回大量重复数据
    • 第4条SQL语句中的in查询条件中同样包含大量重复的商品分类id
    • 因此:第4条SQL会出现查询时间较长,是由于第3条SQL返回的ID有大量重复
  • 本案例解决方案:
    在这里插入图片描述

案例4——JVM内存溢出

  • 场景描述:
    请求测试接口(wx/index/oom),模拟内存溢出
  • 测试结果数据:
    在这里插入图片描述
  • 解决方案:
    开发定位出泄露的点,修改代码。

相关文章:

性能测试分析和调优

步骤 性能调优的步骤 性能调优的步骤: 1.确定问题:根据性能测试的结果来分析确定bug。–测试人员职责 2.分析原因:分析问题产生的原因。----开发人员职责 3.给出解决方案:可以是修改软件配置、增加硬件资源配置、修改代码等----…...

(视频教程)Compass代谢分析详细流程及python版-R语言版下游分析和可视化

不想做太多的前情解说了,有点累了,做了很久的内容,包括整个分析,从软件安装和报错解决到后期下游python版-R语言版下游分析和可视化!单细胞代谢分析我们写过很多了,唯独少了最“高级”的compass&#xff0c…...

【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串

MySQL中的字符串处理函数:concat 函数 一、concat ()函数 1.1、基本语法1.2、示例1.3、特殊用途 二、COALESCE()函数 2.1、基本语法2.2、示例2.3、用途 三、进阶练习 3.1 条件和 SQL 语句3.2、解释 一、concat &…...

c++中深拷贝和浅拷贝的联系和区别

在 C 编程里,深拷贝和浅拷贝是两种不同的对象复制方式,它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。 1. 基本概念 浅拷贝:浅拷贝仅仅复制对象的成员变量值。对于基本数据类型(如 int、d…...

Autotestplat 在多个平台和公司推荐使用!

1、 51Testing软件测试网 开源好用!推荐一款更轻量化的自动化测试平台! 2、程序员杨叔 从繁琐到简单!Autotestplat自动化测试平台搭建使用 3、一飞开源 [开源]一站式自动化测试平台及解决方案,支持接口、性能、UI测试 4、github h…...

字符串最后一个单词的长度

一&#xff1a;题目 二&#xff1a;思路 用rfind()函数倒着找第一个空格&#xff0c;返回的值为pos&#xff0c;然后打印size()-(pos1)&#xff0c;posnpos就代表只有一个单词&#xff0c;则直接返回size #include <iostream> using namespace std; int main() {strin…...

【Linux】learning notes(3)make、copy、move、remove

文章目录 1、mkdir &#xff08;make directory&#xff09;2、rmdir &#xff08;remove directory&#xff09;3、rm&#xff08;remove&#xff09;4、>5、touch 新建文件6、mv&#xff08;move&#xff09;7、cp&#xff08;copy&#xff09; 1、mkdir &#xff08;make…...

一、图像图像的基本概念

文章目录 一、分辨率概念二、图形图像的区别三、位图和矢量图的区别 一、分辨率概念 图形显示计数中的分辨率概念有三种&#xff0c;即屏幕分辨率、显示分辨率和显卡分辨率。它们既有区别又有着密切的联系&#xff0c;对图形显示的处理有极大的影响。 1.屏幕分辨率 显示器分辨…...

两道算法练习

力扣322零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的…...

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---&#xff08;某电商网站爬取&#xff09;4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代&#xff0c;数据作为核心资源蕴含重要价值&#xff0c;网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…...

设计模式--spring中用到的设计模式

一、单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点 Spring中的应用&#xff1a;Spring默认将Bean配置为单例模式 案例&#xff1a; Component public class MySingletonBean {// Spring 默认将其…...

Qt控件中函数指针使用的最终版本,使用std::function

代码&#xff1a; class MyWidget : public QWidget { public:std::function<void(QResizeEvent* event)> pf_resizeEvent 0; protected:inline void resizeEvent(QResizeEvent* event) override {if (pf_resizeEvent ! 0)pf_resizeEvent(event);} };int main(int arg…...

Java中的泛型类 --为集合的学习做准备

学习目标 ● 掌握在集合中正确使用泛型 ● 了解泛型类、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用场景 1.有关泛型 1.1泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的参数化类型机制&#xff0c;允许在定义类、接口或方法时使用类型参数&a…...

6.6.6 嵌入式SQL

文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是&#xff1a;如何识别嵌入语句&#xff1f;如何让主语言&#xff08;比如C,C语言&#xff09;和SQL通信&#xff1f; 识别SQL语句 为了识别主语言中嵌入的SQL…...

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...

【Qt】MVC设计模式

目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层&#xff0c;关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…...

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…...

JAVA面试常见题_基础部分_Dubbo面试题(上)

Dubbo 支持哪些协议&#xff0c;每种协议的应用场景&#xff0c;优缺点&#xff1f; • dubbo&#xff1a; 单一长连接和 NIO 异步通讯&#xff0c;适合大并发小数据量的服务调用&#xff0c;以及消费者远大于提供者。传输协议 TCP&#xff0c;异步&#xff0c;Hessian 序列化…...

CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法

个人博客&#xff1a;haichenyi.com。感谢关注 1. 目录 1–目录2–display:none3–visibility: hidden4–opacity: 05–position: absolute;与 left: -9999px;6–z-index 和 position7–clip-path: circle(0%) 2. display:none 标签会挂载在html中&#xff0c;但是不会在页面上…...

二、双指针——5. 移动零

二、双指针——5. 移动零 题目描述示例示例1&#xff1a;示例2&#xff1a; 思路代码 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...