2016-03-17 64 views
7

我们在Azure上运行一个Web应用程序(2个实例),并由SQL Azure数据库支持。在任何时候,有50-150个用户在使用该网站。数据库运行在S2性能级别。 DTU平均约为20%。Azure SQL频繁连接超时

然而,每一天我突然得到数百错误在我的日志与超时,这样几次:

在执行命令定义时出错。详情请参阅内部例外。

等待操作超时。

超时已过期。操作完成之前超时的时间或服务器没有响应。尝试连接到路由目标时发生此故障。尝试连接到原始服务器时所花的时间是 - [Pre-Login]初始化= 1;握手= 21; [登录]初始化= 0;认证= 0; [后登录]完整= 1;

我们使用EF6进行默认命令超时查询。我已经配置了这个执行策略:

SetExecutionStrategy("System.Data.SqlClient", 
      () => new SqlAzureExecutionStrategy(10, TimeSpan.FromSeconds(15))); 

数据库(总共大约15GB)索引严重。这些错误发生在所有地方,通常在1-2分钟内达到几十到几百。

我可以采取哪些措施来防止这种情况发生?

+0

应用程序服务和SQL数据库是否在同一个数据中心? –

+0

是的,他们在同一地区。 – Knelis

回答

8

它发生在1-2分钟内的事实可能意味着活动爆发或某个可能锁定表的进程。

如果在那段时间你DTU是20%,是不是CPU的问题,但你总能找到其瓶颈在运行的数据库的查询:

SELECT TOP 10 
total_worker_time/execution_count AS Avg_CPU_Time 
     ,execution_count 
     ,total_elapsed_time/execution_count as AVG_Run_Time 
     ,(SELECT 
       SUBSTRING(text,statement_start_offset/2,(CASE 
                  WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 
                  ELSE statement_end_offset 
                 END -statement_start_offset)/2 
         ) FROM sys.dm_exec_sql_text(sql_handle) 
     ) AS query_text 
FROM sys.dm_exec_query_stats 
ORDER BY Avg_CPU_Time DESC 

即使DB是严重索引,索引获得支离破碎,我会建议运行此检查当前的碎片:

select a.*,b.AverageFragmentation from 
(    SELECT tbl.name AS [Table_Name], tbl.object_id, i.name AS [Name], i.index_id, CAST(CASE i.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [IsClustered], 
CAST(case when i.type=3 then 1 else 0 end AS bit) AS [IsXmlIndex], CAST(case when i.type=4 then 1 else 0 end AS bit) AS [IsSpatialIndex] 
       FROM 
       sys.tables AS tbl 
       INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id))a 
inner join 
(    SELECT tbl.object_id, i.index_id, fi.avg_fragmentation_in_percent AS [AverageFragmentation] 
       FROM 
       sys.tables AS tbl 
       INNER JOIN sys.indexes AS i ON (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tbl.object_id) 
       INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') AS fi ON fi.object_id=CAST(i.object_id AS int) AND fi.index_id=CAST(i.index_id AS int) 
)b 
on a.object_id=b.object_id and a.index_id=b.index_id 
order by AverageFragmentation desc 

您还可以使用Azure的自动化调度索引碎片的自动重建,看到答案在:Why my Azure SQL Database indexes are still fragmented?

+0

感谢您的回复。我现在使用Ola Hallengren的维护解决方案配置了一个Azure自动化操作手册,以便每天晚上优化索引。同时我也将数据库升级到了S3,并且因为我已经完成了,所以没有出现任何错误。这看起来确实是一个性能问题。一些最大的桌子是非常分散的,所以我认为你是点睛之笔。 – Knelis