Sam*_*ron 28 hyperthreading 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
Run Code Online (Sandbox Code Playgroud)
我有:
wait_type waiting_tasks_count wait_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 睡眠任务 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
Run Code Online (Sandbox Code Playgroud)
并得到
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 使用率和增加吞吐量?
Jef*_*ood 12
我同意
看起来我们应该调整两件事:
MAXDOP(最大并行度)。我读到的一切都表明,拥有这个无限可能是一个坏主意,微软文档说:
将此选项 [MAXDOP] 设置为大于 [8] 的值通常会导致不必要的资源消耗和性能下降。
任何高于8通常不推荐的东西..所以我4现在将其设置为。它最初为零(无界)。
并行性的成本阈值。显然,5根据我发现的一些 SQL MVP 帖子,这里的默认值被认为是相当低的默认值——我们可以对其进行调整以减少调度程序甚至尝试的并行度。
但老实说,这些感觉像是变通办法;我认为我们工作负载(全文索引繁重)的真正解决方案是禁用 HT。
Rob*_*oir 10
我仍然觉得根据原始答案测试您的特定工作量是唯一确定的方法。当您尝试调整生产系统时,这不是一个理想的答案(所以我会问是否有可能在性能和可用性都非常重要的系统中获得相同的测试平台)但它是唯一一个我真的很舒服和。
我们可以讨论超线程是否应该损害或改善一般事物的理论(我发现它比对服务器的帮助更有可能受到伤害,因此对于“通用”部署我可能会禁用它),但是有只有一种方法可以确定它是否会对您的特定情况产生影响,那就是尝试看看。
Anandtech 发现,在纯读取负载下,它会受到一点伤害,而在写入负载较重的情况下,这有点胜利。我没有看到任何让我认为它会让你受到比 -5% 差得多的打击,或者比 15% 好得多的胜利。请注意,对于 Atom,这是一个巨大的胜利,但这是一个非常奇怪的 CPU。
你改变的只是cpu?您从 12MB 缓存和 4 个线程(每个线程 3MB 缓存)变为 8MB 缓存和 8 个线程,每个线程 1MB。现在,这过于简单化了,但我敢打赌,这正是您要死的原因,您曾经在缓存中运行查询,而现在从 RAM 中运行它们,因为它们需要超过 1MB 但不到 3MB。关闭 HT 可能会有所帮助,但我会回到旧 CPU。关闭 HT,您将获得每个线程 2MB 的空间,但如果您的工作负载如此之大,那将无济于事。很可能旧的 12MB 缓存 cpu 对于您的工作负载来说要快得多。
我会尝试关闭 HT,看看这是否有改进,但我怀疑缓存对于您的工作负载很重要,您可能需要回到 12 MB 芯片。
超线程充其量只是一种将任务切换从操作系统中抽象出来并将其放置在芯片上的方法,可以直接访问 L1 和 L2 缓存,这使得任务切换速度更快。
使用 VMWare 进行的测试表明,禁用 HT 在标准负载下没有明显区别,在重负载下增加 5%,因为 ESXi 足够聪明,知道“真实”线程和“假”线程之间的区别(除此之外还有很多,但这是外行人的说法)。SQL Server 2005 并不是那么智能,但它结合了最新的操作系统,禁用 HT 应该没什么好处。
综上所述,我同意 Ronald 的观点,它很可能是您的 L2 缓存。缓存大小减少了 33% 是相当可观的,当我们指定 SQL Server 时,我们总是每次都以超过原始时钟速度的速度进行缓存。
根据我的经验,HT 使 I/O 操作永远在我的 Windows 2008 R2 群集(运行 SQL Server 2008 R2)上的活动节点上进行。一个有趣的事实是,它既没有反映在等待统计数据中,也没有反映在我为 Microsoft 支持而运行的 pssdiag 中。
我注意到低 I/O 的方式只是通过观察物理磁盘的操作系统计数器。正如山姆指出的那样,我在这里和这里写过它
如果您没有遇到 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% 持续到几乎为零。
祝您好运,如果您找到解决方法,请随时给我留言,因为我想将此案例添加到我的博客中。
谢谢
奥斯卡
| 归档时间: |
|
| 查看次数: |
37881 次 |
| 最近记录: |