一、性能瓶颈的定位
查看操作系统负载
1、CPU (查看各性能指标命令集合-待整理)
2、IO
3、带宽
4、其他
使用Profiler测试,另外外部工具例如Java的JProfiler/TPTP/CodePro Profiler;通过日志查询
二、性能优化策略(具体case)
空间换时间
1、将远程调用改为数据初始化到heap堆中(us级),服务提供端本地查找时间、减少RPC 网络传输时间。
2、当jvm heap被缓存数据占用,则系统对象存储受限,gc频次上升。加机器
时间换空间
离线计算,数据预处理, 先算好,放起来
代码优化
1、多线程中锁优化:少用锁或不用锁;threadLocal对象
2、内存分配
)避免内存泄漏
)使用池化技术:数据库连接、线程等昂贵对象,池化处理
3、异步操作
)非核心流程异步化
算法调优
1、选择更合适的数据结构
一个司机库存排班表数据的查询(按公里距离、司机出勤等多指标展示月排班表),通过直接MySql -> hash cache -> B-Tree cache,直接查库优化为缓存读取hashmap数据,但出现并发访问问题,又优化成treeMap,并发只在父子节点处。
2、避免过多的IO开销
实时计算的case,将Rpc invoke调用改为本地存储模型、公式(缓存占用jvm内存,gc频繁)
3、分而治之和预处理
将
网络调优
1、DNS
2、池化连接:昂贵的对象,池化处理
3、序列化算法:RPC框架已经帮rd完成了这部分工作
4、合理的I/O模型:BIO NIO AIO
数据库调优
1、避免事务和锁: 大事务和锁均影响db吞吐和响应速率,带来锁等待问题
2、横向扩展、纵向扩展
3、SQL语句优化
)使用索引
)避免表连接:通过添加冗余字段,或者采用内存提前计算存储方式达成
4、搜索引擎:联合查询采用ES等搜索引擎代替结构化数据库,横向的宽表,字段无限扩充。
三、建议
掌握Profiler工具
牢记常用性能指标
了解一些算法、数据结构相关的知识
关注业内成熟的性能优化解决方案
在实践中提升自己对系统性能的理解
(本次仅提供大致思路,具体case有待二次整理)