为什么我的Azure SQL(SQL Server)数据库一次又一次出现数据IO超载?[关闭]


9

我正在S2版(50个DTU)下运行Azure SQL数据库。服务器的正常使用通常挂在10%左右的DTU上。但是,此服务器通常会进入一种状态,它将在数小时内将数据库的DTU使用率发送到85-90%。然后突然恢复到正常的10%使用率。

在此处输入图片说明

在此过载状态下,从应用程序对服务器进行的查询似乎仍在快速运行。

我可以从S2 =>任何东西(例如,S3)=> S2扩展服务器,似乎可以清除它挂起的任何状态。但是几个小时后,它将再次重复相同的重载状态周期。我注意到的另一个奇怪的事情是,如果我在S3计划(100 DTU)24/7上运行此服务器,则没有观察到此行为。当我将数据库缩减为S2计划(50 DTU)时,似乎只会发生这种情况。在S3计划中,我总是以5-10%的DTU使用率。显然未得到充分利用。

我已经检查了Azure SQL查询报告以查找流氓查询,但是我并没有发现任何异常,它显示了我所期望的使用资源的查询。

在此处输入图片说明

正如我们在这里看到的那样,用法全部来自数据IO。如果我更改此处的性能报告以按MAX显示热门的数据IO查询,我们将看到以下内容:

在此处输入图片说明

查看这些长期运行的需求似乎指向统计信息更新。从我的应用程序运行的内容实际上并不是什么。例如,查询16302显示:

SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000]  FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM [dbo].[Cipher] TABLESAMPLE SYSTEM (1.250395e+000 PERCENT) WITH (READUNCOMMITTED) ) AS _MS_UPDSTATS_TBL_HELPER ORDER BY [SC0], [SC1], [SC2], [SB0000] ) AS _MS_UPDSTATS_TBL  OPTION (MAXDOP 16)

但是再次,该报告还显示,这些查询仅使用服务器上数据IO使用的一小部分(<4%)。作为常规维护的一部分,我还每周对整个数据库运行统计信息更新(和索引重建)。

这是另一个报告,该报告显示MAX数据IO查询的时间跨度仅在高资源使用事件期间涵盖数小时。

在此处输入图片说明

如我们所见,并不是所有查询都报告大量数据IO使用情况。

我也已经在数据库上运行sp_who2sp_whoisacive并没有真正看到任何东西出现在我身上(尽管我承认我不是这些工具的专家)。

我如何知道这里发生了什么?我认为没有任何应用程序查询应归咎于这种资源的使用,我感觉到在服务器的后台运行着一些内部进程正在杀死它。


因此,您看到正在运行更新统计信息,这自然会带来一些可观的I / O成本,对吗?如果该查询在24小时内占总IO的4%,您是否认为它仍可能是导致您在图中看到的峰值的原因?当您没有使DTU达到最大并且查询性能仍然可以接受时,我会犹豫使用“重载”一词。为什么服务器随时间使用资源的方式不同?
LowlyDBA '18

@LowlyDBA我不确定如何验证查询是由什么引起的。当它仅显示4%的使用率时,我认为这不会导致整个DTU阈值的使用率接近100%。这里没有说明很多用法。基本上,我试图弄清楚为什么会这样。持续数小时的高峰使服务器非常接近100%,如上所述,当我将可用的DTU资源加倍时(S3计划),这似乎根本没有发生。
kspearrin

请记住,DTU不仅是I / O,还是CPU和内存。因此,将两者进行比较可能不是一个有用的指标。什么是查询性能洞察工具给你的资源在一个较小的窗口(只是你看到秒杀小时)的可视故障?
LowlyDBA '18

@LowlyDBA我上面发布的报告屏幕快照似乎清楚地表明资源全部来自Data IO。CPU和Log IO并不是真正重要的因素。例如,在发生问题的几个小时内,仅以最大CPU%的百分比查看查询仅指向使用2%的最大违法者。截图:imgur.com/rxyMLc9
kspearrin

1
@DirkBoer在我们的例子中,这似乎与服务器上运行的统计聚合查询有关。我们关闭了某些表的自动统计信息以帮助解决该问题。
kspearrin

Answers:


1

鉴于在峰值期间您的日志活动是最少的,我们可以假设没有任何(或很多)DUI在进行。

您曾经提到峰值不会影响性能,而另一方面却会影响性能。哪有

您还提到在规模操作之后,这种情况会消失。这是有道理的,因为它类似于内部重新启动,它将有效地杀死所有进程等。

在猜测是否正在从应用程序层访问此数据库时,我是否能正确假设?如果是这样,我怀疑您的连接没有正确关闭。垃圾收集器本来应该负责处理这些(不应依赖),但是我已经看到这种确切的情况是由于来自应用层的未封闭连接而发生的。在我们的案例中,应用程序非常忙,以至于我们最终收到并发连接错误,这就是导致该问题的原因。

在峰值期间尝试以下查询:

SELECT
    c.session_id, c.net_transport, c.encrypt_option,
    s.status,
    c.auth_scheme, s.host_name, s.program_name,
    s.client_interface_name, s.login_name, s.nt_domain,
    s.nt_user_name, s.original_login_name, c.connect_time,
    s.login_time
FROM sys.dm_exec_connections AS c
JOIN sys.dm_exec_sessions AS s
    ON c.session_id = s.session_id
ORDER BY c.connect_time ASC

如果我是对的,您会发现返回状态为Sleeping或更糟的一堆记录Running。如果是这种情况,那么您在应用层会遇到更大的问题。

我们可以使用以下查询(使用基本层以避免过多的开销)复制数据库,并监视此行为,从而进一步调试数据库。

CREATE DATABASE Database1_copy AS COPY OF Database1 ( EDITION = 'basic' );

1
是的,可以从应用程序层访问数据库,但据我所知,所有连接都正确地包装在using语句中。我在原始问题中发布的信息似乎表明数据IO是造成峰值的原因。
kspearrin

1
@pimbrouwers:您能具体说明为什么睡眠/运行状态下的连接不好吗?我对连接池的理解是,连接可能处于正常运行状态下的状态。
obaylis,
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.