那里有很多文章(请参阅Slava Oks 的原始 SQL 2000 文章和Kevin Kline 的 SQL 2005 更新)建议在 SQL 服务器上禁用超线程,或者至少在您的服务器上启用它之前测试您的特定工作负载。
随着真正的多核处理器取代超线程处理器,这个问题逐渐变得不那么重要,但目前在这个问题上的智慧是什么?此建议是否对 SQL 2005 64 位、SQL 2008 或 Windows Server 2008 有任何更改?
理想情况下,这应该提前在暂存环境中进行测试,但是对于已经投入生产并启用了 HT 的服务器呢?如何判断我们遇到的性能问题是否与 HT 相关?与我在提高 SQL 性能时通常追求的所有其他事情相反,是否有一些特定的 perfmon 计数器组合可能会将我指向那个方向?
编辑:这特别有吸引力,因为我的一些高 cpu 服务器有可能全面改进,但客户希望看到一些具体的东西,帮助我确定哪些服务器真正可以从禁用超线程中受益。当然,传统的性能故障排除仍在进行中,但有时任何一点点都会有所帮助。
在 SQLOS 中,会为 SQL Server 看到的每个逻辑处理器创建一个调度程序。启用超线程后,这相当于使调度程序增加了一倍。SQLOS 的目的之一是最小化和防止发生上下文切换,这就是为什么只为每个逻辑处理器创建一个调度程序的原因。SQLOS 创建调度程序后,工作人员的总数将分配给调度程序。SQLOS 实现了一种协作调度的形式,因为工作人员在需要不可用资源时让出调度程序,或者达到其执行量允许其他工作人员在调度程序上执行。这将上下文切换保持在最低限度,因为调度程序正在执行工作并且它们是一对一的。
了解这一背景后,超线程在某种程度上与 SQLOS 的专门设计方式相反。具体来说,并行性可能会给超线程带来问题,并且可能导致高 CXPACKET 等待,因为 SQLOS 可能会尝试在 DOP 8 上运行对 DOP 4 系统的实际查询。如果您的 CPU 利用率较低,您可能不会注意到,但您的 CPU 利用率越高,问题就越严重。我最近在 Twitter 上对此进行了讨论,关于它是否会有所帮助或伤害的共识是“视情况而定”。
如果您的服务器上有很多信号等待,但 CPU 利用率较低,您可能会看到启用超线程的好处,这将使您的内部调度程序加倍并将工作人员分散更多,这意味着他们不会等待在可运行队列中执行只要。但是,如果您的工作负载大量使用并行性,您会在 sys.dm_os_wait_stats 中获得大量的 CXPACKET 等待,您可能会考虑禁用超线程以查看它是否会减少您的等待。
实际上超线程并没有消失,英特尔新的 Nehalem 四核芯片具有超线程。至于是否推荐,一如既往的“视情况而定”,每个情况可能都不一样。
HT 不太可能是任何性能问题的根本原因,但如果没有更多细节,很难说是什么。进行一些 perfmon 会话,使用相当长的采样率,例如每 30 - 60 秒一次,并获取 cpu、数据和日志磁盘上的磁盘队列长度、页面预期寿命是衡量您是否有足够内存的好方法。如果您的 CPU 始终超过 80%,或者您的磁盘队列达到三位数,那么您就发现了问题。
HP DL360 G3 上的 SQL Server 2000:
我跑了六次报告,我把最初的逃跑扔掉了,然后记录了最后五次。然后我再次重新启动数据库并重新打开超线程。我又运行了六次报告,保留了最后五次运行的数据。
观察:
重复运行报告: