性能优化核心思想

[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/idea/performance-optimization-core-ideas.html

性能优化核心思想

1. 网络传输上

  1. 选择合适的传输协议,如Http->dubbo,以二进制传输+长连接请求
  2. 开启序列化、压缩等,对于大数据量的传输可能有特别大的提升
  3. 对于重复请求同一个url的连接池,使用长连接
  4. 对于不需立即响应的,使用异步请求
  5. 对即时聊天等双向实时性要求高的,使用webSocket全双工等

2. JVM

  1. 选择合适的GC算法,如CMS、Parallel、G1等

CMS(JDK<1.9)关注低停顿,Parallel关注吞吐量,G1通过较精准把控停顿时间,也可以说是关注整体吞吐量和延迟吧,当前市场上主要用于大内存场景

  1. 选择合适的GC参数,如堆内存大小、新生代大小、老年代大小、GC线程数、GC触发条件等

这个属于调优方面的了,需要结合jstat命令与gc detail或者监控工具等配置;

3. 系统架构上的优化(核心)

  1. 合理模块依赖关系,减少不必要的依赖,减少不必要的调用
  2. 异步处理

比如,一个请求以前需要123456步完成,但是通过业务梳理,发现只有123步需要当时完成,第4步是更新汇总表,第5步是写日志,第6步是通知外围系统,456步都可以异步完成,这样一次业务操作只需要完成123步,大大提升性能

  1. 并行处理

没有先后依赖关系的 启动多线程处理,但是如果是CPU密集型的任务,一般不要启动太多线程,因为线程切换成本可能会超过性能提升(每个请求过来都开启多线程竞争CPU计算资源没啥意义)

  1. 缓存(需要关注刷新实现)
  • 客户端缓存
  • CDN缓存
  • 本地缓存
  • 分布式缓存(Redis)
  1. 池化

创建成本高的、可重复利用的,都可以采用预先创建的方式创建资源

  • 连接池
  • 线程池
  • 对象池

4. 数据库层面

  1. 选择合适的数据库

关系型一般采用Mysql没话说
非关系型,根据业务场景选择,如Redis、MongoDB、HBase等,在超高并发查询的场景下可能还需要结合ES+Hbase的形式

  1. 选择合适的数据库引擎

Mysql一般采用InnoDB引擎,如果是只读的,可以考虑MyISAM引擎,因为MyISAM引擎不支持事务,但是读性能比InnoDB高不少

  1. 读写分离

读写分离,一般是主从复制,主库写,从库读,但是从库读到的数据可能不是最新的,因为主从复制有延迟,一般是毫秒级别的,但是对于一些对数据一致性要求不高的场景,可以采用读写分离,提升读性能
这里对于读写分离的读写延迟问题,有很多处理方式,处理通过小事务、5.7以上的mysql并行同步,配置mysql同步时效等减少延迟、只读主等处理

但是实际业务场景上,对外的读取,对实时性要求其实没那么地高,一般都是对内的读取(如需要查询最新数据做更新),对实时性要求高的,这时候才需要真正的去面对、解决主从延迟问题。
对于这种系统内部的延迟问题,一般都是通过缓存来处理,便可解决

  1. 分库分表

分库分表,一般是为了解决单库单表数据量过大的问题,导致查询性能下降,一般是通过分库分表,将数据分散到多个库、多个表中,提升查询性能

  1. 索引
  2. SQL优化
作者

神奇宝贝大师

发布于

2023-04-18

更新于

2023-06-12

许可协议

评论