性能优化的几个维度


性能优化有迹可循,我们可以按照不同维度进行针对性的优化,在维度划分上可以分为如下三个维度。
第一维度:应用程序层面
缓存 缓存的数据结构设计很重要,没有一种数据结构是万能的。数据结构设计得越简单、单一,缓存数据的二次运算就越多。 此外,如果缓存的数据量很大,就要增加一个缓存淘汰算法,否则会白白浪费大量内存资源。
异步 异步有两种方式:
- 线程异步。主要用于涉及到 I/O 的地方,像磁盘 I/O 和网络 I/O;
- MQ异步。适用于更大的场景,通过 MQ 进行异步可以大大提高性能。
多线程并行和分布式并行 线程不要分得太多,否则管理成本会高,分布式系统中也存在管理成本。
延后运算懒加载 这个和缓存的思路相反,它适用于一些低频、运算耗时的数据。
批量,合并,归并 如果要短时间内频繁地传递多个数据到同一个目的地,尽量打包到一起,一次性传输,特别是I/O 的场景。如果系统是一个单点系统,将数据打包传输的性价比会非常高。
应用程序层面的优化方式还有很多。比如,用长链接代替频繁打开关闭的短链接、压缩、重用等等。
第二维度:组件层面优化
组件是指那些非业务性的东西,如中间件、数据库、运行时的环境(JVM、WebServer)等。
数据库的调优可以分为:SQL 语句、索引、连接池。
运行时的环境调优时,对 JVM 的调优主要是调优 GC 相关的配置,对 WebServer 的调优主要是针对连接相关的调优。
第三维度:系统层面调优
借助系统层面的一些技术指标,来观测并判断程序是否正常。比如,CPU、线程、网络、磁盘以及内存。
CPU 方面,大多数情况下关注这三个指标就够了:CPU 利用率、CPU 平均负载、CPU 上下文切换。
线程方面,除了线程数之外,还需要关注一下处于“挂起”状态的线程数量有多少。数量越多,意味着程序里锁竞争越激烈,需要通过其它方案来缩小锁的粒度、级别,或者避免用锁。