2016-03-17 65 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