SQL Server 2016的奇怪性能问题


14

我们在VMware虚拟机中运行SQL Server 2016 SP1的单个实例。它包含4个数据库,每个数据库用于一个不同的应用程序。这些应用程序都位于单独的虚拟服务器上。它们都没有在生产中使用。但是,测试应用程序的人员正在报告性能问题。

这些是服务器的统计信息:

  • 128 GB RAM(SQL Server最大110GB内存)
  • 4核@ 4.6 GHz
  • 10 GBit网络连接
  • 所有存储均基于SSD
  • 程序文件,日志文件,数据库文件和tempdb位于服务器的单独分区上
  • 阿斯

用户正在通过基于C ++的ERP应用程序执行单屏访问。

当我ostress使用许多小型查询或大型查询对Microsoft的SQL Server进行压力测试时,我将获得最佳性能。唯一的限制是客户,因为他不能足够快地回答。

但是,当几乎没有用户时,SQL Server几乎什么也不做。然而,人们必须永远等待以保存应用程序中的所有内容。

根据Paul Randal的“ 告诉我哪里疼 ”查询,所有等待事件中有50%是ASYNC_NETWORK_IO

这可能意味着网络问题,或者应用程序服务器或客户端的性能问题。这些都无法最大程度地远程使用其资源。大多数情况下,所有计算机(客户端,应用服务器,数据库服务器)上的CPU大约占26%。

网络连接的延迟约为1-3ms。在正常使用该应用程序期间,数据库服务器的IO最高写入速度为20MB / s(平均为7-9MB / s)。当我进行压力测试时,最高速度达到5GB / s。

对于我们的ERP系统数据库,缓冲区高速缓存大小为60GB,对于我们的财务软件,为20GB,对于质量保证软件,为1GB,对于文档归档系统,为3GB。

我授予了SQL Server帐户使用即时文件初始化的权利。丝毫没有提高性能。

在正常使用期间,页面预期寿命约为15k +。在预期的重压力测试结束时,该值下降至.05k左右。批处理/秒约为2-8k,具体取决于工作负载。

我会说ERP应用程序写得不好,但是我不能,因为所有应用程序都受影响。即使工作量最少。

但是我无法查明是什么原因造成的。是否有任何提示,提示教程,应用程序,最佳/最差实践文档或其他有关此问题的想法?

这些是来自的结果sp_BlitzFirst

在此处输入图片说明

在此处输入图片说明

我跑了600秒。我在工作量很大的应用程序中启动了它。是1/3的时间ASYNC_NETWORK_IO。我还测试与网络连接NTttcpPsPingipferf3,和pathping。没什么不寻常的。响应时间最大3毫秒,平均0.3毫秒。吞吐量约为1000 MB / s。

我的调查总是导致ASYNC_NETWORK_IOwaitstat排名第一。

我们调查了Large-Receive-Offload在VMware 中禁用该功能的结果。我们仍在测试中,但结果似乎不一致。我们的第一个“基准测试”持续了19分钟(最高结果是13分钟,只有当应用程序在具有SQL Server本身的VM上运行时才能实现)。第二个结果是28分钟,这确实很糟糕。

我们的“基准测试”的第一结果是19分钟。哪个好 因为最高的结果是13分钟(仅当应用程序使用SQL Server本身在VM上进行基准测试时才可以实现)。这强烈暗示了一些与网络有关的问题。或VMware配置出现问题。

我目前迷失于使用哪种方法来确定瓶颈。

仅当应用程序在带有SQL Server本身的VM上运行时,才能实现该应用程序的最佳性能。如果该应用程序在任何其他VM或虚拟桌面上执行,则基准测试的持续时间将增加两倍(从13分钟持续时间增加到40分钟或更长)。所有端点(SQL Server的VM,应用程序服务器的VM和虚拟桌面)都使用相同的物理硬件。我们已将所有其他端点移至其他硬件。

编辑:似乎问题又回来了。将节能模式从平衡设置为高性能后,我们实际上大大缩短了响应时间。但是今天,我再次运行了sp_BlitzFirst,并进行了300秒的采样。结果如下:

这是结果

它显示的ASYNC_NETWORK_IO等待时间比sp_blitzfirst运行的秒数要多。

Answers:


18

如果您的主要等待时间是ASYNC_NETWORK_IO,则问题不在于SQL Server。几乎总是由于应用程序瓶颈。我并不是说应用服务器上的瓶颈,而是应用程序上的瓶颈。

应用程序瓶颈通常是由于在SQL Server发送数据时进行逐行处理:

  • 该应用程序正在从SQL Server请求数据
  • SQL Server正在快速发送数据
  • 该应用程序告诉SQL Server等待处理每一行
  • SQL Server ASYNC_NETWORK_IO在应用程序告诉它等待时记录等待时间

取而代之的是,应用程序需要使用来自SQL Server的所有数据,然后进行逐行处理。此时,SQL Server无法显示。

sp_BlitzFirst 输出

LCK_M_S等待不高。30秒样本中只有2秒在上面,平均时间只有400毫秒。那是非常非常不可能的问题。ASYNC_NETWORK_IO是该示例中最需要等待的时间。仍然是应用程序问题。如果您需要有关这些LCK东西的帮助,我们需要查看所涉及的查询。

ASYNC_NETWORK_IO在那个样本中甚至还算不错。当等待时间等于或大于样本大小时,我的眼睛变大。那是我挖的时候。

您的整个问题是ASYNC_NETWORK_IO。这不是SQL Server问题。应用程序(在SQL Server发送数据时进行逐行处理),应用程序服务器(您已经说过很好)或网络(您说过网络都很好)都存在问题。所以问题出在应用程序上。C ++应用程序需要修复。


6

回答我自己的问题:ASYNC_NETWORK_IO在我们的SQL Server上显示为最主要的等待类型的主要原因energy saving是Windows服务器的设置设置为'balanced'而不是'high performance'。之后,我们与一些虚拟机管理员进行了交谈,他们都说,此设置会降低性能

解决方案是:

  • 安装Windows Server时不要安装能量控制
  • 通过组策略将所有服务器的节能模式设置为高性能

有关ASYNC_NETWORK_IO的所有其他问题/统计信息都与我们的ERP应用程序编写不正确有关。感谢所有帮助我解决此问题的人,我们非常欢迎您的意见,建议和建议!


现在,许多BIOS可以更精细地控制节能,例如NIC能源管理。我想知道是否仍有可能继续调整频率,并通过仅禁用其节能模式来避免IO在NIC上等待。
ajeh '18
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.