linux - 为什么启用超线程后性能变差?

标签 linux linux-kernel scheduling intel hyperthreading

我将 Linux 内核 2.6.32 移植到 Intel(R) Xeon(R) CPU E31275 @ 3.40GHz。如果我在 BIOS 中启用超线程,我可以看到 8 个 CPU 核心 (CPU0 ~ CPU7)。大多数中断发生在 CPU 4 中,该内核的 CPU 使用率比其他内核高很多(几乎是其他内核的两倍)。我不是很理解,因为我认为我没有设置任何IRQ绑定(bind)操作。

如果我在 BIOS 中禁用超线程,那么一切正常。 IRQ 已经平衡,所有核心(CPU0 ~ CPU3)的 CPU 使用率也接近平衡。

谁能解释一下?跟BIOS有关吗?我应该在内核中做一些特殊设置吗?

最佳答案

某些程序会受到 HT(超线程)的负面影响,要解释这一点,您必须了解 HT 是什么。 正如你所说你看到了 7 个(0-7 是 8 个)cpu 核心,这是不正确的,你的 CPU 中有 4 个核心,8 个核心是虚拟核心,所以一个核心有 2 个线程(就像他是 2 个线程一样)核心)。 通常 HT 有助于更快地运行程序,因为 CPU/OS 能够同时运行(做这些程序所做的)8 个程序,没有 HT 你只能同时运行 4 个。 您不必设置任何设置,因为您无法更改此外观,如果您是此程序的开发人员,您应该重新检查代码并根据需要针对 HT 对其进行优化,或者您可以禁用 HT。

由于一些废话的人在谈论另一个信息:HT正在增加CPU的功率 这不是真的!即使当你看到 8 个内核可以说是 4GHz(GHz 什么也没说,应该以触发器来衡量)你得到的功率与你打开 HT 并获得 4 个 4GHz 内核时的功率相同。 如果您在 2 个虚拟核心上获得了 HT,那么您的 CPU 将共享 1 个物理核心。

这里有一些关于 HT 的更多信息: http://www.makeuseof.com/tag/hyperthreading-technology-explained/

我找不到指向一个非常好的网站的旧链接,其中有代码片段显示 HT 的错误代码和好的代码(意思是比没有 HT 慢的坏代码,反之亦然)。

TL;DR:并不是每个程序都因其开发而受益于 HT。

关于linux - 为什么启用超线程后性能变差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10593313/

相关文章:

Python ping 脚本在第一次尝试时总是失败

c - 为什么线程函数不调用? (SIGEV_THREAD)

cuda - 对于 CUDA,线程是否停留在 GPU 上的单个 SP 上?

c - 来自 sk_buff 的 IP 地址

node.js - 在后端 Node.js 上安排大量任务

hadoop - yarn : How to run MapReduce jobs with lot of mappers comparing to cluster size

linux - 如何 SO_REUSEADDR | SO_REUSEPORT 在 setsockopt 中有效吗?

linux - docker 容器中的简单 REST Web 服务器

c - 在 Linux 内核的 uname -v 输出字符串中添加一些额外信息

c - 内核的 "container_of"- 有什么方法可以使其符合 ISO 标准吗?