禁用超线程将提高我们SQL Server安装的性能


28

相关信息:有关SQL Server和超线程的最新知识

最近,我们将Windows 2008 R2数据库服务器从X5470升级X5560。从理论上讲,两个CPU的性能非常相似,如果有的话X5560的速度会稍快一些。

但是,SQL Server 2008 R2的性能在过去大约一天中一直很差,CPU使用率也很高。

页面的预期寿命非常长,我们几乎为页面带来了100%的高速缓存命中率,因此内存不是问题。

当我跑步时:

SELECT * FROM sys.dm_os_wait_stats 
order by signal_wait_time_ms desc

我有:

wait_typewaiting_tasks_countwait_time_ms max_wait_time_ms signal_wait_time_ms
-------------------------------------------------- ---------- -------------------- -------------------- -------------------- --------------------
XE_TIMER_EVENT 115166 2799125790 30165 2799125065
REQUEST_FOR_DEADLOCK_SEARCH 559393 2799053973 5180 2799053973
SOS_SCHEDULER_YIELD 152289883 189948844 960 189756877
CXPACKET 234638389 2383701040 141334 118796827
SLEEP_TASK 170743505 1525669557 1406 76485386
LATCH_EX 97301008 810738519 1107 55093884
LOGMGR_QUEUE 16525384 2798527632 20751319 4083713
写日志16850119 18328365 1193 2367880
PAGELATCH_EX 13254618 8524515 11263 1670113
ASYNC_NETWORK_IO 23954146 6981220 7110 1475699

(受影响的10行)

我也跑了

-- Isolate top waits for server instance since last restart or statistics clear
WITH Waits AS (
   SELECT 
        wait_type, 
        wait_time_ms / 1000. AS [wait_time_s],
        100. * wait_time_ms / SUM(wait_time_ms) OVER() AS [pct],
        ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [rn]
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE',
    'SLEEP_TASK','SLEEP_SYSTEMTASK','SQLTRACE_BUFFER_FLUSH','WAITFOR','LOGMGR_QUEUE',
    'CHECKPOINT_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH','XE_TIMER_EVENT','BROKER_TO_FLUSH',
    'BROKER_TASK_STOP','CLR_MANUAL_EVENT','CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE',
    'FT_IFTS_SCHEDULER_IDLE_WAIT','XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN'))

SELECT W1.wait_type, 
    CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
    CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
    CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2 ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold

并得到

wait_type wait_time_s pct running_pct
CXPACKET 554821.66 65.82 65.82
LATCH_EX 184123.16 21.84 87.66
SOS_SCHEDULER_YIELD 37541.17 4.45 92.11
PAGEIOLATCH_SH 19018.53 2.26 94.37
FT_IFTSHC_MUTEX 14306.05 1.70 96.07

这表明大量时间同步涉及并行性的查询(高CXPACKET)。此外,许多问题查询都在多个内核上执行(我们的代码中任何地方都没有MAXDOP提示)

服务器没有超过一天左右的负载。我们在查询执行方面遇到了很大的差异,通常许多查询似乎比我们以前的数据库服务器上的查询慢,并且CPU确实很高。

禁用超线程是否有助于减少CPU使用率并提高吞吐量?



请记住,CXPACKET并不意味着有很多时间在等待将进程合并在一起。CXPACKET表示该线程正在等待另一个线程完成其处理。您需要查看在CXPACKET等待中具有线程的特定查询,并查看除CXPACKET之外还有哪些其他线程在等待。通常是IO或网络。在上面的输出中,您正在等待闩锁并进行调度。一些查询需要调整,或者您需要查看为什么使用闩锁。
mrdenny

在我们的例子中,CXPACKET很高,因为其他线程只是从高速缓存中过度读取(每个查询2000万逻辑读取)。同样,我们的案例是一个只有70万行的分区表在反半联接方面表现不佳。
ozamora

@mrdenny,是的,锁存器等待时间过长,我们正在对此进行调查。
山姆·萨弗隆

Answers:


10

我仍然认为,按照原始答案测试您的特定工作负载是唯一可以确定的方法。当您尝试调整生产系统时,这不是一个理想的答案(因此,我想问一问,是否有可能在性能和可用性都至关重要的系统中获得相同的测试平台),但这是我真正感到满意的唯一答案用。

我们可以讨论一下一般而言超线程是否应该损害或改善事物的理论(我发现它比服务器上的帮助更容易受到损害,因此对于“通用”部署,我可能会禁用它),但是有只有一种方法可以确定在特定情况下是否会有所作为,那就是尝试一下。


3
请注意,我并没有拒绝投票,我们需要获得所有帮助,但是我们希望避免在生产系统上陷入黑暗。我想确保在使用此设置进行通话之前,我们收集了足够的诊断信息。
山姆藏红花

3
我敢肯定,您确实希望避免“使用”生产系统,在理想情况下,出于这个原因,我们所有人都将拥有与生产相同的测试环境。我同意不希望改变投机生产。但是,我坚持我的回答:测试特定的工作负载是任何部署的重要组成部分,任何告诉您不同的人都是骗子。对我来说,所有迹象都表明超线程在这里是一个问题,但是我们可以整日和整夜谈论事情,但仍然只能肯定地知道一种方法。
罗伯·摩尔

5
在这里支持-我同意答案。普遍的答案是:关闭超线程。更具体的答案是:这取决于具体细节,必须进行测试。
TomTom

1
奇怪的是,我认为这是最好的答案,用maxdop设置搞乱可能会导致很多麻烦,即使在时钟速度稍慢的情况下,nehalem cpus也比基于内核的xeon快得多,我发现l2缓存的参数有点红鲱鱼的原因是l3缓存太大了。作为附录,请参阅:blog.stackoverflow.com/2010/10/database-upgrade,如果有人看到命中率/收益率超过20%...这可能不是由于HT引起的。
山姆番红花

我与@TomTom和@Robert的经历相反。我发现开启HT通常比关闭好10-15%。确实很少有将其关闭以提高性能的情况。
Brian Knoblauch

12

我同意

  • 最好的建议是“在你的工作量尝试超线程,看看会发生什么。” 我正在打字时正在执行此操作,..这不好!
  • 您应该始终从禁用超线程开始,因为这是最安全的

看来我们应该调整两件事:

  1. MAXDOP(最大并行度)。我读到的所有内容都表明,无限制的访问可能不是一个好主意,因此Microsoft文档说:

    将此选项[MAXDOP]设置为较大的值[大于8]通常会导致不必要的资源消耗和性能下降。

    8一般不建议的任何高..所以我暂时将其设置4为。最初为零(无界)。

  2. 并行成本阈值。5根据我发现的一些SQL MVP帖子,显然这里的默认值被认为是相当低的默认值-我们可以对其进行优化以减少调度程序甚至尝试了多少并行性。

但说实话,这些感觉都是解决方法;我认为针对我们的工作量(全文索引繁重)的真正解决方案是禁用HT。


4
MAXDOP还会导致HT问题,因为如果您说有8个内核和16个线程,并且您的maxdop设置为10,则它可能尝试在同一CPU上执行两个线程。通常,每个逻辑处理器最大应有1个MAXDOP。在同一个CPU上为同一进程执行两个线程是毫无意义的。
马克·亨德森

2
@Farseeker仅在您没有支持HyperThreading的操作系统时才会发生。早于2000的Windows会意识到这一点。
Mircea Chirea

值得注意的是,这些maxdop覆盖仅引起麻烦。默认情况下就没事了我们
萨姆藏红花

2
当不受限制时,SQL Server的标准版本无论如何都以4的MAXDOP最大化。需要企业超越这一点。MAXDOP为1(非HT盒,运行多个8核AMD)时,我们的某些工作负载的运行速度最快……
Brian Knoblauch

1
@Brian Knoblauch-一年后,我知道了这一点,但是我遇到了这个“标准版的SQL Server,如果不受限制的话,MAXDOP最大值为4”。我们目前正在谈论在工作中使用MAXDOP,但不确定如何设置它。这基本上意味着4与未绑定正确吗?
杰里米·A·韦斯特

9

Anandtech发现,在纯读取负载的情况下,它会受到一点伤害;在写入重负载的情况下,这是一个胜利。我没有看到任何让我认为这会让您的命中率远低于-5%或赢得远胜于15%的东西。请注意,使用Atom可以取得巨大的成功,但这是非常奇怪的CPU。

您更改的只是CPU?您从12MB高速缓存和4个线程(即每个线程3MB高速缓存)变为8 MB高速缓存和8个线程(即每个线程1MB)。现在,这太过简单了,但是我敢打赌,这就是杀死您的原因,您曾经在高速缓存中运行查询,现在从RAM运行查询,因为它们需要大于1MB但小于3MB的内存。关闭HT可能会有所帮助,但我会回到旧的CPU。关闭HT,每个线程可获得2MB的内存,但是如果您的工作量如此之大,将无济于事。很可能旧的12MB缓存cpu可以大大加快您的工作量。

我会尝试关闭HT,看看是否有改善,但是我怀疑高速缓存是您工作量的重中之重,您很可能需要回到12 MB芯片。


3
每个核心观察L2高速缓存是一个巨大的过度简单化,由于CPU是一个整代提前(的Nehalem /酷睿i7 VS的Core 2 Quad类)。
杰夫·阿特伍德

@ Jess,@ Ronald和Nehalem的二级缓存很少。批量是L3,跨内核共享。
Mircea Chirea 2010年

7

超线程充其量只是直接从L1和L2缓存直接访问而从操作系统中抽象出任务切换并将其放置在裸片上的一种方法,这使得任务切换的处理速度更快。

使用VMWare进行的测试表明,禁用HT在标准负载下没有明显区别,而在重负载下则增加了5%,这是因为ESXi足够聪明,可以知道“真实”线程和“假”线程之间的区别。 (还有很多其他功能,但这只是外行的说法)。SQL Server 2005并不是很聪明,但是将它与最新的操作系统结合在一起,禁用HT几乎没有优势。

话虽如此,我同意Ronald的观点,这很可能是您的L2缓存。缓存大小减少了33%是相当大的,当我们指定SQL Server时,每次总是以原始时钟速度进行缓存。


您可以在外部设置亲和力,以使正确的4个核心被SQL忽略吗?
山姆·萨弗隆

3
通常,您需要为每个其他CPU线程设置关联性,但是只要正确设置了MAXDOP,我就完全没有理由设置关联性。通过HT,尽管第一个线程在CPU上成为“主”线程,而第二个线程是“ HT”线程。但是,没有真正的“主”线程和“ ht”线程,因为无论是谁先到达那里,然后在他们进行任务切换时,顺序都是相反的。
马克·亨德森

基于Nehalem的CPU具有非常,非常少的L2高速缓存,其中大部分由L3共享。
Mircea Chirea 2010年

7

根据我的经验,HT使得我在Windows 2008 R2群集(运行SQL Server 2008 R2)上的活动节点上的I / O操作永远无法完成。一个有趣的事实是,它既没有反映在等待统计中,也没有反映在我为获得Microsoft支持而运行的pssdiag中。

我注意到低I / O的方式只是通过查看物理磁盘的OS计数器。正如山姆指出的那样,我在这里这里都写过

如果您没有遇到I / O问题并且受CPU限制,建议您以这种方式启动:

查明哪些进程和T-SQL块导致最多的CPU使用率。根据我们的经验,在解决了I / O问题(通过关闭HT)之后,我们确定了在2008 R2中表现出色并在2005年表现良好的代码。我在此处进行了介绍

在高负载下,运行Adam Machanic的sp_whoisactive。您可以从这里下载。由于一个非常糟糕的计划,导致逻辑读取数量过多(每个查询2000万个),因此我们遇到了很高的CPU使用率。我们的流程正在对已分区的表执行反半联接。

我的下一个建议是运行事件探查器,以识别一组CPU和I / O逻辑读取次数都很高的T-SQL代码。

通过上述步骤,我们能够调整有问题的进程,并将CPU持续使用率从85%降至几乎为零。

祝您好运,如果您找到解决方法,请随时给我留言,我想将案例添加到我的博客中。

谢谢

奥斯卡奖


1
探查器+1,一旦确定了故障点,为我节省了很多时间
Mark Henderson

+1感谢您的所有建议,将我们的SQL调整到一个合理的水平是一场噩梦,我们在很大程度上依赖全文来处理标签,我们经常在寻找特定标签的项目列表,因此我们可以全面掌握设置并过滤。例如,获取按日期排序的标签[x]和[y]的问题列表涉及从全文中提取大量数据,然后进行大量联接。
Sam Saffron

明白了 抓取一个样本并以IO ON的统计信息运行它,看看是否可以查明逻辑读取次数最多的任何表。同样,我们在2005年的表现不错,而在2008 R2中的表现则非常糟糕。如果你只是发现CPU使用率很高,并具有较高的CXPACKET等待,首先尝试通过提高并行度的成本阈值10,15,甚至20
ozamora

如果没有其他帮助,请使数据库脱机,关闭HT,然后从那里继续。祝你好运
ozamora

sp_whoisactive是一个非常棒的工具,喜欢查询可单击的方式
Sam Saffron 2010年

2

HT的好坏很难确定。

它确实确实取决于基于经验和阅读的服务器负载模式。也就是说,当它影响性能时,它会表现得很糟:否则,您不会注意到它。

我读到的理论是线程共享缓存,这意味着在不利条件下,每个线程都可以覆盖另一个线程的缓存。如果您没有太多的并行性,或者您的负载是许多短查询,那么它可能不会影响您。

我已经尝试过使用MAXDOP和处理器相关性(回到我在SQL Server 2000上的上一个真正的DBA角色),但是找不到任何结论性的东西:但仅限于当时的我的商店。

作为一项快速测试,您可以将处理器亲缘性设置为仅使用物理核心(较低的数字)并查看会发生什么。

但是,您最多损失一半的核心。如今,与几年前我玩的是2 vs 4或4 vs 8相比,这可能并不重要。现在是8 vs 16或16 vs 32。

编辑:Slava Oks的测试


0-3物理核和4-7逻辑核是什么?那是怎么回事?我们不能说,我想不出任何工具,让我知道..
杰夫·阿特伍德

2
@Jeff Atwood:我会在后面找到更多。我已经在某处阅读了它。... 暂时support.microsoft.com/kb/322385
gbn

该知识库文章几乎总结了一下。
pauska

尽管该知识库文章确实包含了一些有用的信息,但它似乎并不能直接回答杰夫关于逻辑处理器如何准确映射到物理处理器的问题。我的大脑大约炸了一半,但希望这篇INTEL文章能给您提供所需的信息,以找出对应关系:software.intel.com/en-us/articles/…另请参阅software.intel.com/en-us/ blogs / 2009/12/21 /…及其相关链接。
BradC 2010年

@Jeff Atwood,@ BradC:上帝,很难找到。看到此:它依赖于Intel建议。SQL Server将使用基础Windows枚举download.microsoft.com/download/5/7/7/…
gbn 2010年

2

不幸的是,我认为除了“尝试关闭超线程,看看是否有帮助”之外,您没有其他确定的答案。

尽管乔纳森(Jonathan)在我的原始帖子中提供了有用的答案(您在问题中进行了链接),但我始终无法获得任何有关HT对我正在调查的特定服务器的影响的确切证据。就我而言,服务器已经排定了更换时间,因此可以简单地说,让这些更换“解决问题”。

我的建议:

尝试将服务器级别的并行度设置为1。无论如何,SQL上的并行性对于较大的,运行时间较长的查询有用,而且无论如何,您的负载(我认为)由大量的较小查询组成。这应该完全消除CXPACKET等待。这可能会使某些单个查询的运行时间稍长一些,但应允许服务器上的总查询具有更大的“吞吐量”。

在OLTP服务器上执行此操作取得了良好的效果。其他类型的服务器(报告服务器,处理服务器,数据仓库)肯定需要更高的MAXDOP设置。

需要明确的是,此设置仍将允许SQL对JOIN中的每个表使用多个线程,因此您并没有真正完全消除并行性。

至少值得一试,因为此设置更改会立即生效,甚至不需要您重新启动SQL服务:http : //msdn.microsoft.com/zh-cn/library/ms181007.aspx
这意味着您可以进行切换如果事情开始到地狱,它会立即返回。

关闭BIOS中的超线程将要求服务器完全重新启动,因此风险更高。


0

记录下来,服务器升级后,我们的性能也出乎意料的糟糕。原来是由于BIOS和CPU节能问题。服务器(HP)的默认设置是忽略操作系统对CPU速度的控制,并使用其自己的算法。将其更改为OS控制,并更新BIOS,将带来重大改进。有一些发行说明(现在找不到它们)表明存在一个BIOS错误,该错误将CPU锁定在最低性能状态。

https://serverfault.com/a/196329/6390

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.