【问题标题】:How are light weight threads scheduled by the linux kernel on a multichip multicore SMP system?linux内核如何在多芯片多核SMP系统上调度轻量级线程?
【发布时间】:2012-03-27 01:57:42
【问题描述】:

我正在使用轻线程运行并行算法,我想知道当系统提供多个内核和多个芯片时,这些线程是如何分配给不同的内核的。线程是否分配给单个芯片,直到芯片上的所有内核都用完?是否将线程分配给不同芯片上的内核以便更好地在芯片之间分配工作?

【问题讨论】:

  • 您使用的是哪个线程库?
  • 该行为库是否依赖?想想内核调度程序处理的那些细节。

标签: linux-kernel scheduling scheduler smp lightweight-processes


【解决方案1】:

您不会说您使用的是什么操作系统,但在 Linux 中,线程会根据内核上的负载分配给内核。准备好运行的线程将被分配给负载最低的核心,除非您通过设置线程亲缘关系另外指定。您可以使用sched_setaffinity() 执行此操作。有关更多详细信息,请参见手册页。一般来说,正如 meyes1979 所说,这是由您正在使用的操作系统中实现的调度程序决定的。

根据您使用的 Linux 版本,有两篇文章可能会有所帮助:this article describes early 2.6 kernels, up through 2.6.22this article describes kernels newer than 2.6.23

【讨论】:

  • 感谢您的回答。是的,操作系统是 linux。
  • 让我看看我是否得到这个:一个线程被分配给负载最低的核心,但您可以设置一个线程亲和性来“建议”一个核心。现在,我认为通常会将一个线程分配给它已经在其中运行的核心,以避免缓存未命中。因此,如果是这种情况,线程会尝试保留在它开始工作的核心上,但如果核心很忙,那么它可能会“迁移”到不同的核心以进行负载平衡。我错过了什么吗?
  • 你做对了。如果你手边的话,我建议你仔细研究一下 Linux 源代码,尤其是kernel/sched.c。我在看 2.6.32。每个计时器滴答,调度程序将被调用(scheduler_tick())。如果是,调度程序将检查内核之间是否存在严重的负载不平衡 (trigger_load_balance())。 load_balance() 最终将被调用,这是您做出感兴趣的决定的地方。
【解决方案2】:

不同的线程库执行不同的线程操作。如今,Linux 中的“标准”是NPTL,它将线程调度到与进程相同的级别。这很好,因为 Linux 上的进程创建速度很快,并且旨在始终保持快速。

Linux 内核试图为执行进程和线程提供非常强的 CPU 关联性,以提高缓存命中与缓存未命中的比率——如果一个任务总是在同一个内核上执行,它更有可能具有预先填充的缓存行。

这通常是一件好事,但我注意到内核可能并不总是将任务从繁忙的核心迁移到空闲的核心。这种行为可能会因版本而异,但我发现多个 CPU 绑定任务都在一个内核上运行,而其他三个内核处于空闲状态。 (我发现一个核心比其他三个核心要高六七摄氏度。)

一般来说,正确的事情应该发生;但是当内核没有自动将任务迁移到其他处理器时,您可以使用taskset(1) 命令来限制程序允许的处理器,或者您可以修改您的程序以使用pthread_setaffinity_np(3) 函数来请求迁移单个线程。 (这可能最适合内部应用程序 - 您的某个用户可能不希望您的程序使用所有可用的内核。如果您确实选择在您的程序中包含对该函数的调用,请确保它可以通过配置文件进行配置,以提供类似于taskset(1) 程序的功能。)

【讨论】:

  • Linux 保持缓存温暖的好点(显然在字面意义上也是如此)。 Here 是另一个供 OP 参考的讨论。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2019-01-21
  • 2011-08-16
相关资源
最近更新 更多