一、如何提高系统的性能?
1. 衡量系统性能好坏的指标有哪些?
衡量系统的运行速度的指标:服务时间、等待时间
衡量系统的处理能力的指标:吞吐率、QPS、TPS等
2. 如何提升应用的运行速度?
通过优化算法将时间复杂度 优化成时间复杂度
通过缓存来重用之前计算结果
3. 如何提高应用的处理能力?
可以通过在应用中使用更多的线程来一起处理客户端的请求.
4. 通过增加线程数量是否一定能提升应用的处理能力?
在一定范围内,通过增加线程数量能提升处理能力。如果线程之间存在锁竞争的话,那么当线程数量超过某个阈值之后,应用的处理能力反而会降低。即使线程之间不存在竞争的话,如果线程数量过多导致线程开销过大。
5. 为什么随着线程数量增加,反而有可能会导致处理能力下降?
由于引入多线程本身就会带来的一定开销、线程数量的增加导致锁竞争加剧。
5.1 线程开销有哪些?
5.1.1 上下文切换
如果可运行的线程的数量大于CPU的数量,那么操作系统会将某个正在运行的线程调度出去,从而使其他线程能够使用CPU。这将导致一次上下文切换,在这个过程中将保存当前运行线程的上下文,然后加载新调度进来的线程的上下文。
5.1.2 内存同步
当代码中使用了 synchronized 和 volatile 关键字之后,可能会使用一些特殊指令,即内存栅栏。内存栅栏可能会对性能带来一些间接的影响,因为它将抑制编译器的一些优化操作。
5.1.3 阻塞
线程之间如果存在竞争的同步操作,可能会导致需要操作系统的介入,从而增加开销。
5.2 如何减少锁的竞争?
5.2.1 缩小锁的范围
通过缩小的锁的范围,从而减少锁的持有时间,达到线程的快进快出。常见的缩小的锁的范围:将方法锁改成代码块锁。
5.2.2 减小锁的粒度
通过锁分解和锁分段等技术实现,在这些技术中将采用多个互相独立的锁来保护独立的状态变量,从而降低锁发生竞争的可能性。
5.2.3 放弃使用锁
使用CAS来代替传统的锁方案,这样意味着线程之间不会存在竞争性,能大幅地提高线程并发能力。
网友评论