1、性能分析准备前端
一、明确系统的整体架构,明确压力方向,好比哪个接口或者哪个模块调用频率最高;面临高并发挑战;java
二、构建测试环境测试性能,好比loadrunner性能测试等;mysql
三、了解系统的响应速度、吞吐量、TPS、QPS等指标需求,好比秒杀系统对响应速度和QPS的要求是很是高的。ios
2、分析思路:sql
自下而上:数据库
一、先检查java相关日志是否有明显错误;缓存
二、检查CPU、内存、IO等系统级各个性能使用状况,是否被某些进程大量占用等;性能优化
三、若是是分布式,不少公司会实现更加系统的日志、性能等监控系统,好比经过JFR(java flight recorder)或JMC(java Mission Control)等生成日志文件进行异常诊断;服务器
四、检查数据库服务器各项指标:系统级(CPU、内存、IO)、链接数、锁网络
五、监控java服务自身,看是否有恶劣的FULL GC状况或者Miror GC在变长;利用jstat工具统计信息,利用jstack检查是否有死锁进程;
自上而下
一、从应用的顶层,定位到具体模块,再到具体功能点,再定位到具体服务;
3、各项指标工具
CPU :
1.命令top
load average的三个值(分别是 1 分钟、5 分钟、15 分钟),数值若是远远大于1,说明CPU出现运行瓶颈;说明某个线程在高速占用CPU运行中;
2.经过vmstat
命令:vmstat 1 10 (每秒输出一个,总共输出10个)
若是每秒上下文(cs,context switch)切换很高,而且比系统中断高不少(in,system interrupt),就代表颇有多是由于不合理的多线程调度所致使;
内存:
命令:free -h
查看内存使用状况,进一步判断 swap 使用状况,JVM 是不但愿发生大量的 swap 使用的;
IO:
命令:iostat
利用 iostat 等命令有助于判断磁盘的健康情况
JVM 层面
利用 JMC、JConsole 等工具进行运行时监控。
利用各类工具,在运行时进行堆转储分析,或者获取各类角度的统计数据(如 jstat -gcutil 分析 GC、内存分带等)。
GC 日志等手段,诊断 Full GC、Minor GC,或者引用堆积等
4、性能优化考虑点
(1)前端
gzip压缩、动静分离
(2)后台应用
采用分布式系统开发,以模块划分部署,针对性分配CPU、内存、IO、网络等;
将访问频繁基础数据存储至Redis缓存中;
将变化小,运算复杂计算数据直接存储至内存中;直接在内存中进行处理;
尽可能减小对数据库的操做,好比查询多对多数据,要避免for循环中查询详情;
将文件系统和应用系统分离,能够采用第三方阿里OSS文件服务器系统;
(3)数据库层面
a、SQL级:优化SQL查询语句,减小查询时间;
b、表级:增长索引、优化表结构,根据地区时间分区表数据;
c、库级:采用读写分离;配置主从数据库;
d、系统级:优化mysql配置文件;
e、避免查询中在查询中让MYSQL自动类型转换,转换过程会使索引失效;
f. 尽可能想办法使用临时表扫描替代全表扫描;
g. 抛弃in和not in语句,使用exists和not exists替代;
h. 和客户确认,模糊查询是否有必要,如没有必要,去掉like语句;
i. 注意创建适当的,符合场景的索引;
j. 踩死 "*" 号;
k. 避免在where条件中对字段进行函数操做;
l. 对实时性要求不高的报表,容许脏读(with(nolock))。