性能分析调优
00_总论
性能调优的常规手段
-
空间换时间
-
时间换空间
-
分而治之
-
异步处理
-
并行
-
离用户更近一点
-
一切可拓展,业务模块化,服务化,良好的水平扩展能力
01_性能分析方法
可以抽象为两大类
-
自底向上: 通过监控硬件即操作系统性能指标来分析性能问题
-
自顶向下: 通过生成负载来观察被测试的系统性能
02_单机性能分析与调优
021_性能分析流程
需要关注的指标
层级 | 被观测对象 | 观测指标 |
---|---|---|
客户端或者生成负载的机器 | RT(响应时间) | 不同业务的响应时间 |
统一业务在不同时间点的响应时间 | ||
不同配置下的响应时间 | ||
TPS(每秒完成的事务数) | ||
CPU | CPU利用率,CPU负载 | |
Mem | 可用物理内存,虚拟内存使用率,缓存使用量 | |
Disks | Disk Time, IO等待 | |
Network | 宽带使用率,任务队列长度 | |
Web服务器 | Tcp Connections(tcp连接数) | 可用netstat观察, grafana中查看"Network Netstat"=>"Tcp Connections" |
Thread Pool(中间件简历的线程池) | 监控线程状态 | |
JVM | GC情况,Heap使用情况,使用jmx_exporter监控后,可使用grafana监控 | |
Load Average | CPU负载队列长度 | |
应用服务器 | DB Connections | 中间件与数据库之间建立的连接数及连接状态 |
数据库 | DB Time | 消耗在数据库上的CPU时间 |
Top SQL | 按内存由多到少排序SQL,按CPU从多到少排序SQL | |
PGA, SGA | 其内存使用情况 |
性能分析流程
序号 | 步骤名称 | 说明 |
---|---|---|
1 | 检查RT | 模拟用户发起负载后,采用自顶向下的方式是偶先分析RT(响应时间) |
2 | 检查TPS | TPS大时RT小,说明性能良好 |
3 | 检查负载机资源消耗 | 检查CPU使用率,CPU负载,确认是用户CPU高,还是系统CPU高 |
4 | 前提: 确认测试脚本没有性能问题,不会造成统计结果的不准确 | |
5 | 检查内存使用情况,确认内存泄露风险,不会造成结果统计的不准确 | |
6 | 判断负载机是否有性能问题 | 排除负载机的问题,确保测试结果可参考 |
7 | Tips: 负载机的CPU不过高,内存不过高,并且负载机和被测对象的带宽是否足够,比如局域网下测试 | |
8 | 检查WEb服务器的资源消耗 | 检查CPU使用率,确认用户CPU与系统CPU占用情况 |
9 | 检查内存使用请看 | |
10 | 检查磁盘使用情况 | |
11 | 检查占用的带宽 | |
12 | 分析Web页面响应的时间组成,确认是什么影响了性能 | |
13 | Tips: Litemall单机环境系统CPU使用在10%以下 | |
14 | Tips: Litemall单机环境(4U8G),CPU在75%时候,需要50M带宽 | |
15 | 检查是否Web服务器瓶颈 | 判断是否web服务器硬件性能瓶颈 |
16 | Tips: 瓶颈总会到达的,主要看,有没有那个指标增长变化的太快,比预期中提前到达瓶颈 | |
17 | 检查中间件配置 | 确认是都是此配置问题 |
18 | 检查App服务器资源消耗 | 关注CPU,内存,磁盘,IO,判断是否是App服务器硬件性能瓶颈 |
19 | Tips: 有时候web服务器和引用服务器会分离部署 | |
20 | 数据库服务器资源消耗分析 | CPU消耗,CPU负载 |
21 | 内存消耗 | |
22 | IO繁忙程度 | |
23 | 数据库监控 | |
24 | 是否是DB的性能问题 | 由监控结果来判断是否是DB性能问题 |
25 | 是否SQL问题 | 定位最不合理的SQL占比 |
26 | 索引是否正常引用 | |
27 | 检查共享SQL是否合理范围 | |
28 | 检查解析ER结构是否合理 | |
29 | 检查数据热点问题 | |
30 | 检查数据分布是否合理 | |
31 | 检查碎片整理等等 | |
32 | 其他 | 比如网络阻塞,磁盘IO瓶颈,热点等等 |
主要涉及的知识
-
硬件知识(CPU, MEM, Disk, Net)
-
系统知识(Linux,Windows)
-
中间件知识(JVM, Tomcat, Jboss, Weblogic, WebSphere等)
-
数据库知识(Mysql, SQLserver, Oracle, DB2, Sysbase)
-
网络知识(截包分析)
-
程序知识
-
架构知识
022_系统性能关注点
序号 | 关注点 | 具体 | 原因分析 |
---|---|---|---|
1 | System Resource(系统资源) | CPU利用率过高 | 计算量大 (运算,连接查询, 数据统计) |
2 | 非空闲等待 (IO等待,资源争用) | ||
3 | 过多的系统调用 (比如频繁写日志) | ||
4 | 过多的中断 (外部设备中断等) | ||
5 | 内存吃紧 | 过多的页交换和内存泄露 | JVM内存设置过小 |
6 | 磁盘繁忙 | 硬盘IO速度低(极少情况) | |
7 | 硬盘老化,或者碎片过多等 | 较难优化,只能在设计的时候考虑 | |
8 | 网络流量过大 | 高并发系统 | 并发用户多, |
9 | 所处环境宽小 | 非局域网情况下,或者环境在公有云上等 | |
10 | 带宽被抢占 | 该环境写有网络控制策略等 | |
11 | OS | 系统负载 | |
12 | 系统连接数的控制 | ||
13 | 缓存 | 内存不够时还会有虚拟内存机制 | |
14 | DB(数据库) | OLTP(联机事务处理系统) | 慢查询 |
15 | 大事务 | ||
16 | 死锁 | ||
17 | DB Time | ||
18 | 磁盘IO等待时间 | ||
19 | 处理方法1:优化业务过程,尽量减少数据请求,不管读写 | ||
20 | 处理方法2: 优化SQL语句提高效率 | ||
21 | OLAP(联机分析处理) | 处理方法1: 预处理, 比如物理化, 多维数据 | |
22 | 处理方法2: 分而治之,比如并行查询 | ||
23 | 处理方法3: 优化语句提高效率 | ||
24 | Middleware(中间件) | JVM | JVM对内存使用情况,GC频率,线程状态 |
25 | Thread pool | 需要监控,如果使用率达到阈值则需要增加线程池容量 | |
26 | DB Connections Pool | 需要监控,如果使用率达到阈值则需要增加容量 | |
27 | Appserver | ||
28 | Webserver | 页面size | 动态数据, CSS, JS, 图片等的大小 |
29 | 隐藏的,无用的数据传输 | ||
30 | 优化方法1: 页面静态化 | ||
31 | 优化方法2: 减小页面Size,图片更小,CSS合并,JS精简, | ||
32 | 优化方法3: 砍掉无用请求,无用数据传输, | ||
33 | 优化方法4: 对数据做异步处理 | ||
34 | 优化方法5: DNS和CDN加速,让响应数据离用户更近 |
023_程序优化
策略 | 方向 | 具体 |
---|---|---|
系统框架选择 | ||
程序优化 | 表单压缩 | |
局部刷新 | ||
仅取所需 | ||
逻辑亲戚 | ||
谨慎继承 | ||
程序算法优化 | ||
批处理 | 对于大批量的数据,最好能够醉成批处理,不会因为单次操作而影响系统的正常操作 比如对数据的传输,通过打包定时的方式去传输 | |
延迟处理 | 对于大对象的展示采用延迟加载的方式,层层递进的显示 明细 | |
防止内存泄露 | 对于生命周期长的对象风险较大, 引入的第三方软件也需要单独测试,session需要做过期处理 | |
减少大对象引用 | 需要控制大对象的使用,避免资源浪费 | |
防止争用死锁 | ||
索引 | 编写合理的SQL,尽量使用索引 | |
存储过程 | 分布式数据库不推荐使用,存储过程即在存储过程中就尽量做一部分运算 | |
内存分配 | 合理分配PGA和SGA(oracle数据库) | |
并行 | ||
异步 | ||
使用好的设计模式来优化程序 | ||
选择合适的IO模式 | 比如NIO, AIO等 |
024_配置优化
策略 | 方向 | 具体 |
---|---|---|
连接池的配置参数 | Spring+Hibernate+C3P0来配置 | |
连接池配置多少连接合适 | 没有精确的计算公式,通过测试来估算,再根据实际业务增长来进行放大 | |
监控连接池 | 数据库连接池监控,可以用prometheus+grafana技术栈来监控 |
026_线程优化
策略 | 方向 | 具体 |
---|---|---|
线程池优化 | 增加线程池 | |
CPU处理能力 | 综合分析CPU的处理能力,再去配置 | 比如CPU一个核心每秒能够处理10个任务,name一个核心的CPU每秒理论上能处理40个任务, 在同一时刻CPU最多只能处理4个任务,所以理论上线程池配置4个连接 但实际上,服务器的追加线程数量=((线程等待时间+线程CPU时间)/线程CPU时间) * CPU数量 |
内存容量 | JVM内存 | |
系统线程数限制 | ||
DB优化 | 优化物理结构 | |
共享SQL,绑定变量,降低高水位 | ||
查询器优化 | ||
单条SQL优化 | ||
并行SQL | ||
减少资源争用 | ||
优化内存 | ||
优化IO | 进行条带化,读写分离,减少热点 |
03_业务流程优化
不建议,因为风险较大,一般在设计开发阶段去考虑
04_结构优化
041_单机结构
042_集群结构
043_分布式结构
-
DNS&CDN静态加速
-
负载均衡器
-
Web服务分布式集群
-
App服务分布式集群
-
分布式缓存
-
分布式数据库