現象:
很多次了,每當我在dc9.cn上安裝上計數系統或者反向連結系統就會出現這種情況。現象是自己的空間突然間不能訪問,仔細觀察是只有ASP不能訪問而靜態頁面卻可以訪問,FTP訪問也正常,看上去好像是IIS假死。
詢問:
首先我致電通聯無限的客服,他們態度很好,說有可能是進程阻塞造成的伺服器不能訪問。果然他們幫我回收一下伺服器資源就能訪問了。
研究:
到底是什麼造成了我的伺服器突然死結或進程阻塞呢?我研究了很久,最終得出的結論是:由於統計系統的訪問量過大,同時查詢更新資料庫的人數太多,而造成了ASP突然不能訪問。
那麼現在的原因可能是這樣:
由於每一次查詢更新資料庫都要向系統請求的資源,而所請求的資源沒有及時關閉或者釋放而造成了進程阻塞.
使用者Q訪問表A(鎖住表A),然後又訪問表B,此時使用者W訪問表B(鎖住表B),然後企圖訪問表A,這時使用者Q由於使用者W已經鎖住表B,Q必須等待使用者W釋放表B,才能繼續,同樣使用者W要等使用者Q釋放表A才能繼續,於是產生死結。
就好比我把我家鎖上了,然後拿著鑰匙跑到你家,然後你把我反鎖在了你家然後又企圖進我家。這樣我出不來你也進不去,於是就無限等待下去吧。
或者使用者A讀一條紀錄E,然後修改該條紀錄E,但沒有鎖定,此時使用者B也修改該條紀錄E的時候容易造成死結。這主要是由於資料庫的鎖定類型設定不當,導致資源競爭嚴重,從而造成死結.
拙見:
怎麼解決呢?
1,我覺得就是要在程式中注意習慣性使用xxx.close:set xxx=nothing這樣的語句,及時釋放伺服器資源。最開始我那個SXNA1.3就沒有及時釋放伺服器資源而導致了好多的伺服器出現假死。後來基本修正了的說。
2,我覺得是不是在資料庫的鎖定類型上嘗試使用adLockPessimistic悲觀鎖定方式,因為conn.execute的預設鎖定方式是ADLOCKREADONLY,這個在同時又大量的使用者訪問查詢更新資料庫的時候容易造成死結。
3,使用MSMQ來控制ASP進程,解決進程死結問題,這個在網路上有大量的教程,我就不贅述了。
總之造成這個問題的應該是程式的BUG。
我的解決方案是最最痛快的解決辦法,不使用站內的統計,使用站外的統計.現在站外的免費流量統計也不錯,反向連結也能看得很清楚,只不過需要點進去看而已。