SQL Server Connection Forcibly Closed

又一個有點麻煩的問題:在 server farm 環境下,利用 SQL Server 資料庫來儲存 ASP.NET 網站的 sessions,可就是有某一台 app server 會三不五時(每週一兩次或者完全沒有)出現無法連接 SQL Server 的錯誤訊息:
TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host

當此問題發生時,我的伺服器當機偵測程式會發送 MSN 通知和 e-mail 給我。麻煩的地方在於,如果在收到通知訊息時立刻用瀏覽器開啟出問題的 app server 的網頁,卻又發現是正常的。也就是說,這個問題既不定時出現,出現的時間也很短暫,很難將它「鎖定」。

在 MSDN 論壇上找到一帖相關討論:
http://social.msdn.microsoft.com/forums/en-US/sqlnetfx/thread/4895d56b-716f-4f82-860f-0aa161d327cc/

看來還挺多人碰到這種怪問題,但是對發生的原因仍莫衷一是,建議的解法也五花八門。大略爬完這一長串討論之後,打算嘗試兩種解法。

解法 (1):修改 SQL Server 的遠端登入逾時時間

如下圖所示:



此解法似乎有點駝鳥心態:反正可能是某種神祕未知的網路傳輸或連線資源管理問題所致,而且出現的時間很短暫,過幾十秒就恢復了,那就乾脆延長逾時時間,把這些可能發生的短暫延遲給壓下去。

解法 (2):關閉 Connection Pooling

這是我最不希望的做法(因為會影響效能),但不得已時也只能試試看了。

結果

先採用解法 (1) 之後,經過一個月了,一直都沒有再發生同樣的問題。

那就樂得當個鴕鳥吧 :)

後記:結果後來終於找到真正原因,說出來還真的很不好意思....原來,SQL Server Agent 的排程出了問題,無法正常執行定期刪除 ASP.NET session 的工作,以至於 session 資料表持續累積、長大,大到令我難以想像的地步,因而影響了 SQL Server 的運行。

2 則留言:

  1. Hi Huan,
    想請問如何看出 ASP.NET 的 session滿了或是持續累積呢? 謝謝

    Green

    回覆刪除
    回覆
    1. Hi Green,
      當時的狀況並不是「session 滿了」,而是我到儲存 ASP.NET session 的資料表中查看,發現裡面的垃圾資料滿山滿谷...多少筆我是忘了,但是那資料量大到已經明顯拖慢整個資料庫的執行效能。這才發現是 SQL Server Agent 排成失效所造成。

      刪除

技術提供:Blogger.
回頂端⬆️