性能调优
性能调优的步骤
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 自带的监控工具:
监控成功:
压测机瓶颈分析
性能调优案例
性能测试报告
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/16205304.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!