分配更多 CPU 和 RAM 后降低 SQL Server 性能

Jef*_*eff 35 performance sql-server sql-server-2008-r2 windows-server

我们在虚拟 Windows 2008 R2 服务器上运行 SQL Server 2008 R2 (10.50.1600)。在将 CPU 从 1 核升级到 4 核并将 RAM 从 4 GB 升级到 10 GB 后,我们注意到性能更差。

我看到的一些观察:

  1. 运行时间 <5 秒的查询现在需要 >200 秒。
  2. CPU 被锁定在 100,而 sqlservr.exe 是罪魁祸首。
  3. 一个有 460 万行的表上的 select count(*) 花费了 90 多秒。
  4. 服务器上运行的进程没有改变。唯一的变化是增加了 cpu 和 ram。
  5. 其他 sql 服务器有一个静态分页文件,该服务器设置为自行管理它。

有没有人遇到过这个问题?

根据 sp_BlitzErik,我跑了

EXEC dbo.sp_BlitzFirst @SinceStartup = 1;
Run Code Online (Sandbox Code Playgroud)

给我这些结果。

等待统计

Eri*_*ing 56

这里发生了很多事情,其中​​大部分内容非常广泛和模糊。

  1. 2008R2 RTM 于 2010 年 4 月 21 日发布。它完全停止支持。您需要优先获取最新的 Service Pack,该 Service Pack 大约在 3 年前推出至今。这样,如果您遇到奇怪的错误或其他问题,您将得到保障。头部在这里找出你需要下载的内容。

  2. 由于您添加了 vCPU(从 1 到 4)并且没有更改任何设置,因此您的查询现在可以并行进行。我知道这听起来他们都会更快,但坚持住!

  3. 您可能已经添加了 RAM,但您可能没有更改 Max Server Memory,以便您的服务器可以利用它。

  4. 弄清楚您的服务器正在等待什么。我参与的一个开源项目提供了免费脚本来帮助您衡量 SQL Server。头在这里,如果你想给他们一个尝试。

你会想抓住 sp_BlitzFirst 来检查你的服务器的等待统计数据。您可以通过几种方式运行它。

这将显示您的服务器自启动以来一直在等待的内容。

EXEC dbo.sp_BlitzFirst @SinceStartup = 1;

这将在 30 秒的窗口中向您显示现在正在等待的查询。

EXEC dbo.sp_BlitzFirst @Seconds = 30, @ExpertMode = 1;

一旦你弄清楚什么查询正在等待(有大量关于等待统计的内容),你就可以开始进行更改以控制事情。

如果您看到它们正在等待CXPACKET,则意味着您的查询正在并行进行,并且可能会相互践踏。如果您达到此目标,您可能需要考虑将并行度的成本阈值提高到 50,并且可能将 MAXDOP 降低到 2。

在此步骤之后,您想使用sp_WhoIsActive或 sp_BlitzWho(后者位于之前的 GitHub 存储库中)之类的内容来开始捕获查询计划。除了等待统计数据之外,它们是您可以查看以找出问题所在的最重要的事情之一。

您可能还想查看 Jonathan Kehayias 撰写的关于VMWare Counters 的这篇文章,以查看与 SQL Server 相关的信息。

更新

查看等待统计数据和男孩,他们很奇怪。CPU肯定有问题。您的服务器大多无聊地坐着,但是当事情升温时,事情就会变得更糟。我会尽量轻松地解决这个问题。

  1. 您遇到了一个名为的毒药等待THREADPOOL。你没有很多,但这是有道理的,因为你的服务器不是非常活跃。我将在一分钟内解释原因。

  2. 您在SOS_SCHEDULER_YIELD和上的平均等待时间非常长CXPACKET。您在 VM 上,所以您要确保 SQL Server 有保留,或者该框没有严重超额订阅。一个吵闹的邻居真的会毁了你在这里的一天。您还需要确保服务器/VM 来宾/VM 主机不在平衡电源模式下运行。这会使您的 CPU 转速降低到不必要的低速,而且它们不会立即恢复到全速。

  3. 他们是如何结合的?使用 4 个 CPU,您有 512 个工作线程。请记住,单个 CPU具有相同的数量,但现在您的查询可以并行执行,它们可以消耗更多的工作线程。在您的情况下,并行查询的每个并行分支有 4 个线程。

什么是平行的?最有可能的一切。对于并行默认的成本阈值是5,这个数字有人提出,看着桌面上工作90年代末的某个时候默认这样

坚果

诚然,您的硬件比大多数笔记本电脑要小,但您仍然领先于此。

当大量并行查询开始时,您将耗尽这些工作线程。发生这种情况时,查询只是等待线程开始运行。这也是SOS_SCHEDULER_YIELD切入点。查询正在退出 CPU,并且很长一段时间内都不会重新启动。我没有看到任何阻塞等待,所以你很可能只是对查询内并行等待感到厌烦。

你能做什么?

  1. 确保没有任何东西处于平衡功率模式
  2. 将 MAXDOP 更改为 2
  3. 将并行性的成本阈值更改为 50
  4. 按照上面的 Jon K. 文章验证 VM 运行状况
  5. 使用调用的脚本sp_BlitzIndex查找任何丢失的索引请求。

如需更彻底的故障排除,请查看我为 Google 撰写的有关云中硬件大小调整的白皮书

希望这可以帮助!


thu*_*con 10

是的!我在我们的服务器场中的 SQL Server 虚拟机上遇到过这种情况。查看虚拟机的主机 CPU 就绪时间和内存气球驱动程序计数器。 CPU 就绪时间 - 博客第一部分了解 VMware Ballooning 与我的系统管理员一起工作是关键,但并不容易...


小智 5

我没有看到指出的一件事是,将 vCPU 添加到 VM 通常会由于调度而减慢它的速度。

基本思想是,如果 VM 有 4 个 vCPU,那么管理程序必须等待 4 个物理内核可用,以便可以调度所有 vCPU,即使其中 3 个处于空闲状态。

如果您的主机中没有很多内核,并且您的其他工作负载很忙,这可能会导致额外的等待和性能的显着下降。

在 VMware ESXi 中,您可以通过 CPU Ready 在高级图表中看到它。

这是许多文章中的一篇,其中包含发生这种情况的真实示例以及如何诊断

如果 VM 的 RAM 分配大于 NUMA 节点,则添加更多 RAM 也会导致性能突然下降。

此外,vCPU 的配置(vSocket 与 vCore)实际上会影响某些应用程序,例如 SQL Server。这是因为 SQL Server 本身可以识别 NUMA(以避免相同类型的 NUMA 跨越性能下降),并且因为 VMware 可能会以不同的方式呈现虚拟 NUMA 节点。

VMware 自己网站上的一篇博文对此进行了介绍


话虽如此,我很高兴您在 Erik 的帮助下解决了这些问题,但您可能也想查看并考虑这些问题。