我们的生产SQL Server上的主要性能问题,该如何解决?


11

此问题基本上是该问题的后续问题:
SQL Server 2016的奇怪性能问题

现在,我们使用此系统提高了生产率。尽管自上次发布以来,另一个应用程序数据库已添加到此SQL Server。

这些是系统统计信息:

  • 128 GB RAM(SQL Server最大110GB内存)
  • 4核心@ 2.6 GHz
  • 10 GBit网络连接
  • 所有存储均基于SSD
  • 程序文件,日志文件,数据库文件和tempdb位于服务器的单独分区上
  • Windows Server 2012 R2
  • VMware版本HPE-ESXi-6.0.0-Update3-iso-600.9.7.0.17
  • VMware Tools版本10.0.9,内部版本3917699
  • Microsoft SQL Server 2016(SP1)(KB3182545)-13.0.4001.0(X64)2016年10月28日18:17:30版权所有(c)Windows Server 2012 R2 Standard 6.3(Build 9600 :)上的Microsoft Corporation标准版(64位) (主管)

在此处输入图片说明

我们的系统现在存在主要的性能问题。很高的CPU使用率和线程数: 在此处输入图片说明

活动监视器的等待统计信息(我知道这不是很可靠)

在此处输入图片说明

sp_blitzfirst的结果:

在此处输入图片说明

sp_configure的结果:

在此处输入图片说明

进阶伺服器设定(只有德文才可使用)

在此处输入图片说明

我更改了MAXDOP设置。

我知道这可能不是SQL Server本身的问题。可能是虚拟化(vmware),与网络相关(我已经测试过)或应用程序本身的问题。我只是想进一步确定它。

高ASYNC_NETWORK_IO是否会导致sqlserver进程的线程数增加?我以为它会激怒许多工作人员,因为无法关闭线程。那正确吗?

我将提供您需要的任何其他信息。预先感谢您的支持!

编辑:

的结果 sp_Blitz @OutputType = ‘markdown’, @CheckServerInfo = 1

优先级1:备份

  • 备份到数据库所在的同一驱动器-在过去两个星期中,在驱动器E:\上完成了5次备份,其中数据库文件也存在。如果该阵列发生故障,则表示严重的风险。

优先级1:可靠性

  • 过去2周以上的上次优良DBCC CHECKDB

    • babtec_prod-上次成功的CHECKDB:2017-08-20 00:01:01.513

    • D3PR-上一次成功的CHECKDB:永不。

    • DEMO77-上一次成功的CHECKDB:2016-02-23 20:31:38.590

    • FINP-上一次成功的CHECKDB:2017-04-23 22:01:19.133

    • GridVis_EnMs-上一次成功的CHECKDB:2017-05-18 22:10:48.120

    • master-上次成功的CHECKDB:永不。

    • 模型

    • 数据库

    • PROD77-上次成功的CHECKDB:2016-02-23 21:33:24.343

优先级10:效果

  • 查询存储已禁用-新的SQL Server 2016查询存储功能尚未在此数据库上启用。

    • babtec_prod

    • D3PR

    • 演示77

    • 财务报表

    • GridVis_EnMs

优先级50:DBCC事件

  • DBCC DROPCLEANBUFFERS-用户schorsch在2017年9月21日11:57 AM和2017年9月21日11:57 AM之间运行DBCC DROPCLEANBUFFERS 1次。如果这是生产包装箱,请知道在发生这种情况时您正在清除内存中的所有数据。什么样的怪物会那样做?

  • DBCC SHRINK%-用户schorsch已在2017年9月21日11:51 PM和Okt 4 2017 9:02 AM之间缩小了6倍。那么,呃,他们是在尝试修复腐败还是造成腐败?

  • 总体事件-在2017年9月19日1:40 PM和10月4日3:20 PM之间发生了287个DBCC事件。这不包括CHECKDB和其他通常为良性的DBCC事件。

优先级50:效果

  • 文件增长缓慢PROD77-2次增长花费了超过15秒。考虑将文件自动增长设置为较小的增量。

优先级50:可靠性

  • 页面验证不是最佳的babtec_prod-数据库[babtec_prod]具有TORN_PAGE_DETECTION用于页面验证。SQL Server可能很难识别和从存储损坏中恢复。考虑改用CHECKSUM。

