一马平川
不积跬步无以至千里,后继才能薄发

多线程的性能和可伸缩性优化笔记

2022年01月20日
0
未分类

什么是可伸缩性?

当硬件性能提升,如cpu提升、内存提升、IO性能提升时,应用程序的处理能力是否会跟随硬件有相应的增加。

如何对可伸缩性进行优化的基准

开发中需要针对具体需求进行定制,如何以以测试为基准进行优化。

多线程的可伸缩性的限制

在所有的并发程度中都会有一部分的串行化的任务,如I/O阻塞、对阻塞队列进行读取和写入等

JVM对锁的优化

  • 锁消除,基于逃逸分析可以把没有逃逸出栈的对象中的锁消除。
  • 锁粗化,将相邻的相同的锁的代码块进行合并。

线程引入的开销

  1. 上下文切换

    5k-10k个时钟周期,大约几微秒

  2. 内存同步

    内存栅栏刷新缓存,使得缓存无效的同时也禁止了大部分的指令重排序。

    共享内存总线的带宽是有限的,过多的同步会导致总线上的线程陷入瓶颈

线程阻塞的方式

JVM在处理线程阻塞时,有两种阻塞策略:自旋、挂起,一般采用挂起,因为通常来说被阻塞的线程不会在短时间内获取到资源。阻塞会导致两次上下文切换和系统操作和缓存操作。

优化可伸缩性

减少锁竞争

关键:锁的请求频率、每次持有锁的时间

  • 缩小锁的范围
  • 减小锁的粒度
    • 锁分解
    • 锁分段
  • 热点域缓存
  • 替代独占锁
    • 读写锁 ReadWriteLock
    • 原子变量:乐观锁 CAS

监测CPU利用率

命令: top

cpu负载不高的原因:

  • 负载不充分,应用程序压力不大
  • IO密集
  • 外部限制,如远程调用、Web服务调用
  • 锁竞争

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