week7-性能优化

133 阅读3分钟

性能测试是性能优化的前提和基础,也是其检验和度量的标准。

主观视角:客户使用体验

客观视角:性能指标衡量

响应时间: 发出请求到接收到最后数据的时间

并发数: 同时处理请求的数目

吞吐量:单位时间内系统处理的请求数量

性能测试曲线,及阶段(性能、压测、负载)

全链路压测

优化的分层 找到瓶颈点

基础设施(机房骨干网络,CDN等)

服务器硬件

操作系统配置

虚拟机/中间件

应用框架

软件代码 

线程安全: 通过临界区保证只有一个线程同时执行来实现线程安全

lock会引起线程阻塞、阻塞导致线程不能继续执行,也不能释放资源,进而导致资源耗尽。

避免阻塞引起的崩溃方法:

        限流

        降级

         反应式

锁本身也有临界区

当多个线程去看锁的时候,是正常的,同时加锁会把多个线程加入临界区。如何保证多个线程加锁安全? 通过CAS系统原语compare and swap原语执行是连续的,执行过程不能被中断

线程被调度到CPU后,当读取Lock时,V和E相等,则设置为N;此过程不会被其他线程打断;所以其他线程读取Lock时,V和E不相等,则不会更新N值。这样只有一个线程能够获得lock。

CAS实现所操作,系统指令支持。

在Java中锁在对象的头中,使用synchronize关键字放在对象或方法前面。方法所在的对象的头中会进行标识。线程会判断该对象的lock是否被获取,如果已经获取,则无法对该对象进行访问。

自旋锁: 锁分两种,一是互斥锁,还有一种是自旋锁。这两种锁都是为保证在同一时间资源被一个线程访问。互斥锁,当资源被一个线程访问时,其是获得了锁,其他的线程会进入sleep状态。

而自旋锁,会排队等待来检查锁是否被释放。

自旋锁会造成的问题:1. 死锁 发生在在递归中申请自旋锁 2 过多占用CPU资源, 适合锁使用者保持所时间比较短的情况。

自旋锁在内核可抢占或者SMP(多处理器)的情况下才真正需要。

在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。

 偏向锁:是指一段同步代码被一个线程访问,那么该线程获取锁。

轻量锁: 

重量锁

在多个CPU的情况下,CAS操作需要总线锁,在内存对处理器进行Lock,该处理器独占内存

使用缓存锁,指回写内存区时保证缓存一致性机制

公平锁,按申请的顺序

可重入锁,某个线程已经获得锁,可以再次获取锁不会出现死锁。

akka分布式编程框架 actor