常见手段
1、增加资源
1)增加机器
web服务进行集群+nginx负载均衡
2)升级配置
更换性能更好的 CPU、增加内存、增加宽带、使用固态硬盘、增加磁盘空间
2、减少耗时操作 (常见传输媒介及时间量级)
1)合并操作(化零为整)
A、多次请求合并成一次请求,比如js请求
B、单条查询请求变成批量查询请求,比如hbase-client的get请求;Redis 中的 mget 命令,可以批量获取 key 的值;ES 中也提供了 mget 批量查询 api
C、减少IO操作次数,将数据先写到缓冲区,达到一定条件再落盘, 减少写盘次数,比如innoDB -> redo log -> 内存 -> 适合的时候更新到磁盘;HBASE -> 刷新memstore -> 产生新HFile -> 硬盘寻址 -> 合并操作,提升效率,同时减少碎片化
2)压缩操作(压缩资源或数据)
A、比如前端可以对 js 或者 css 文件进行压缩,来减少传输的数据量,加快资源加载速度
B、后端可以对将要存储到 redis 中的大段文本数据进行压缩,然后再存储,使用前再解压
3)复用操作(复用资源)
A、数据库连接池复用连接、线程池复用线程提高性能
B、Http长连接就是在同一个连接中发起多次请求来提高性能的
4)减少IO操作
A、减少不必要的调用
B、减少不必要的日志输出
C、减少不必要的转换
5)减少上下文切换(自旋锁)
6)减少操作指令(对象私有数据转成函数本地变量)
7)合理设置等待时间(接口调用超时时间)
3、提高资源利用率
1)空间换时间(权衡点)
2)同步转异步(线程池异步)
3)串行转并行(ForkJoinPool、Stream并行流、消息队列、大数据框架)
4)降低冲突范围(时间、空间)
偏向锁、分段锁、读写锁、CopyOnWrite、乐观锁、隔离等
5)空间局部性
4、灵活性
1)提前处理(提前缓存或计算)
2)实时转离线(实时计算转离线计算)
3)随机读写转顺序读写(IO读写效率差异)
4)就近原则(更近的数据、更近的服务)
5)选择合适的数据结构和算法(set、bitset、bag)
6)加限制条件
7)CPU密集型和IO密集型
8)根据技术特点去优化
9)全链路优化(前后端合作、后端上下游合作)
10)多种手段相结合
5、产品层
1)加限制条件
2)砍需求
3)考虑交互
6、注意事项
1)避免过早优化
2)考虑其他指标
3)优化体验