在具有多个(物理)CPU 的系统上的多线程进程中,如何处理线程调度?

Col*_*sey 3 linux parallel-processing multithreading process linux-kernel

这是一个广泛的问题,但我很好奇在具有多个物理 CPU 的机器上的单个进程应用程序中线程调度的细节。

编辑 - 想澄清下面我在谈论物理 CPU。我已经很好地处理了进程/线程如何与多核 CPU 一起工作,但我说的是主板上的多个物理 CPU 染料(如 2 个 4 核至强)。

答案 - 多亏了 Brokenfoot 和 nosid 的回应,我想我已经明白了: - Linux 调度程序有不同的 NUMA 策略,这些策略会影响线程调度,因为它们与内核/染料有关的内存突变/访问模式。- 染料之间的缓存一致性是可能的,但速度比预期的要慢。- 最佳行动方案 - 控制共享内存的可变性(尽量保持不变) - 使用尊重线程局部性的内部(进程内)任务调度程序 - 使用与进程内任务调度程序配合使用的 NUMA 策略

假设:

  • 缓存一致性是允许多个内核在共享内存上运行的魔法。(确认的)
  • 据我所知,缓存一致性在多个 CPU 上是可能的,但性能会降低(Linux 3+,系统有多个现代多核 Xeons CPU)。(确认的)

所以情况:

  • 我有一个多线程的单进程服务,它可以并行执行......东西。它可以有效地利用多个内核并以通常避免 cpu-core 缓存未命中和一致性滥用的方式划分工作。Executor 对任务具有相对的线程亲和性。
  • 服务线程可以在进程中使用共享数据(大部分是不可变的)。
  • 服务架构的实现方式可以在同一个机器上运行多个进程,但每个机器只有 1 个进程(共享缓存、资源等)是有利的。

问题:

  • 多个 CPU 之间是否可以实现缓存一致性?实用吗?(这是,性能降低)
  • linux 将如何调度 CPU 之间的线程?(如果可能的话)
  • 有没有办法将进程固定到单个 CPU?(确认的)
  • 最终......我是否为每个 CPU 和 pin 执行一个进程?或者每盒 1 个(这会很酷,如果我不会因为慢速的跨 CPU 缓存未命中而自欺欺人)(开始听起来像 1 个进程是好的,只要我的并行任务与某个线程有关联并且大部分是不可变的数据)

nos*_*sid 5

多个 CPU 之间是否可以实现缓存一致性?实用吗?

这取决于编程语言、编译器和运行时环境。他们会注意,您的程序可以使用多个 CPU 并且仍然具有一致的内存操作。为此,编程语言通常定义所谓的内存模型

linux 将如何调度 CPU 之间的线程?(如果可能的话)

没有详细说明,它通常使用所有 CPU 内核。线程和内核之间没有静态分配。这意味着,一个线程可以在一个内核上运行一段时间,然后在另一个内核上运行。但是,Linux 内核试图将线程保持在其内存本地,因为具有多个 CPU 插槽的系统具有非统一内存架构 (NUMA)。

有没有办法将进程固定到单个 CPU?

是的,寻找cpuset

最终......我是否为每个 CPU 和 pin 执行一个进程?或者每盒 1 个(这会很酷,如果我不因跨 CPU 缓存未命中而自欺欺人)

如果您的应用程序受益于使用共享内存,则每个框使用一个进程。在性能方面没有缺点。