优先级100:效果

  • 一个查询的许多计划-在计划缓存中为单个查询提供了3576个计划-这意味着我们可能存在参数化问题。

优先级110:效果

  • 没有聚簇索引的活动表

    • babtec_prod-[babtec_prod]数据库具有正在被主动查询的堆-没有聚集索引的表。

    • D3PR-[D3PR]数据库具有正在被主动查询的堆-没有聚集索引的表。

    • DEMO77-[DEMO77]数据库具有正在被主动查询的堆-没有聚集索引的表。

    • FINP-[FINP]数据库具有正在被主动查询的堆-没有聚集索引的表。

    • GridVis_EnMs-[GridVis_EnMs]数据库具有正在被主动查询的堆-没有聚集索引的表。

    • PROD77-[PROD77]数据库具有正在被主动查询的堆-没有聚集索引的表。

优先级150:效果

  • 不信任外键

    • babtec_prod-[babtec_prod]数据库中的外键可能已被禁用,数据已更改,然后再次启用了该键。仅启用密钥不足以使优化器使用此密钥-我们必须使用WITH CHECK CHECK CONSTRAINT参数更改表。

    • D3PR-[D3PR]数据库中的外键可能已被禁用,数据已更改,然后再次启用了该键。仅启用密钥不足以使优化器使用此密钥-我们必须使用WITH CHECK CHECK CONSTRAINT参数更改表。

  • 没有聚集索引的不活动表

    • D3PR-[D3PR]数据库具有堆-没有聚集索引的表-自上次重新启动以来尚未查询过。这些备份表可能会被不小心遗忘。

    • GridVis_EnMs-[GridVis_EnMs]数据库具有堆-没有聚集索引的表-自上次重新启动以来尚未对其进行查询。这些备份表可能会被不小心遗忘。

  • 表上的触发器babtec_prod-[babtec_prod]数据库具有26个触发器。

优先级170:文件配置

  • C盘上的系统数据库

    • master-master数据库在C驱动器上有一个文件。将系统数据库放在C驱动器上可能会导致服务器空间不足而使服务器崩溃。

    • 模型-模型数据库在C驱动器上有一个文件。将系统数据库放在C驱动器上可能会导致服务器空间不足而使服务器崩溃。

    • msdb-msdb数据库在C驱动器上有一个文件。将系统数据库放在C驱动器上可能会导致服务器空间不足而使服务器崩溃。

170优先级:可靠性

  • 档案大小上限

    • D3PR-[D3PR]数据库文件d3_data_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_data_idx_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_firm_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_firm_idx_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_log_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_phys_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_phys_idx_01的最大文件大小设置为61440MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_sys_01的最大文件大小设置为20480MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_usr_01的最大文件大小设置为20480MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_wort_01的最大文件大小设置为20480MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

    • D3PR-[D3PR]数据库文件d3_wort_idx_01的最大文件大小设置为20480MB。如果空间不足,即使可能有可用的驱动器空间,数据库也将停止工作。

优先级200:信息类

  • 备份压缩默认关闭-最近未压缩​​的完整备份已发生,并且备份压缩未在服务器级别打开。备份压缩包含在SQL Server 2008R2和更高版本中,即使在Standard Edition中也是如此。我们建议默认情况下启用备份压缩,以便临时备份将被压缩。

  • 排序规则为Latin1_General_CS_AS FINP-用户数据库和tempdb之间的排序规则差异可能会导致冲突,尤其是在比较字符串值时

  • 排序规则为SQL_Latin1_General_CP1_CI_AS-用户数据库和tempdb之间的排序规则差异可能导致冲突,尤其是在比较字符串值时

    • 演示77

    • PROD77

  • 已配置链接服务器-BWIN2 \ INFOR被配置为链接服务器。在与sa连接时检查其安全配置,因为查询它的任何用户都将获得管理员级别的权限。

