性能优化核心思想
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/idea/performance-optimization-core-ideas.html
性能优化核心思想
1. 网络传输上
- 选择合适的传输协议,如Http->dubbo,以二进制传输+长连接请求
- 开启序列化、压缩等,对于大数据量的传输可能有特别大的提升
- 对于重复请求同一个url的连接池,使用长连接
- 对于不需立即响应的,使用异步请求
- 对即时聊天等双向实时性要求高的,使用webSocket全双工等
2. JVM
- 选择合适的GC算法,如CMS、Parallel、G1等
CMS(JDK<1.9)关注低停顿,Parallel关注吞吐量,G1通过较精准把控停顿时间,也可以说是关注整体吞吐量和延迟吧,当前市场上主要用于大内存场景
- 选择合适的GC参数,如堆内存大小、新生代大小、老年代大小、GC线程数、GC触发条件等
这个属于调优方面的了,需要结合jstat命令与gc detail或者监控工具等配置;
3. 系统架构上的优化(核心)
- 合理模块依赖关系,减少不必要的依赖,减少不必要的调用
- 异步处理
比如,一个请求以前需要123456步完成,但是通过业务梳理,发现只有123步需要当时完成,第4步是更新汇总表,第5步是写日志,第6步是通知外围系统,456步都可以异步完成,这样一次业务操作只需要完成123步,大大提升性能
- 并行处理
没有先后依赖关系的 启动多线程处理,但是如果是CPU密集型的任务,一般不要启动太多线程,因为线程切换成本可能会超过性能提升(每个请求过来都开启多线程竞争CPU计算资源没啥意义)
- 缓存(需要关注刷新实现)
- 客户端缓存
- CDN缓存
- 本地缓存
- 分布式缓存(Redis)
- 池化
创建成本高的、可重复利用的,都可以采用预先创建的方式创建资源
- 连接池
- 线程池
- 对象池
4. 数据库层面
- 选择合适的数据库
关系型一般采用Mysql没话说
非关系型,根据业务场景选择,如Redis、MongoDB、HBase等,在超高并发查询的场景下可能还需要结合ES+Hbase的形式
- 选择合适的数据库引擎
Mysql一般采用InnoDB引擎,如果是只读的,可以考虑MyISAM引擎,因为MyISAM引擎不支持事务,但是读性能比InnoDB高不少
- 读写分离
读写分离,一般是主从复制,主库写,从库读,但是从库读到的数据可能不是最新的,因为主从复制有延迟,一般是毫秒级别的,但是对于一些对数据一致性要求不高的场景,可以采用读写分离,提升读性能
这里对于读写分离的读写延迟问题,有很多处理方式,处理通过小事务、5.7以上的mysql并行同步,配置mysql同步时效等减少延迟、只读主等处理
但是实际业务场景上,对外的读取,对实时性要求其实没那么地高,一般都是对内的读取(如需要查询最新数据做更新),对实时性要求高的,这时候才需要真正的去面对、解决主从延迟问题。
对于这种系统内部的延迟问题,一般都是通过缓存来处理,便可解决
- 分库分表
分库分表,一般是为了解决单库单表数据量过大的问题,导致查询性能下降,一般是通过分库分表,将数据分散到多个库、多个表中,提升查询性能
- 索引
- SQL优化