10创建多少线程合适

创建多少线程合适

要解决这个问题,首先要分析以下两个问题:

  1. 为什么要使用多线程?
  2. 多线程的应用场景有哪些?

为什么使用多线程

为了快,快如何度量?
两个核心指标:延迟、吞吐量(时间维度、空间维度)
延迟:发出请求到收到响应这个过程的时间
吞吐量:单位时间内能处理请求的数量

提升性能就需从降低延时、提升吞吐量思考。

多线程使用场景

两个方向降低延迟、提升吞吐量:

  1. 优化算法
  2. 将硬件性能发挥到极致
    并发编程领域提升性能本质是提升硬件的利用率,即提升I/O利用率和CPU综合利用率

假设程序按照CPU计算和I/O操作交叉执行
CPU计算和I/O操作的耗时是1:1
单线程时CPU计算时I/O空闲,CPU和I/O利用率都是50%
2个线程,CPU和I/O利用率100%,单位时间处理请求量翻倍,吞吐量提升一倍
以上反推,CPU和I/O利用率很低时可尝试增加线程提升吞吐量

单核,多线程可平衡CPU和I/O设备。若程序只有CPU计算,多线程会增加线程切换使性能更差。
多核,纯CPU计算程序可利用多核并行计算,多线程提升性能。。

创建多少线程合适

一般程序是CPU计算和I/O计算交叉执行
I/O计算时间相对来说很长称为I/O密集型,相反CPU密集型

CPU密集型

线程的数量 = CPU核数 +1
当线程因为偶尔的内存页失效或其他原因导致阻塞时,额外的线程可以顶上,从而保证CPU利用率。

I/O密集型

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

总结

以上给出了理论上的线程数,可将硬件性能发挥到极致。
实际生产中,I/O密集型,I/O 耗时和CPU耗时的比值这个关键参数是未知且动态变化的,我们需要通过不同场景的压测验证估计。关注CPU、I/O利用率和性能指标(响应时间、吞吐量)的关系

思考题

测试io耗时与cpu耗时工具:apm工具

在4核8线程的处理器使用Runtime.availableProcessors()结果是8,从cpu硬件来看是一个物理核心有两个逻辑核心,但因为缓存、执行资源等存在共享和竞争,所以两个核心并不能并行工作。超线程技术统计性能提升大概是30%左右,并不是100%。现代操作系统层面的调度应该是按逻辑核心数,也就是8来调度的(除非禁用超线程技术)。理论值和经验值只是提供个指导,实际上还是要靠压测。

其他

I/O控制方式——轮询,中断,DMA,通道