超线程技术会导致系统不稳定吗?

6
我正在组装一台配备新的英特尔I7四核处理器的电脑。打开超线程后,在任务管理器中将会显示8个核心。我的一些同事称,超线程会使系统不稳定,并建议关闭它。
请问各位好心人,能否为我和其他stockoverflow用户解释一下呢?
附言:我一直在使用超线程,一切都很正常,没有不稳定现象。我使用的软件有:
- Microsoft Server 2008 64位版 - Microsoft SQL Server 2008 64位版 - Microsoft Visual Studio 2008 - Diskeeper Server - 大量控件(Telerik,Dundas,Rebex,Resharper)
15个回答

9
稳定性不太可能受到影响,因为抽象层级非常低,操作系统只将其视为另一个提供工作的CPU。然而,性能就是另外一回事了。
老实说,我不能确定现在是否仍然存在这种情况,但至少当启用HT的CPU首次问世时,已知有一些应用程序存在问题。例如,MySQL和多线程应用程序(如我日常工作支持的Java应用程序)在启用HT时已知会降低性能。我们总是建议删除它,至少对于我们特定的服务器端企业应用程序的使用情况而言。
这可能已经不再是问题了,在桌面环境中,对于大多数使用情况来说,这不太可能成为问题。在CPU被大量利用时,分割CPU上的工作通常会导致更具响应性的应用程序。然而,当应用程序已经高度线程化且CPU密集型时(如数据库服务器),上下文切换和开销可能会对其产生不利影响。

2
我的理解是,英特尔正在使用与 Pentium 4 系列中使用的完全不同的超线程实现,而这个实现效果要好得多。我进行了一些实验,在 i7 上运行单线程程序时,无论 HT 是否开启,速度都大致相同,而在 Pentium 4 上则不是这种情况。 - cjs
1
P4上的超线程存在一个问题,那就是巨大的流水线。如果你因为等待缓慢的主存而停顿,那么超线程就是一个优势。但如果你主要从缓存中操作,那么超线程就是一个严重的劣势。在我看来,这也是为什么数据库通常被排除在外的原因。 - Chris K

4
我能想到几个原因,你的同事可能会这么说。
  • 有关SQL性能在超线程下受到影响的几篇文章。我相信它最终会做太多的上下文切换或缓存抖动。具体我记不清了。

  • 早期从单处理器转向多处理器,或者更可能是对于大多数人而言的超线程处理器,使许多线程问题暴露出来。竞争条件、死锁等,这些以前他们从未见过的问题。虽然这是一个代码问题,但有些人责怪处理器。

他们是否对多核/多处理器提出了同样的要求,还是只针对超线程?

至于我,我已经在一个超线程盒子上开发了4年,唯一的问题是我的UI死锁问题。


当我看到你的回答时,我本来想回答你提到的第二点。早期的超线程处理器可能会在桌面上显示出许多不支持线程安全的应用程序代码,而超线程则会被归咎于应用程序的故障,而不是应用程序本身。 - Grant Wagner

3

当将线程分派到同一CPU而不是不同的CPU时,超线程技术主要会在调度程序行为/性能方面产生差异...

它将在糟糕编写的应用程序中显示出来,这些应用程序不能处理线程之间的竞争条件...

因此,通常是设计/代码有问题... 突然发现故障模式条件。


2

不可靠?我不这么认为。我所能想到的超线程的唯一缺点是,如果操作系统没有意识到它,当其他物理处理器处于空闲状态时,它可能会在一个物理处理器上安排两个线程,从而降低性能。


准确的。如此解释[http://blogs.msdn.com/oldnewthing/archive/2004/09/13/228780.aspx] - Grant Wagner
Windows XP和Windows Server 2003都支持超线程技术。当面对上述情况时,这些调度程序会知道最好将一个任务放在A组中的一个处理器上,另一个任务放在B组中的一个处理器上。 - Grant Wagner

2

由于SQL Server拥有自己的调度程序,对于某些查询,与超线程存在问题,因此需要解决。通过将maxdop设置为1,可以解决这个问题。


感谢您。在http://support.microsoft.com/kb/329204找到了这个内容。 “对于启用超线程的服务器,MAXDOP值不应超过物理处理器的数量。” - Simon Hughes

2

无论 Windows 有多不稳定,它很可能不会显著地受到超线程的影响(否则现在就会成为大新闻了)。


1

我已经使用超线程PC几年了。虽然核心不是很多,但对我来说工作得很好。

希望我有测试数据来证明你的同事们错了,但现在看起来只是我的观点与他们的观点不同而已。 ;)


1
在超线程CPU中,线程共享同一缓存,因此不会遇到多CPU架构可能出现的缓存一致性问题。但是,如果软件开发人员考虑到多个CPU,他们将(或应该)使用读语义(我记得这是术语)编写代码。即所有写操作都会立即从缓存中刷新。

这是一个非常有趣的评论。由于我没有使用Itanium的经验,我通常会在指令前加上LOCK,例如LOCK INC,或者只是使用操作系统内置函数,但这就是你所说的吗?我该如何确保“所有写入立即从缓存中刷新”呢?嗯。 - pngaz
LOCK 用于锁定总线,防止读写同时进行,而不是直接刷新到 RAM。缓存嗅探消除了对写回与写直通的担忧。 - Brian Knoblauch

1
据我所知,从操作系统的角度来看,它并不认为超线程与实际多核有任何区别。从操作系统的角度来看,没有区别-它是隔离的。
因此,除了超线程的“额外核心”不是“真实”的(在严格技术意义上),并且没有“真实” CPU 核心的全部性能之外,我认为它不会更不可靠。在某些罕见情况下可能会更慢,但不会更不可靠。
当然,这取决于您运行的内容-我想一些应用程序可能会与 CPU 进行“深入交流”,而超线程可能会使它们感到困惑,但这可能非常罕见。
我自己已经使用带有超线程的 PC 已经好几年了,我没有看到稳定性问题。
很抱歉我没有更具体的数据!

1

我拥有一台i7系统,没有任何问题。

如果它可以使用多个核心,就可以使用超线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接