Sql server 同一服务器上的Azure SQL数据库相互影响';s的表现
与我们的web应用程序的不同环境(例如生产、登台)对应的数据库位于同一Azure SQL数据库服务器上。当我到处阅读(其中的DBs甚至可能不在同一台物理机器上)时,我们看到DBs表现为嘈杂邻居的迹象,即对其中一个DBs进行的操作会影响其他DBs的性能 我们已经看到下面的操作和指标在DBs之间相互关联。让我们将一个DB称为“prod”,另一个称为“stage”;在所有情况下,阶段都是通过使用Sql server 同一服务器上的Azure SQL数据库相互影响';s的表现,sql-server,azure,azure-sql-database,Sql Server,Azure,Azure Sql Database,与我们的web应用程序的不同环境(例如生产、登台)对应的数据库位于同一Azure SQL数据库服务器上。当我到处阅读(其中的DBs甚至可能不在同一台物理机器上)时,我们看到DBs表现为嘈杂邻居的迹象,即对其中一个DBs进行的操作会影响其他DBs的性能 我们已经看到下面的操作和指标在DBs之间相互关联。让我们将一个DB称为“prod”,另一个称为“stage”;在所有情况下,阶段都是通过使用Start-AzureWebAppSqlDatabaseCopyPowerShell命令复制prod创建的
Start-AzureWebAppSqlDatabaseCopy
PowerShell命令复制prod创建的
- 放大阶段与产品上的数据IO峰值相关
- 在后台运行高性能操作(删除数千个表,更新约10000行)与SQL连接超时(“操作完成前经过的超时时间或服务器没有响应”)和prod上的数据IO峰值相关
sys.dm_os_wait_stats
技巧,以及sys.dm_os_performance_计数器
很明显,如果在同一逻辑服务器上复制数据库,它也将在同一物理SQL服务器上创建。object\u name
中的服务器名称相同,等待值完全相同
但是,这并不能解释为什么拷贝上的操作会影响原始数据库。由于噪声邻居效应似乎并非总是发生(放大在大多数情况下确实会影响原始DB,性能重操作的影响较小,但相关性仍然很明显),因此可能存在一些随机问题
我们将查看使用不同的逻辑服务器是否可以解决此问题。可以肯定的是,在这种情况下,物理服务器也会有所不同,我们已经检查过了
更新2
我们正在监测局势,但这是否真的解决了问题,最有可能在几个月后才会显现出来。目前,我们已将所有数据库放在单独的服务器上
在后台数据库上的所有操作完成后,我们确实注意到prod DB上的超时总是在同一时间间隔内。然而,这些超时似乎只发生在桌子创建时。这就像将prod数据库复制到stage数据库后,prod数据库在一段时间内(大约45-60分钟)处于某种程度的“锁定”状态,您无法创建表(但您可以删除它们,这样做很有效)。有趣的是,今天没有发生这种情况,所以可能它已经自行解决了…我决定是否会发生这种情况的方法是使用sys.dm_os_wait_stats和sys.dm_db_wait_stats。OS wait统计数据用于运行数据库的“服务器”,db wait统计数据用于数据库。收集数据库等待两个有问题的数据库,操作系统等待两个数据库。首先,直接比较操作系统等待时间。如果它们是相同的(有一定的余量,我不希望它们完全相同,尽管,如果它们是相同的,这就是你的答案),那么你可能会在同一台服务器上看到所有东西。如果它们实际上并不相同,但有点类似,那么将每个数据库的db wait统计数据与OS wait统计数据进行比较,看看是否可以看到直接的相关性
仅出于管理目的,我可能会将它们分别放在不同的服务器上,即使这通常不是问题。但是,如果您能找到相关性,那么最好的办法可能是将服务器分开。它不会花你任何钱。您为数据库而不是服务器付费。从您提供的信息来看,我怀疑问题在于您的数据库的工作负载有时是I/O密集型的,正在达到层限制,Azure SQL开始节流。这种节流可能是这些超时的原因 请使用以下查询监视资源消耗:
SELECT
(COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent'
,(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent'
,(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'
FROM sys.dm_db_resource_stats
99.9%的服务级别目标(SLO)将检查这些指标,谢谢。我们还考虑将DBs放在不同的服务器上,只是为了排除这种情况,并且已经开始这样做了,因此我们将看看这是否解决了问题(即使解决了,我仍将尝试了解原因)。sys.dm_os_performance_counters不会也给出服务器相同的提示吗?object_name列的值以服务器名称作为前缀(如“MSSQL$8E2D1FA3:Buffer Manager”。看起来这两个数据库确实在同一台机器上,请看我的更新。啊,我看到它们是一样的。很高兴知道。@alberto morillo有正确的方法来确定系统上的负载。谢谢,下次我们遇到这个问题时,我将查看sys.dm_db_resource_stats。顺便说一句,正如我提到的,我们并不是密集使用数据库,而是会受到限制d、 这是因为同一服务器上的另一个DB看到了过度的资源使用。这就像两个DB共享同一个资源池,尽管Azure文档提出了相反的建议(而且它不是一个弹性池)。sys.resource_stats显示的是我对同一资源池的理解
SELECT start_time, end_time,
(SELECT Max(v) FROM (VALUES (avg_cpu_percent), (avg_data_io_percent),
(avg_log_write_percent)) AS value(v)) as [avg_DTU_percent]
FROM sys.resource_stats where database_name = 'AdventureWorksLT' order by end_time desc
SELECT
end_time AS [EndTime]
, (SELECT Max(v) FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v)) AS [AvgDTU_Percent]
, ((dtu_limit)*((SELECT Max(v) FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v))/100.00)) AS [AvgDTUsUsed]
, dtu_limit AS [DTULimit]
FROM sys.dm_db_resource_stats