优先级200:监控

  • 没有失败电子邮件的座席工作

    • 尚未将作业syspolicy_purge_history设置为在失败时通知操作员。

    • 尚未将作业upd_durchpreis_monatl设置为在失败时通知操作员。

    • 尚未将作业upd_fertmengen_woche设置为在失败时通知操作员。

    • 尚未将作业upd_liegezeit_monatl设置为在失败时通知操作员。

    • 尚未将作业upd_vertreter_diff设置为在失败时通知操作员。

    • 尚未将作业UPDATE_CONNECT_IK设置为在失败时通知操作员。

    • 作业Wartung.Cleanup尚未设置为在失败时通知操作员。

    • 尚未设置作业Wartung.DBCC Check DB来通知操作员失败。

    • 尚未设置作业Wartung.Index neuerstellen来通知操作员是否失败。

    • 尚未设置作业Wartung.Statistiken aktualisieren来通知操作员失败。

    • 尚未设置作业Wartung.Transactionlog Backup来通知操作员失败。

    • 尚未设置作业Wartung.Vollbackup SystemDB来通知操作员失败。

    • 尚未设置作业Wartung.Vollbackup UserDB来通知操作员失败。

  • 没有损坏警报-错误823、824和825不存在SQL Server代理警报。这三个错误可以为您提供有关早期硬件故障的通知。启用它们可以防止您很多伤心欲绝。

  • 对于19-25级,没有警报-严重级别19到25不存在SQL Server代理警报。这是一些非常严重的SQL Server错误。知道这些情况正在发生,可以使您更快地从错误中恢复。

  • 并非所有警报都已配置-并非所有SQL Server代理警报都已配置。这是一种免费,简便的方法,即使在监视系统启动之前,也可以通知您有关损坏,作业失败或重大停机的信息。

优先级200:非默认服务器配置

  • 代理XPs-此sp_configure选项已更改。其默认值为0,并且已设置为1。

  • 数据库邮件XP-此sp_configure选项已更改。其默认值为0,并且已设置为1。

  • 默认的全文本语言-此sp_configure选项已更改。默认值为1033,已设置为1031。

  • 默认语言-此sp_configure选项已更改。其默认值为0,并且已设置为1。

  • 文件流访问级别-此sp_configure选项已更改。其默认值为0,并且已设置为1。

  • 最大并行度-此sp_configure选项已更改。其默认值为0,并且已设置为4。

  • 服务器最大内存(MB)-此sp_configure选项已更改。默认值为2147483647,已设置为115000。

  • 最小服务器内存(MB)-此sp_configure选项已更改。其默认值为0,并且已设置为10000。

  • 远程管理员连接-此sp_configure选项已更改。其默认值为0,并且已设置为1。

优先级200:效果

  • 并行性的成本阈值-设置为5,其默认值。更改此sp_configure设置可以减少CXPACKET等待。

  • 发生快照备份-在过去两周中进行了9次看似快照的备份,表明IO可能已冻结。

优先级210:非默认数据库配置

  • 启用读取提交的快照隔离-此数据库设置不是默认值。

    • D3PR

    • 财务报表

  • 递归触发器已启用-此数据库设置不是默认值。

    • 演示77

    • PROD77

  • 启用了快照隔离FINP-此数据库设置不是默认设置。

优先级240:等待状态

  • 1-ASYNC_NETWORK_IO-等待225.9小时,每小时平均等待时间143.5分钟,信号等待0.2%,2146022等待任务,平均等待时间378.9 ms。

  • 2-CXPACKET-等待时间为43.1小时,每小时平均等待时间为27.4分钟,信号等待时间为1.5%,等待任务为32608391,平均等待时间为4.8 ms。

优先级250:信息性

  • SQL Server在NT服务帐户下运行

    • 我以NT Service \ MSSQL $ INFOR的身份运行。我希望我有一个Active Directory服务帐户。

    • 我以NT Service \ SQLAgent $ INFOR的身份运行。我希望我有一个Active Directory服务帐户。

