问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

多线程与多进程性能分析与最佳实践

创作时间:
作者:
@小白创作中心

多线程与多进程性能分析与最佳实践

引用
CSDN
1.
https://blog.csdn.net/shaoqieqian647/article/details/145097816

在现代多核处理器系统中,选择合适的线程数和进程数对程序性能至关重要。本文通过实验数据分析,得出一些结论和思考。具体代码可从Github获取。

系统环境

  • 物理核心数:40
  • 逻辑核心数:80

性能数据分析

从数据可以观察到以下特点:

  1. 线性增长阶段:1-40线程时,性能几乎呈线性增长,这是因为每个线程都能独占一个物理核心。
  2. 次线性增长阶段:40-80线程时,性能继续提升但增长速度放缓,这是由于使用了超线程技术。
  3. 性能收敛阶段:超过80线程后,性能出现波动,但基本维持在同一水平。
  4. 线程和进程性能曲线:线程和进程性能曲线基本一致,不要被超线程的名字给迷惑了,超线程技术对线程和进程都提供了同等的硬件支持,后面具体说明。
  5. 补充说明:线性增长和次线性增长没有在40和80时完全达到阶段性最高值,是因为系统中还运行了其他任务,会占用部分资源,有条件的可以自行测试。另外,部分国产CPU芯片没有超线程技术,请注意甄别。

为什么在逻辑核心数附近达到最佳性能?

  1. 硬件资源匹配
  • 当线程/进程数等于逻辑核心数时,实现了计算资源的最优利用
  • 每个线程/进程都能获得一个执行上下文,避免了过度的上下文切换
  1. 超线程技术的影响
  • 物理核心通过超线程技术模拟出两个逻辑核心
  • 在资源未被充分利用时,超线程可以提升性能
  • 这解释了为什么性能在40-80线程/进程之间仍能提升
  1. 资源竞争
  • 超过逻辑核心数后,会导致更频繁的上下文切换
  • 增加了调度开销和资源竞争
  • 这解释了为什么超过80后性能会波动

超线程技术与多进程的关系

逻辑核心与超线程

在我们的系统中,40个物理核心能够支持80个逻辑核心,这确实是通过英特尔的超线程技术(Intel Hyper-Threading Technology,HT)实现的。超线程的工作原理如下:

  1. 硬件层面的实现
  • 每个物理核心包含两套独立的寄存器组(architectural state)
  • 共享同一个物理核心的执行单元、缓存和其他计算资源
  • 操作系统将这两套寄存器组视为两个独立的逻辑核心
  1. 资源共享机制
  • 指令流水线
  • L1/L2缓存
  • 执行单元(ALU、FPU等)
  • 分支预测器

为什么多进程也能利用超线程?

  1. 操作系统层面的调度
  • 操作系统调度器不区分进程和线程的硬件资源分配
  • 调度器将进程和线程都视为可调度的执行单元
  • 在硬件层面,进程和线程都被映射到逻辑核心上执行
  1. 超线程的通用性
  • 超线程是在硬件层面实现的并行技术
  • 不关心执行单元是进程还是线程
  • 只要有两个独立的指令流,就能利用超线程提供的并行能力
  1. 性能提升原理
  • 当一个进程在等待内存或I/O时,另一个进程可以利用空闲的执行资源
  • 通过资源共享提高硬件利用率
  • 这就解释了为什么进程数在40-80之间仍能获得性能提升

这也说明了为什么在我们的测试中,无论是多线程还是多进程,都能在接近逻辑核心数(80)时达到最佳性能。超线程技术对两种并行方式都提供了同等的硬件支持。

最佳实践建议

  1. 线程数选择
  • 对于CPU密集型任务,建议将线程数设置为逻辑核心数
  • 对于I/O密集型任务,可以适当增加线程数,但建议不要超过逻辑核心数的2倍
  1. 进程数选择
  • 进程数同样建议设置为逻辑核心数
  • 对于I/O密集型任务,可以适当增加线程数,但建议不要超过逻辑核心数的2倍
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号