性能测试是性能优化的前提和基础,也是其检验和度量的标准。
主观视角:客户使用体验
客观视角:性能指标衡量
响应时间: 发出请求到接收到最后数据的时间
并发数: 同时处理请求的数目
吞吐量:单位时间内系统处理的请求数量
性能测试曲线,及阶段(性能、压测、负载)
全链路压测
优化的分层 找到瓶颈点
基础设施(机房骨干网络,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