10创建多少线程合适
创建多少线程合适
要解决这个问题,首先要分析以下两个问题:
- 为什么要使用多线程?
- 多线程的应用场景有哪些?
为什么使用多线程
为了快,快如何度量?
两个核心指标:延迟、吞吐量(时间维度、空间维度)
延迟:发出请求到收到响应这个过程的时间
吞吐量:单位时间内能处理请求的数量
提升性能就需从降低延时、提升吞吐量思考。
多线程使用场景
两个方向降低延迟、提升吞吐量:
- 优化算法
- 将硬件性能发挥到极致
并发编程领域提升性能本质是提升硬件的利用率,即提升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来调度的(除非禁用超线程技术)。理论值和经验值只是提供个指导,实际上还是要靠压测。