相关疑难解决方法(0)

为什么Linux的调度程序将两个线程放在具有超线程的处理器上的同一物理内核上?

我已经在多个地方读过Linux的默认调度程序在多核机器上的超线程感知,这意味着如果你有一台具有2个真实内核(4 HT)的机器,它将不会以某种方式将两个忙线程安排到逻辑内核上它们都运行在相同的物理内核上(在许多情况下会导致2倍的性能成本).

但是当我stress -c 2在我的Intel i5-2520M上运行(产生两个线程以在100%CPU上运行)时,它经常将两个线程调度(并保持)到HT核心1和2上,这些核心映射到相同的物理核心.即使系统处于空闲状态.

这也适用于真正的程序(我在stress这里使用它因为它很容易重现),当发生这种情况时,我的程序可以理解地需要两倍的时间来运行.手动设置亲和力与taskset我的程序的修复程序,但我希望HT感知调度程序自己正确地执行此操作.

您可以找到HT->物理核心配置egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'.

所以我的问题是:为什么调度程序将我的线程放在同一个物理内核上?


笔记:

  • 这个问题与其他问题非常相似,答案就是说Linux有一个非常复杂的线程调度程序,它具有HT意识.如上所述,我无法观察到这一事实(请自行检查stress -c),并想知道原因.
  • 我知道我可以手动为我的程序设置处理器亲和性,例如使用taskset工具或sched_setaffinity函数.这不是我正在寻找的,我希望调度程序能够自己知道将两个忙线程映射到物理核心并将一个物理核心完全留空并不是一个好主意.
  • 我知道在某些情况下你更喜欢将线程安排到同一个物理内核上并让其他内核保持空闲,但调度程序大约1/4的情况下,这似乎是荒谬的.在我看来,它所选择的HT核心是完全随机的,或者可能是那些在调度时活动最少的HT核心,但这并不是非常超线程的意识,考虑到具有stress受益于在不同的物理核心上运行.

linux performance multithreading scheduler

18
推荐指数
2
解决办法
5071
查看次数

标签 统计

linux ×1

multithreading ×1

performance ×1

scheduler ×1