2010-03-12 77 views
5

我負責在IIS和SQL Server 2005(500個併發用戶,1TB數據,8個IIS服務器)上運行的第三方應用程序(無法訪問源代碼)。我們最近開始發現數據庫上存在嚴重的阻塞(在生產中運行該應用程序幾個月沒有問題)。這種情況在一天中隨機發生,大約每30分鐘一次,並且每次都會影響20到100次會話。所有的會議最終都會導致申請超時,會議中止。SQL Server 2005阻塞問題(ASYNC_NETWORK_IO)

問題消失,然後逐漸重現。該SPID負責阻塞總是具有以下特點:

  • WAIT TYPE = ASYNC_NETWORK_IO
  • 的SQL正在運行的「(@claimid VARCHAR(15))SELECT者ClaimID,enrollid, 狀態,orgclaimid, primaryclaimid FROM claim WHERE primaryclaimid = @claimid AND primaryclaimid <> claimid)「。這是 相對無害的SQL,應該只返回一個或兩個記錄,而不是 大型數據集。
  • 否其他SQL語句已經被 牽扯到了阻塞,只有這個 SQL語句。
  • 這是參數化的SQL,其執行計劃被緩存在 sys.dm_exec_cached_plans中。
  • 此SPID在聲明表上有一個對象級別的S鎖,因此對聲明表的所有UPDATE/INSERT也都被阻止。
  • 主機ID變化。不同的Web服務器負責阻塞會話。例如,有時我們追溯至Web服務器1,有時web服務器2.

當我們追溯在封閉牽連的Web服務器,我們看到以下內容:

  • 總有一些 應用程序相關的錯誤在 事件日誌在Web服務器上,鏈接 從主機ID和主機進程ID 從SQL會話。
  • 錯誤消息各不相同,通常有一些 種SystemOutofMemory。 (這些 錯誤信息似乎是類似於我們在 以前看到沒有這種戲劇性 後果 錯誤消息。我們認爲在之前發生 ,但並沒有導致阻塞。 爲什麼是現在?)
  • 網絡服務器上的網絡 適配器或SQL服務器上的 沒有已知問題。

(在任何情況下由違規查詢返回的記錄集將很小。)

事情排除:

  • 指標定期進行碎片整理。
  • 統計信息定期更新。
  • 增加了claim.primaryclaimid統計 的樣本大小。
  • 強制緩存 執行計劃的重新編譯。
  • 創建一個複合索引與 primaryclaimid,ClaimID的。
  • 沒有網絡問題。
  • Web服務器上沒有已知的問題。
  • 對 Web服務器上的應用程序軟件沒有任何更改。

我們推測事件鏈是這樣的:

  1. Web服務器進程提交SQL 以上。
  2. SQL服務器執行SQL,期間 其獲取關於 權利要求表上的鎖。
  3. Web服務器進程遇到錯誤,並且 死亡。
  4. SQL服務器會話掛等待 爲Web服務器進程讀取 數據集。需要在索求表的部分得到 X鎖 (任何處理索賠)
  5. SQL服務器會話 封鎖鎖的要求 表,並保持阻塞,直到他們 全部命中應用程序超時。

故障排除任何建議,同時等待供應商的援助將是最歡迎的。

有沒有辦法強制SQL Server鎖定在這個特定的SQL語句的行/頁級別? 有沒有辦法在ASYNC_NETWORK_IO上只設置一個閾值?

回答

7

ASYNC_NETWORK_IO是由客戶端無法快速接收數據並填充網絡緩衝區(簡單地說)造成的。沒有神奇的SQL Server設置來修復它。

  • 重新啓動客戶端(即使是Web服務器)
  • 確保網卡設置是否正確(固件,全雙工等)
  • 確保物理電纜都OK(任何數據包丟失等?)

這是一個SQL Server的問題,因爲這樣...

ASYNC_NETWORK_IO網絡 時發生阻塞後面 網絡任務寫入。確認客戶端處理來自服務器的數據是 。

+0

感謝您的快速和翔實的迴應。我們重新檢查了所有網絡服務器上的適配器/物理網絡連接,並相信我們可以排除這一點。與阻塞有關的SQL語句通常會返回一個非常小的數據集(最多3條記錄),不足以使網絡緩衝區溢出併產生延長的ASYNC_NETWORK_IO等待時間。 但是,有一個邊界條件(@claimid ='')會返回數百萬條記錄。這可能會誘發ASYNC_NETWORK_IO,即使在正確配置的Web服務器上也是如此。這是我們接下來要追求的。 – ivankolo 2010-03-12 22:35:14

1

我有同樣的問題,當我禁用客戶端上的卡巴斯基殺毒它得到了解決。