优先级250:服务器信息

  • 默认跟踪内容-默认跟踪在2017年9月3日8:34 PM和Okt 5 2017 12:50 PM之间保存760个小时的数据。默认跟踪文件位于:C:\ Program Files \ Microsoft SQL Server \ MSSQL13.INFOR \ MSSQL \ Log

  • C盘空间-C盘上21308.00MB可用空间

  • D盘空间-D盘上280008.00MB可用空间
  • Drive E Space-E盘上有281618.00MB可用空间
  • F盘空间-F盘上60193.00MB可用空间

  • 硬件-逻辑处理器:4.物理内存:128GB。

  • 硬件-NUMA Config-节点:0状态:ONLINE在线调度程序:4脱机调度程序:0处理器组:0内存节点:0内存VAS保留GB:281

  • 服务器最后一次重启-Okt 1 2017 2:21 PM

  • 服务器名称-BWINPDB \ INFOR

  • 服务

    • 服务:SQL Server(INFOR)在服务帐户NT Service \ MSSQL $ INFOR下运行。上次启动时间:Okt 1 2017 2:22 PM。启动类型:自动,当前正在运行。

    • 服务:SQL Server-Agent(INFOR)在服务帐户NT Service \ SQLAgent $ INFOR下运行。上次启动时间:未显示。启动类型:自动,当前正在运行。

  • SQL Server上一次重新启动-Okt 1 2017 2:22 PM

  • SQL Server服务-版本:13.0.4001.0。补丁程序级别:SP1。版本:标准版(64位)。AlwaysOn启用:0。AlwaysOn经理状态:2

  • 虚拟服务器-类型:(HYPERVISOR)

  • Windows版本-您正在运行Windows的非常现代的版本:Server 2012R2时代,版本6.3

优先级254:运行日期

  • 船长的日志:给某事加注星标...

编辑:

我已经研究了有关使用vmware设置sql服务器的最佳实践指南,并且我们已经根据本文对其中的大部分进行了设置。但是,超线程未激活,并且NUMA在vmware主机上未处于活动状态。SQL Server设置为NUMA。

编辑:

在将并行度的阈值设置为50之后,我已经发布了RECONFIGURE,我的MAXDOP设置也没有配置。

我还检查了我们的vmware管理员,好像我被误导了。我们的CPU设置为2.6 GHz而不是4.6 GHz。我已经更正了以上信息。

编辑:

我们试图根据此vmwarekb指南设置一些与网络相关的内容。我们还为VM添加了4个内核。CPU使用率保持不变。

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


感谢您提供背景信息。首先按照此处所述运行sp_Blitz并将其粘贴到您的问题中:brentozar.com/archive/2009/03/getting-help-with-a-slow-query
Brent Ozar

@BrentOzar,我加sp_blitz的结果,我的帖子
Emptyslot

3
好,坏消息:答案仍然与您得到的最后一个答案相同。ASYNC_NETWORK_IO表示SQL Server已完成对查询结果的处理,并且它正在管道另一端的计算机上等待摘要结果。请参阅原始答案:dba.stackexchange.com/a/186602/426
布伦特·奥扎尔

@Emptyslot,请确保遵循VMWare上的SQL Server最佳实践:vmware.com/content/dam/digitalmarketing/vmware/en/pdf/solutions/…
丹·古兹曼

您可以检查电源计划是否设置为高性能,而不是默认设置(平衡)。由于它是默认设置,因此我已经看到了很多问题。
金莎(Kin Shah)

Answers:


18

就像您上次询问此问题时所讨论的那样,最紧要的等待是ASYNC_NETWORK_IO。SQL Server在管道的另一端等待机器消化下一行查询结果。

我从sp_Blitz的等待统计结果中获得了此信息(感谢您将其粘贴):

1-ASYNC_NETWORK_IO-等待225.9小时,每小时平均等待时间143.5分钟,信号等待0.2%,2146022等待任务,平均等待时间378.9 ms。

不要对CPU线程进行故障排除-无关紧要。关注您的主要等待类型以及可能导致该等待类型的事物。

若要进一步解决此问题,请运行sp_WhoIsActivesp_BlitzFirst(免责声明:我是其中之一)-两者都将列出当前正在运行的查询。查看等待信息列,找到等待ASYNC_NETWORK_IO的查询,并查看它们从中运行的应用程序和服务器。

从那里,您可以尝试:

  • 检查这些应用程序服务器是否电量不足(例如,如果它们在CPU上已用尽或正在分页到磁盘)并对其进行调优
  • 与应用程序开发人员合作,以查看他们是否对结果进行逐行处理(例如,对于从SQL Server返回的每一行,该应用程序都会关闭并进行一些处理,然后再请求下一行结果)
  • 与应用程序开发人员一起选择较少的数据(例如,如果不需要全部数据,则减少行数或减少列数-有时当人们不小心执行SELECT *并带回比他们需要的更多数据,或者他们要求提供数据时,您会看到这种情况所有的行,当它们只真正需要前1000个时)

