性能调优

性能调优的步骤

1.确定问题: 根据性能监控的数据和性能分析的结果,确定性能存在的问题
2.确定原因: 确定了问题之后,对问题进行分析,找出问题产生的原因
3.给出解决方案:确定调整目标和解决方案(改服务器参数配置/增加硬件资源配置/修改代码)
4. 验证问题: 按照给出的解决方案,重新进行测试
5.分析调优结果: 分析出问题的性能指标是否有提升,关注其他指标未下降

注意:性能调优并不是一次完成的过程,针对同一个性能问题,上面的五步可能要经过多次循环才能最终完成性能调优的目标(即:测试发现问题 - 找原因 - 调整 - 验证 - 分析 - 再测试)

常见的性能瓶颈分析:

  • 服务器资源分析
    • CPU瓶颈:CPU 已压满(接近100%),通常其他指标的拐点出现的时刻是否与CPU压满的时刻基本一致
    • 内部瓶颈: 内存不足时,操作系统会使用虚拟内存,从虚拟内存读取数据,影响处理速度
    • 磁盘I/O瓶颈:磁盘I/O成瓶颈时,会出现磁盘I/O繁忙,导致交易执行时在I/O处等待
    • 网络带宽:如果传递的数据包过大,超过了带宽的传输能力,就会造成网络资源竞争,导致TPS上不去
  • JVM瓶颈分析:内存申请没有及时释放,造成内存泄漏
  • 数据库瓶颈分析
    • 慢查询
    • 数据库的连接池:设置太小,导致数据库连接出现排队
    • 数据库出现死锁
  • 程序内部实现机制
  • 压测机: JMeter单机负载能力有限,如果需要模拟的用户请求数超过其负载极限,也会导致TPS压不上去

服务器资源分析 - CPU

每个程序运行都需要占用CPU,那么单CPU的机器时如何同时运行多个程序的?

  • 时间片即CPU分配个各个程序的时间,每个程序被分配一个时间段,称作它的时间片,即该程序允许运行的时间

CPU使用率:

任务线程(也可以是进程)获得CPU时间片后,CPU开始处理任务,整个时间片的时间都由当前任务占有;这个时间片中CPU的繁忙程度就是CPU的利用率,即这个个时间中CPU到底利用多少时间。例如,当前任务处理时主动睡眠了或者需要等待另一个资源,此时CPU就空闲下来了,自然没有充分利用上当前时间片。典型的场景由I/O等待导致CPU等待,叫做CPU非空闲等待,即申请到了时间片,没有充分利用上。这种显现在监控CPU时i可以捕获,实际上是I/O的性能风险

CPU使用率可以分为用户态、系统态和空闲态

  • 用户态: 表示CPU处理应用程序执行的时间
  • 系统态: 表示系统内核执行的时间
  • 空闲态: 表示空闲系统进程执行的时间

查看CPU使用率的命令:top

  • 界面按1 可以显示每个CPU的 核数
  • top -Hp [进程] 可以查看进行中线程的情况

测试关注点:

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

服务器资源分析 - 内存和虚拟内存

内存瓶颈: 内存不足时,操作系统会使用虚拟内存,从虚拟内存读取数据;而内存的速度要远快于磁盘的速度,因此使用虚拟内存时性能大大降低。

查看内存的的命令:vmstat

  • si:每秒从交换区写到内存的大小
  • so: 每秒写入到交换区的内存大小

测试关注点:

  • 如果si,so 长期不等于0,表示内存不足。(需要大量的从内存和虚拟内存之间读来读去,说明内存盛不了那么多进程,说明内存不足)

服务器资源分析 - 磁盘I/O 瓶颈

磁盘IO瓶颈: 影响性能的是磁盘的读写速度(Input和Output速率),不是磁盘大小
查看磁盘IO使用的命令: iostat -x 1 1 ,需要安装插件:yum install sysstat

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

测试关注点:

  • 如果%util 接近100%, 说明产生的I/O请求太多,I/O系统已经满负荷
  • 如果%iowait的值过高,表示硬盘存在I/O瓶颈

服务器资源分析 - 网络瓶颈

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

查看网络使用的命令:sar -n DEV 1 2

  • rxkB/s: 每秒接收的数据量(千字节数)
  • txkB/s: 每秒发送的数据量(千字节数)

测试关注点:

  • 每秒接收的数据量rxkB/s,与网络最大带宽进行对比,如果实际传输速率接近网络最大带宽,说明网络有IO瓶颈

数据库瓶颈分析 - 慢查询

慢查询定义: 指执行速度低于设置的阈值的SQL语句

作用: 帮助定位查询速度较慢的SQL语句,方便更好的优化数据库的性能

MySQL慢查询参数介绍:

  • slow_query_log: 慢查询日志开启状态[ON:开启,OFF:关闭]
  • slow_query_log_file: 慢查询日志存放位置

  • long_query_time: 慢查询时长设置(超过该时长才会被记录,单位秒)

慢查询开启并配置:

  • set global slow_query_log = 'ON'; # 开启慢查询日志
  • set global slow_query_log_file='/log/slow_query.log'; # 设置慢查询日志存放位置
  • set global long_query_time = 1; # 设置慢查询时间标准,设置之后会在下次会话才生效

查看慢查询日志:

数据库瓶颈分析 - 数据库连接池

为什么使用数据库连接池?

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

JAVA 应用程序分析 - JVM内存

具体服务端应用程序启动程序的脚本如下:

#!/bin/sh
nohup /usr/local/jdk1.8.0_261/bin/java -server -Dfile.encoding=UTF-8 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.184.137 -Dcom.sun.manage
ment.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar /home/itheima/litemall/litemall-all-0
.1.0-exec.jar > /home/itheima/litemall/litemall.log &
echo $! > /var/run/litemall_info.pid    # $! 是应用程序启动后的PID

JDK 自带的监控工具:

监控成功:

压测机瓶颈分析

性能调优案例

性能测试报告

posted @   chuangzhou  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示