1.性能优化的目标:
1.吞吐量 2.响应速度
吞吐量指的是 并行执行的优化
响应速度指的是串行执行的优化,通过优化执行步骤
2.性能优化的要点:
1.依据数据而不是猜想
2.个体数据不可靠
3.不要过早优化和过度优化
4.保持良好的编码习惯
3.性能优化的指标
吞吐量指标:QPS;TPS
响应时间:TIME,平均响应时间
4.性能优化的方法
性能优化分为业务优化+技术优化
优化分类:1.复用优化 2.计算优化 3.结果集优化 4.算法优化 5.计算优化 6.JVM优化
1.复用优化
分为代码复用和数据复用
代码复用指的是编码逻辑上的优化,把重复的代码提取出来,做成公共的方法。也使用使用设计模式完成代码复用和可扩展性。
比如使用策略模式去除大量if-else
使用责任链模式实现大量的校验
数据复用:通常有两种方式:缓冲+缓存
缓冲指的是写操作,作为数据的暂存,然后批量传输或者写入。实际中的例子比如操作系统的各种缓冲区;kafka客户端的缓冲区,然后批量发送;线程池的队列;消息中间件等
缓存指的是读操作,对数据的复用。通常有本地缓存和分布式缓存
2.计算优化
对计算结果的优化,方式有1.并行执行 2.同步转异步 3.惰性加载
并行执行:充分利用cpu多核特性;模式分为 利用多机执行,多线程
同步转异步:
惰性加载:可以使用设计模式比如单例,代理等
3.结果集优化
可以使用压缩,索引,批量,复用进行解决。
5.瓶颈
通常容易出瓶颈的几个点:CPU,内存,I/O
5.1CPU
cpu称为大脑,导致CPU问题常常会有两点:一是上下文频繁切换 二是线程阻塞
排查方式:
1.使用top命令找到最大进程
2.使用top -HC 找到最大线程 此时要注意:有两种情况,一是某一个线程一直占用,这说明出现阻塞情况 二是几个线程频繁飙高,这种代表上下文频繁切换,有可能线程在无限创建的可能
3.jstack命令进行分析具体线程
线程阻塞情况:使用命令之后可以看到具体的日志,有两种显示方式:第一是线程阻塞,这种可以找到具体的代码。第二是OOM导致的,因为GC线程和业务线程并行执行,OOM问题在下面进行分析。
上下文频繁切换:这种需要使用jstack命令分析多个线程,判断是否是由于线程频繁创建导致。
5.2 内存
内存分为物理内存+虚拟内存。
第一种内存被占用满情况,其他资源不够,比如栈空间,方法区
这种情况下可以使用 free命令进行查看内存使用情况。
第二种OOM问题
OOM问题解决思路:
1.导出OOM日志
2.使用工具MAT进行分析
第一种情况大对象问题:排查直方图或者折线图。
第二种情况内存泄漏:排查泄漏点
第三种情况老年代频繁:通常由于年轻代参数设置不够,很多对象没有被销毁导致空间不足。
5.3 I/O
很多中间件的瓶颈就是I/O;即使有各种技术在降低I/O的损耗,还依旧会有这种问题。
BIO:同步阻塞IO
NIO:同步非阻塞IO 代表作:Netty
多路复用:同步非阻塞IO 代表作:redis
AIO:异步非阻塞IO