性能调优的步骤
- 确定问题:根据性能监控的数据和性能分析的结果,确定性能存在的问题(要求)
- 确定原因:确定了问题之后,对问题进行分析,找出问题产生的原因
- 给出解决方案:确定调整目标和解决方案(改服务器参数配置/增加硬件资源配置/修改代码)
- 验证问题:按照给出的解决方案,重新进行测试
- 分析调优结果:分析出问题的性能指标是否有提升,关注其他指标未下降
注意:性能测试调优并不是一次完成的过程,针对同一个性能问题,上面的五步可能要经过多次循环才
能最终完成性能调优的目标(即:测试发现问题-找原因-调整-验证-分析-再测试。。。)
性能瓶颈分析
1.服务器资源分析
查看CPU状态:top
查看内存状态:vmstat
实际内存:查看内存使⽤百分⽐,检查是否超过80%
虚拟内存:查看swap的si和so是否为0,如果不为0,说明内存可能不⾜
查看磁盘IO状态:iostat -x 1 1
关注是磁盘读⼊和写出的速度,不是磁盘⼤⼩。
%util⾼,说明磁盘⻓时间占⽤CPU在发送数据,说明磁盘传输速度不⾜,存在瓶颈
%iowait⾼,说明磁盘IO传输数据的任务很多,在等待,说明磁盘传输速度不⾜,存在瓶颈
查看网络状态:sar -n DEV 1 2
2.数据库分析
慢查询:
找出查询速度慢的sql语句,慢:查询时间超过设置的阈值
数据库连接池:
查看方法:
- 最大连接数:show variables like “max_connections”
- 当前使用的连接数:show status like “threads_connected”
测试点关注点:
- 关注:利用率 = 当前使用的连接数/最大连接数 ,建议:85%左右
- 如果利用率超过85%,连接池可能会被占满
- 如果利用率过低,说明资源存在浪费,可能会影响其他性能指标
mysql锁:
3.JVM瓶颈分析
4.压测机瓶颈分析
性能调优案例
案例1 – 获取首页数据
问题分析:
1.CPU已接近100%
2.一次请求中需要查询很多数据
解决方案:
Ø提升服务器配置
Ø分批次、异步加载首页数据,首页底部的数据(如:新品首发、热卖商品、专题精选等数据)等用户向下滑动页面时再加载
案例2 – 查看商品详情
场景描述:
Ø进入商品详情页面时,加载商品的详细信息
问题分析:
1.网络带宽已跑满
2.一次请求中返回了全部数据
解决方案:
Ø提升服务器网络带宽
Ø分批次、异步加载商品数据
案例3 – 搜索商品
场景描述:
Ø进入首页,在搜索框中输入关键字搜索商品
测试结果数据:
Ø搜索关键字“床”时,出现慢查询SQL语句
Ø查看慢查询语句cat /var/lib/mysql/localhost-slow.log,包含如下SQL语句
问题分析:
1.找出搜索商品接口对应的SQL语句(通过查看代码实现或者从日志中获取查询SQL)。
2. 分析具体的SQL语句
3.定位问题
Ø当搜索关键字匹配到大量的商品时,第3条SQL语句会返回大量重复数据
Ø 第4条SQL语句中的in查询条件中同样包含大量重复的商品分类id
Ø因此:第4条SQL会出现查询时间较长,是由于第3条SQL返回的ID有大量重复
解决方案:
Ø优化第3条SQL语句,因该SQL语句的查询结果大部分都是重复的,可以进行去重处理
案例4 – JVM内存溢出
场景描述:
Ø请求测试接口(/wx/index/oom),模拟内存溢出
问题分析:
1.JVM内存占用随着时间的推移占用越来越多,直至内存溢出,系统退出
解决方案:
Ø排查代码存在的问题,及时释放无用的对象