架构师训练营第七周 - 总结
1. 性能测试:
指标:
响应时间、并发数、吞吐量。
公式:
吞吐量 = (1000 / 响应时间ms) X 并发数
性能测试曲线:
结论:
随着并发压力的增加,系统的响应时间应该是越来越高。而对应的吞吐量应该在增加到一个临界点后随着并发压力的增加,吞吐量会越来越小。
2. 性能优化
基本分层思想:
机房与骨干网络性能优化
服务器与硬件性能优化
操作系统性能优化
虚拟机性能优化
基础组件性能优化
软件架构性能优化
软件代码性能优化
优化手段:
缓存
异步
集群
并发编程、多线程
资源复用、线程池和对象池
数据结构算法优化
3.操作系统
Java Web应用多线程运行视图
锁
偏向锁:
指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。
轻量级锁:
指当锁是偏向锁时,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。(非公平锁)
重量级锁:
指当锁是轻量级锁时,另一个线程虽然自旋,但自旋不会一直持续下去,当自旋到一定次数时,还没获取到锁,就会进入阻塞,该锁就膨胀为重量级锁,重量级锁会让其他申请的线程进入阻塞,性能降低。(公平锁,Mark Word记录排队信息)
总线锁:
使用处理器的Lock信号,当一个处理器在内存总线上输出此信号的时候,其他处理器请求将被阻塞,该处理器独占内存。(悲观锁)
缓存锁:
指缓存区域如果被缓存在处理器的缓存行中,且被Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上盛宴Lock信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会组织同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行数据时,会使缓存行无效。(乐观锁)
公平锁:
多个线程按照申请锁的顺序来获取锁。
非公平锁:
多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,可能会造成饥饿现象。
可重入锁:
指某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。
独享锁/互斥锁:
该锁一次只能被一个线程持有。
共享锁:
该锁可以被多个线程所持有。
读写锁:
多个读线程之间并不互斥,而写线程则要求与任何线程互斥。(读写互斥、写写互斥、读读不互斥)
乐观锁:
认为对于同一个数据的并发操作,是不会发现修改的。在更新数据的时候,检查是否已经被修改过,如果修改过,就放弃。
悲观锁:
认为同一个数据的并发操作,一定是会发生修改的,哪怕没有发生修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取枷锁的形式。悲观的认为,不加锁的并发操作一定会出问题。
分段锁:
锁的一种应用。
指当操作不需要更新整个数组的时候,就仅仅针对数组的一段进行加锁操作。(JDK ConconrrentHashMap是通过分段锁实现高效并发操作的)
自旋锁:指尝试获取锁的线程不会立即阻塞,而是采取循环的方式去尝试获取锁。有点:减少线程上下文切换的消耗,缺点:循环会消耗CPU。
评论