Sql server 同一服务器上的Azure SQL数据库相互影响';s的表现

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创建的

与我们的web应用程序的不同环境(例如生产、登台)对应的数据库位于同一Azure SQL数据库服务器上。当我到处阅读(其中的DBs甚至可能不在同一台物理机器上)时,我们看到DBs表现为嘈杂邻居的迹象,即对其中一个DBs进行的操作会影响其他DBs的性能

我们已经看到下面的操作和指标在DBs之间相互关联。让我们将一个DB称为“prod”,另一个称为“stage”;在所有情况下,阶段都是通过使用
Start-AzureWebAppSqlDatabaseCopy
PowerShell命令复制prod创建的

  • 放大阶段与产品上的数据IO峰值相关
  • 在后台运行高性能操作(删除数千个表,更新约10000行)与SQL连接超时(“操作完成前经过的超时时间或服务器没有响应”)和prod上的数据IO峰值相关
对于两个DB,我们使用单独的DB级用户帐户(关于原因,请参阅),但prod和stage用户帐户都存在于两个DB下(即,我们使用stage用户连接到stage DB,但stage用户也存在于prod DB下,prod用户也存在于stage DB下)。我们将stage用户从prod数据库中删除,以查看这是否会产生影响,但事实并非如此

值得注意的是,当Web/Business Azure SQL层逐步淘汰时,这些DBs从Web迁移到了当前的S1层。我们在另一台服务器上也看到了同样的问题。DBs不是弹性池的一部分

我们的发现是不确定的,而且这些事件也没有100%的相关性。我们不知道要调查什么,因为我们确信stage应用程序没有连接到prod DB。我们试图找到舞台应用程序以某种方式影响prod DB的证据,但我们找不到。如有任何意见,将不胜感激

更新1

使用Grant的
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