初探性能优化

349 阅读4分钟

问题1:性能优化的指标

响应时间

提交请求和返回该请求的响应之间使用的时间,一般比较关注平均响应时间。

如:数据库查询花费的时间,将字符回显到终端上花费的时间,访问Web页面花费的时间;

image-20200416170609914

并发数 指同一时刻,对服务器有实际交互的请求数。和网站在线用户数的关联。 吞吐量 对单位时间内完成的工作量(请求)的量度。 如:每分钟的数据库事务,每秒传送的文件千字节数,每分钟的Web服务器命中数

image-20200416214907831

问题2:性能优化的方法

image-20200416172653550

1.前端优化

(1)浏览器/APP

**减少请求数:**合并css,Js,图片

使用客户端缓冲:静态资源文件缓存在浏览器中,Cache-Control(相对时间)和Expires

启用压缩:减少CSS文件大小,增加文件传输速度,但会给浏览器和服务器带来压力。

资源文件加载顺序:css放在页面最上面,js放在最下面

减少Cookie传输:比如静态资源可以不用

(2)CDN加速

内容分发网络。

(3)反向代理缓存

比如Nginx接到请求后分发到后端的Web应用上,但是把静态资源放到Nginx上,不返回后端。

(4)WEB组件分离

image-20200416175209456

2.应用服务优化

(1)缓存

缓存的数据:频繁修改的数据,不适合缓存,读写比较大的适合缓存,缓存一定是热点数据,遵循28定律

缺点:使用缓存,应用就要容忍一定时间的数据不一致

缓存可用性问题:应该做好缓存的分布式,避免缓存雪崩,造成数据服务器宕机

缓存预热:事先把热点数据加载好。

缓存击穿:持续高并发的请求一个不存在的数据,1.布隆过滤器,2.把不存在的数据也缓存起来

解决缓存中的数据倾斜:一致性哈希

image-20200416200714936

(2)异步

同步与异步:关注的是结果消息的通信机制

阻塞和非阻塞:关注的是等待结果返回给调用方的状态

bio 同步阻塞

nio 同步非阻塞

aio 异步

image-20200416201853282

(3)集群

image-20200416202034951

(4)程序级别

1.代码优化

选择合适的数据结构

选择更优的算法:最大自列和问题

编写更少的代码

2.并发编程

充分利用CPU多核,尽量使用线程池,合理设置线程数量,尽量使用JDK提供的各种并发框架和工具

实现线程安全的类,避免线程安全问题

同步下减少锁的竞争:

  • 缩小锁的范围,减少锁的粒度,锁分段,
  • 替换独占锁,读写锁,CAS代替锁,ThreadLocal
3.资源的复用

减少开销很大的系统资源的创建和销毁

单例模式

池化技术

4.JIT编译器相关的优化

热点编译的概念

选择编译器类型:-server(适用于热点代码的编译),-client(适用于快速启动为目标的程序)

​ -XX:+TieredCompilation(分层编译,可结合-server使用)

代码缓存相关: -XX:ReservedCodeCacheSize=N

编译阈值:执行到了某个次数(在一定时间段内),就进行热点编译,方法调用计数器,循环回边计数器

编译线程:编译热点代码的线程

方法内联

方法字节码小于325字节+方法够热才会内联 XX:MaxFreqlnlineSize=N.

方法小于35个字节,一定会内联-Xx:MaxInlineSize

逃逸分析

5.GC调优

目标:GC时间小,次数少

步骤:

1、监控GC的状态;

2、分析结果,判断是否要优化

​ minor GC执行时间50ms以下,10S一次、FullGC执行时间1s以下,频率10分钟以上,则不太需要调

3.进行调参:

第一位:选择合适的GC回收器

第二位:选择合适的堆大小

第三位:选择年轻代在堆中的比重

3.存储性能优化

尽量使用SSD

定时清理数据或者按数据的性质分开存放

结果集处理

4.优化的原则:

1.切忌过早过度优化

2.网站性能优化优先考虑使用缓存优化性能,缓存离用户越近越好