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

Linux 在具有多个(物理)CPU的系统上的多线程进程中,如何处理线程调度?,linux,multithreading,process,parallel-processing,linux-kernel,Linux,Multithreading,Process,Parallel Processing,Linux Kernel,这是一个广泛的问题,但我很好奇在一台有多个物理CPU的机器上的单个进程应用程序中线程调度的细节 编辑-想澄清一下,下面我说的是Physcal CPU。我对进程/线程如何与多核CPU协同工作有很好的理解,但我指的是主板上的多个物理CPU(如2个4核Xeon) 回答-感谢brokenfoot和nosid的回复,我想我已经做到了: -Linux scheduler具有不同的NUMA策略,这些策略会影响线程调度的核心/核心内存变异/访问模式。 -跨染料的缓存一致性是可能的,但速度比预期的慢。 -最佳行动

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

编辑-想澄清一下,下面我说的是Physcal CPU。我对进程/线程如何与多核CPU协同工作有很好的理解,但我指的是主板上的多个物理CPU(如2个4核Xeon)

回答-感谢brokenfoot和nosid的回复,我想我已经做到了: -Linux scheduler具有不同的NUMA策略,这些策略会影响线程调度的核心/核心内存变异/访问模式。 -跨染料的缓存一致性是可能的,但速度比预期的慢。 -最佳行动方案-控制共享内存的可变性(尽量保持不变) -使用考虑线程位置的内部(进程中)任务调度器 -使用与进程内任务计划程序一起使用的NUMA策略

假设:

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

  • 我有一个多线程单进程服务,它可以。。。类似的东西。它可以有效地利用多个核心,并以一种通常避免cpu核心缓存未命中和一致性滥用的方式分配工作。Executor对任务具有相对的线程关联性
  • 服务线程可以在进程中利用共享数据(大部分是不可变的)
  • 服务体系结构以一种方式完成,即在同一个盒子上运行多个进程是可能的,但每个盒子只有一个进程(共享缓存、资源等)是有利的
问题是:

  • 多个CPU之间是否可能存在缓存一致性?它实用吗?(在性能降低的情况下)
  • linux将如何安排CPU之间的线程?(如有可能)
  • 有没有办法将进程固定到单个CPU上?(已确认)
  • 最终。。。我是否为每个CPU和引脚执行一个进程?或者每盒1个(如果我不让自己搞砸缓慢的跨CPU缓存未命中,那就太酷了)(开始听起来好像只有一个进程是好的,只要我的并行任务与某个线程和大部分不可变的数据有关联)
多个CPU之间是否可能存在缓存一致性?它实用吗

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

linux将如何安排CPU之间的线程?(如有可能)

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

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

是的,寻找cpuset

最终。。。我是否为每个CPU和引脚执行一个进程?或者每盒1个(如果我不把自己搞得太慢的跨CPU缓存未命中,那就太酷了)


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

有基于目录的cahce一致性协议,用于NUMA机器中大量处理器之间的一致性。谷歌搜索一下。Linux下的内核线程被实现为共享资源的进程。调度程序不区分线程和进程是的,我知道这一点。pthread作为进程(它们自己的PID等)呈现给内核。这更像是一个资源共享如何与多个多核单元协同工作的问题(多个物理CPU之间共享内存的缓存一致性)@brokenfoot我猜作为后续问题,NUMA是否跨多个处理器工作?或者只是为了染料的局部一致性?如果是的话,多个染料和多个本地核心之间的缓存一致性是否明显较慢?是的,它确实可以跨多个染料工作。正如你所指出的,它比多核染料的缓存一致性慢。它被称为ccNUMA,其中缓存控制器之间的通信使用IPCs。阅读这里:@brokenfoot谢谢!这证实了我对缓存一致性的怀疑。。。。现在我只是想知道linux的时间表是否有所不同。对于一个进程中的线程,一种染料是否有某种隐含的亲和力?感谢您的回复!我想我没能澄清上面的问题:我想知道在一个有多个物理CPU(每个都是多核的)的系统上,进程会如何运行,所以最终的问题是。。。我是每个物理CPU使用一个进程(不考虑每个染料的核数),还是每个机箱使用一个进程?@ColinGodsey:从功能角度看,多核和多套接字之间没有区别。当然,当访问连接到另一个套接字的内存时,性能会有所不同。然而,在大多数情况下,这并不是瓶颈。通常,瓶颈是线程之间共享的内存,其中至少有一个线程执行写操作。无论线程是在不同的内核上运行还是在不同的套接字上运行,这些操作都非常昂贵。谢谢!所以只要我保持我的数据相对不变,应该是好的吗?另外,您知道这会影响linux调度程序吗?它是否会自然而然地尝试将一个进程的线程保持在一种染料的本地(尽可能多)?它正在变得更好。参见示例和