我们的 IT 在包含其他 VM 的大型 VMWare 盒子上将 SQL Server 设置为 VM。CPU 设置为共享。因此,任何可能需要多个 CPU 的查询所花费的时间都比我将其限制为单个 CPU 的时间长 30 倍。例子:
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
对比
SELECT TOP 2000 lwa.Message INTO #foo
FROM dbo.LogWidgetsAPI lwa (NOLOCK)
ORDER BY lwa.TimeStamp
OPTION (MAXDOP 1) ------------- Force it to run on a single CPU
第一个示例使用并行性,大约需要 30 秒左右。第二个强制使用单个 CPU 并花费 20 毫秒。
注意:运行单 CPU 查询后,我返回运行多 CPU 查询,时间和计划是相同的 - 所以我认为问题与“冷缓存”与“热缓存”无关
所以我的理论是,因为第一个查询使用多个 CPU,它必须等到所有有问题的 CPU 都空闲,因此它只是等待。
所以我的问题。SQL Server VM 应该有专用 CPU 还是共享 CPU 是正常的?
是的,这很常见。很多时候,VM 用于将大量 SQL Server(尤其是那些没有极端性能要求的 SQL Server)整合到一台主机上。这可以节省许可成本,因为 SQL Server 可以在主机级别获得许可。
这是个好主意吗?我的意思是,这在很大程度上取决于VM的超额订阅量以及工作负载的 CPU 密集程度。
看两个执行计划的截图,除了并行度外,基本相同。并行计划中的一个问题区域是“Top”操作员所在的串行区域:
将所有行放在一个线程上,然后将它们重新分配以进行并行插入会产生一些开销。不过,我不希望开销为 30 秒。
不,这不是 SQL Server 中并行性的工作方式。根据不同 CPU 的繁忙程度,扫描计划右上角的聚集索引的线程可能会执行非常不均匀的工作级别。
现在,如果这个 SQL Server 实例太忙以至于所有可用线程都被用于其他查询,那么并行查询可能正在等待
THREADPOOL
。这让我想到了下一点:并行查询很可能正在等待某些资源。我将首先查看 SSMS 中执行计划的“WaitStats”部分:
这将位于计划中最左侧运算符的“属性”窗口中。例如,
SOS_SCHEDULER_YIELD
在这种情况下,一个非常高的值可能表明此 SQL Server 实例没有启动主机 CPU。Jonathan Kehayias 在这里有一篇关于该主题的非常好的帖子:CPU 就绪对 SOS_SCHEDULER_YIELD 的影响
您还可以比较两个查询中经过的时间与 CPU 时间的比率。这些数字在同一个属性窗口中:
如果两个查询之间的比率显着不同,这是并行查询正在等待某些资源的另一个迹象。
如果您可以访问主机/虚拟化,您可以直接在那里查看统计信息,看看客人是否在等待很长时间才能在 CPU 上安排。Jonathan 在这里有另一篇关于此的帖子,专门针对 VMWare:VMware 中的 CPU 就绪时间以及如何解释其真正含义
回答最初留在评论中的内容
不,因为 VMWare 甚至看不到 SQL Server,它只能看到 Windows。它在 VM 级别而不是在 VM 中的进程级别调度 CPU。——盖乌斯
您按核心许可 SQL……为什么要与 SQL 以外的任何东西共享它?是的,超额订阅 CPU 是虚拟化的正常做法,但对于 SQL 通常不会这样做。——乔纳森·菲特
比较两个查询的逻辑 IO。如果它们与经过时间的比率相同,则管理程序不是问题。您不能在这里只比较 CPU 时间,因为 VM 线程可以在来宾中调度,而是在主机上等待。– David Browne - Microsoft
您需要监视 vm 主机上的 cpu就绪统计信息,以了解是否存在超额订阅来回答该问题。
对于 VMware 和共享 cpu,要记住的一件事是,它必须先获取 vm 已分配的 vcpus 数量,然后才能对 cpu 执行指令。
换句话说,如果您的 vm 被分配了 8 个 vcpus,但在它有处理指令时只有 4 个可用,则必须等到它获得全部 8 个才能继续。
在超额订阅的主机上,您将看到 vm 在 cpu 就绪指标中等待其开启内核的频率。该指标值经常超过 5% 是一个强有力的指标,表明存在 CPU 限制。–亚伦