w3wp進程發生死鎖ISAPI aspnet
2024-07-09 22:40:21
供稿:網友
ISAPI c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll 報告它自身有問題,原因如下: Deadlock detected 這個問題,字面意思是程序發生死鎖了,它會導致w3wp進程重啟。通常這個問題不好查到原因。我知道兩個可能導致此問題的實例
1. 在程序中使用了lock或者ReaderWriterLock,鎖資源發生了爭用
下面是一小段代碼:
復制代碼 代碼如下:
//_rwLock的類型是ReaderWriterLock
_rwLock.AcquireWriterLock(100);
DoSomething();
_rwLock.ReleaseWriterLock();
這行代碼是有問題的,如果在DoSomething()方法執行中發生一次異常,這個寫鎖就釋放不了了,再次請求時就會等待直到超時,在多線程的情況下就會發生死鎖'Deadlock detected'
正確的寫法應該是:
復制代碼 代碼如下:
try
{
_rwLock.AcquireWriterLock(100);
DoSomething();
}
finally
{
if (_rwLock.IsWriterLockHeld)
_rwLock.ReleaseWriterLock();
}
這樣就算在DoSomething方法執行時發生了異常,也可以釋放寫鎖。
2. 數據庫連接的超時時間設置的很長而在設定的超時時間之內連接耗盡了,再次要求打開數據庫連接時也可能會出現此問題。這個是數據庫連接串的配置問題,超時時間要設置的適當,不要過長。
發生這個問題時的日志寫的很籠統:
ISAPI 'c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll' 報告它自身有問題,原因如下: 'Deadlock detected'。
有關更多信息,請參閱在 http://go.microsoft.com/fwlink/events.asp 的幫助和支持中心。
這樣導致不容易找到問題發生在哪塊,所以我記錄兩種發生此問題的實例,希望有用。
問題分析方法(這個很有必要的)
今天系統突然折了,但是問題在哪呢?很費周折。
錯誤信息:
ISAPI'c:windowsmicrosoft.netframeworkv2.0.50727aspnet_isapi.dll'報告它自身有問題,原因如下:'檢測到死鎖'。
有關更多信息,請參閱在http://go.microsoft.com/fwlink/events.asp的幫助和支持中心。
癥狀:系統總是不穩定,一會能用,一會兒又死掉了。
分析過程:
這個版本已經跑了很長時間,估計不是程序死鎖的問題。倒底是什么問題呢。應該是外部環境的問題。由于錯誤信息比較的抽象,之前沒有遇到過,所以google了下,但是好像遇到此問題的人很少,不過在博客園還是遇到一位受到同樣遭遇的人,但是并沒有一種很好的解決方案,也沒有確切的指出問題的癥結。所以只有自己進行一些檢查。
<1>查看最近的系統更新,看是否有關于IIS之類的更新
<2>查看系統的殺毒軟件的日志文件,看是否收到了攻擊
但是,檢查上述兩個步驟,并沒有發現問題。看系統是有一些更新,迫于無奈,只好重啟系統試一下(也順便重啟IIS)。重啟之后,問題依舊。
觀察進程管理器,發現:
W3WP的線程數,一直在變化,一會增加一個高峰值,重新增加一個W3WP進程,之前的進程過一會就自動關閉,一會又恢復正常。
這說明網站,在不斷的死亡、重啟。到底是哪里的問題呢?應該還是系統自己的問題了。但是它自身的版本并沒有問題,為了確定這一點,我也試了之前穩定的版本,同樣出現此類問題。最后,是否是系統中調用的第三方服務,將整個系統給拖死了呢?
罪魁禍首:經過檢查,果然是由于程序中實時調用了一個服務,由于此服務已經停止,請求無果,出現了死鎖。