【发布时间】:2015-06-07 22:43:00
【问题描述】:
我在多个地方了解到 Linux 的默认调度程序在多核机器上超线程感知,这意味着如果您有一台具有 2 个真正核心 (4 HT) 的机器,它不会将两个繁忙的线程安排到逻辑核心上,使它们都运行在相同的物理核心上(这在许多情况下会导致 2 倍的性能成本)。
但是当我在 Intel i5-2520M 上运行 stress -c 2(生成两个线程以在 100% CPU 上运行)时,它经常调度(并保持)两个线程到 HT核心 1 和 2,映射到同一个物理核心。即使系统处于空闲状态。
这也发生在实际程序中(我在这里使用stress,因为它很容易重现),当这种情况发生时,我的程序运行时间可以理解为两倍。使用taskset 手动设置关联可以为我的程序修复该问题,但我希望支持 HT 的调度程序能够自行正确执行此操作。
您可以通过egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'找到HT->物理核心分配。
所以我的问题是:为什么调度程序将我的线程放在同一个物理核心上?
注意事项:
- 这个问题与这个other question 非常相似,答案说Linux 有一个非常复杂的线程调度程序,它支持HT。如上所述,我无法观察到这一事实(请通过
stress -c自行检查),并想知道原因。 - 我知道我可以为我的程序手动设置处理器关联,例如使用
taskset工具或sched_setaffinity函数。这不是我要寻找的,我希望调度程序自己知道将两个繁忙的线程映射到一个物理核心并让一个物理核心完全空着不是一个好主意。 - 我知道在 some situations 中,您希望将线程调度到同一个物理核心上,而让另一个核心空闲,但调度程序会执行大约 1/4 的操作似乎很荒谬案例。在我看来,它选择的 HT 内核是完全随机的,或者可能是那些在调度时活动最少的 HT 内核,但是考虑到具有 @987654330 特征的程序的清晰程度,这对超线程不是很敏感@ 受益于在单独的物理内核上运行。
【问题讨论】:
-
您指的是哪个发行版和版本?
-
尝试在两个进程中运行压力,每个进程都有一个线程。我还没有研究过 Linux 调度程序的细节(自从我上次研究它以来,它甚至可能已经改变了)。出于缓存局部性等原因,内核可能更喜欢在同一物理处理器上的同一进程中调度线程。
-
Ubuntu 14.04,Linux 3.13.0。
-
@joshperry “内核可能更喜欢在同一个物理处理器上的同一个进程中调度线程”
-
Linux 通过调度程序域跟踪 HT 线程(以及最后一级缓存和 NUMA 节点)。请显示
awk '/^domain/ { print $1, $2; } /^cpu/ { print $1; }' /proc/schedstat打印的内容,它将显示调度程序域的 CPU 掩码。
标签: linux multithreading performance scheduler