Java并发 -- 线程数量

栏目: Java · 发布时间: 6年前

内容简介:假设程序按照
  1. 要达到 降低延迟,提高吞吐量 的目的,有两个方向:一个是 优化算法 ,一个是 将硬件的性能发挥到极致
    • 前者属于 算法 范畴,后者与 并发编程 息息相关
  2. 并发编程 领域, 提高性能本质上就是要提高硬件的利用率 ,主要是提升 IO利用率CPU利用率
  3. 操作系统解决 硬件利用率 问题的对象往往是 单一的硬件设备 ,而 并发编程 要解决 CPU和IO设备综合利用率 的问题

综合利用率

假设程序按照 CPU计算IO操作 交叉执行的方式运行,而且CPU计算和IO操作的耗时是 1:1

单线程

Java并发 -- 线程数量

  1. 单线程时,执行CPU计算的时候,IO设备空闲,执行IO操作时,CPU空闲,所以CPU利用率和IO设备的利用率都是 50%

两线程

Java并发 -- 线程数量

  1. 两个线程时,当线程A执行CPU计算时,线程B执行IO操作,当线程A执行IO操作时,线程B执行CPU计算
  2. 这样CPU利用率和IO设备的利用率都达到了100%,相对于单线程 吞吐量 提高了1倍
  3. 逆向思维:如果CPU和IO设备的利用率都 很低 ,可以通过 增加线程提高吞吐量

多核

Java并发 -- 线程数量

  1. 单核 时代,多线程主要用来 平衡CPU和IO设备
    • 如果程序 只有CPU计算 ,那么多线程反而会让 性能变差 ,因为增加了 线程切换 的成本
  2. 多核 时代,纯CPU计算的程序可以利用多线程来 提升性能 ,因为利用多核可以 降低响应时间
    • 例如对于4核CPU,可以将一个计算任务拆分成4个 独立 的子任务,交由4个线程分别在4个核上执行
    • 采用单线程时CPU的利用率只有25%,而采用4线程时能将CPU的利用率提高到100%

线程数量

需要依据 具体的应用场景 来确定 线程数量 CPU密集型 + IO密集型

CPU密集型

  1. 对于CPU密集型来说,多线程本质上是要 提升CPU的利用率
  2. 为了减少 线程切换 的成本,理论上设置为 CPU核数 即可
  3. 但在工程上,一般会设置成 CPU核数+1 ,这是为了 保证CPU的利用率 (在某个线程阻塞时,额外的线程能够补上)

IO密集型

单核

最佳线程数 = 1 + (IO耗时 / CPU耗时)

三线程

Java并发 -- 线程数量

  1. 如果CPU计算和IO操作的耗时比是1:2
  2. 对于线程A,当CPU从线程B、C切换回来时,线程A正好执行完IO操作,这样CPU和IO设备的利用率都达到了100%

多核

最佳线程数 = CPU核数 * [1 + (IO耗时 / CPU耗时)]

关键参数

  1. 对于IO密集型的应用场景,关键参数是 IO耗时/CPU耗时 ,但这个参数是 动态变化
  2. 因此,如果要估算这个参数,需要做各个不同场景下的 压测
    • 在压测的过程中,要重点关注 CPU、IO设备的利用率 和性能指标( 延迟+吞吐量 )之间的关系

转载请注明出处:http://zhongmingmao.me/2019/04/29/java-concurrent-thread-count/

访问原文「Java并发 -- 线程数量」获取最佳阅读体验并参与讨论


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Algorithms

Distributed Algorithms

Nancy A. Lynch / Morgan Kaufmann / 1996-3-15 / USD 155.00

In "Distributed Algorithms", Nancy Lynch provides a blueprint for designing, implementing, and analyzing distributed algorithms. She directs her book at a wide audience, including students, programmer......一起来看看 《Distributed Algorithms》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具