使用sp_WhoIsActive更新 -在您发布的sp_WhoIsActive屏幕截图中,您有几个正在等待ASYNC_NETWORK_IO的查询。对于这些,请参考以上说明。

在其余查询中,查看sp_WhoIsActive的“状态”列-其中大多数处于“睡眠状态”。这意味着他们根本不工作-他们正在等待管道另一端的应用程序发送下一条命令。它们具有打开的事务(请参见“ open_tran_count”列),但是SQL Server无法采取任何措施来加速休眠的事务。这些查询已经打开了四十分钟(sp_WhoIsActive的第一列。它们不再做任何事情。您必须让那些人来提交事务并关闭他们的连接。这不是性能调整的问题。

我们在这里看到的所有内容都指向我们正在等待应用程序的场景。


感谢您的回答。我们已经检查了应用程序服务器,它们没有动力不足。我们正在检查您的其他观点。有很多语句执行类似SELECT别名的操作。* FROM表别名WHERE alias.clumn =值AND CreateDate> = SomeDate。这不是很漂亮,但是与在我们的ERP系统的最新版本(Infor COM 7.1)和oracle 9g中“平稳”运行的SQL语句相同。为什么使用MS SQL Server和Infor COM 7.1会使运行情况变差。没有任何陈述可以支持我们。我们的erp顾问会检查我发送给他的所有信息。
放空

1
OK,您需要从标记为“进一步解决此问题”的部分开始,这是下一步。我再说不清楚。谢谢!
布伦特·奥扎尔

1
那就是我在做什么。我正在将这两个过程显示的查询发送给我们的顾问。
放空

@Emptyslot很好,您知道这是怎么回事,不能相信那些顾问。;-)
布伦特·奥扎尔

5
@Emptyslot-这将是我最后一次答复,除非您现在输入我已要求的内容三遍:运行sp_WhoIsActive或sp_BlitzFirst(免责声明:我是该文件的作者之一)-这两个文件都会列出当前正在运行的查询。这还将包括您的SSMS连接,并显示它正在等待什么。请了解,我在这里自愿提供时间来帮助您,我一直很有礼貌,但是礼貌不止于此:做我已要求您做3次的事情。
布伦特·奥扎尔

2

回答我自己的问题。实际上,ASYNC_NETWORK_IO并不是真正的问题。我们通过针对延迟敏感的工作负载遵循此指南来解决性能问题:

在vSphere VM中优化延迟敏感工作负载的性能的最佳实践

我在这里用黄色标记了我们应用于系统的设置:

在此处输入图片说明

我认为影响最大的设置是numa配置,并将延迟敏感度设置为。这两者都需要为VM显式分配/保留物理CPU内核和RAM。

我们还为VM添加了更多核心,现在需要将SQL Server许可证从Standard升级到Enterprise。


1
感谢您分享您的答案详细信息。我们也在Vsphere中运行SQL,如果出现问题,可能需要检查这些选项。请保持这个答案。抱歉有人-1对您。+1
斯汀

是Ommu仅针对SQL Server还是针对应用程序进行了调整?
eckes

我们还使用该设置调整了应用服务器。我们还考虑将延迟时间设置为中/正常来调整虚拟桌面。我的猜测是,这将解决我们对async_network_io问题
Emptyslot

1

Windows似乎将4.6Ghz CPU内核的时钟速度报告为2.6Ghz ...我将运行类似CPU-Z的工具来检查它们实际以什么速度运行,然后查看更改以下设备的电源设置Windows和BIOS / Management OS均禁用了可能将内核限制为较低速度的任何节能设置。


我被误导了,CPU核心一直都是2.6 GHz。主机和客户机上都没有活动的节能设置。
放空

我将更仔细地查看“没有聚集索引的活动表”警告。如果您有大量正在积极查询的堆,这将严重
损害

不幸的是,只有一个表没有聚簇索引。它有两列,其中一列是NVARCHAR,另一列是数据类型IMAGE。第一列已经具有非聚集唯一索引,我还添加了聚集索引。但这并没有太大帮助。
放空
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.