2012年2月6日 星期一

TCP 提供者: 一次只能用一個通訊端位址 (通訊協定/網路位址/連接埠)。


   公司不過一千多人,為何年底那天內網IIS瞬間可看到一萬多個Requests呢?




那是因為內網首頁程式有Bug,上線人數只要一多,Requests就消化不了,這樣Request數也可以飆到一萬多,真的很誇張

有Bug的ASP程式簡寫如下

                                Call AAA

Function AAA
set rsA = Connection1.Execute(sqlA)
do while not rsA.eof
                                      Function BBB
loop
End Function

Function BBB
set rsA = Connection1.Execute(sqlB)
do while not rsA.eof
...
loop
End Function

   看得出問題在哪嗎?問題在於迴圈內外層不該共用同一個Connection的!

其實每天從IIS Log都可看到如下錯誤,同事一直懷疑是DB的問題,我這邊已經使用最新的DRIVER,也請同事在查詢語法上加了NOLOCK資料表提示,可是問題一直沒解決

   若偶爾看到首頁沒跑完,檢視原始檔也可發現如下錯誤訊息 
Microsoft SQL Native Client 錯誤 '80004005'
TCP 提供者: 一次只能用一個通訊端位址 (通訊協定/網路位址/連接埠)。
這問題難抓的原因在於自己怎麼試都試不太出來,首頁連續重整也都沒錯誤!

最後同事是用壓測軟體模擬多人同時上線,首頁程式拆成一塊一塊,才確認上面那段程式在多人時會卡住,才發現怎麼共用同一個Connection呢!將Connection分為兩個就解決了,上面那個錯誤訊息再也沒有發生囉。

其實一萬多個Requests也不是瞬間有那麼大的量, 而是逐漸累積的,那時壓測發現50個人同時登入時,50個Requests就花兩分多鐘才消化完畢,可以想見當公布考績時大家就搶著上內網,人數一多又消化不了,Requests就一直累積下去囉

0 意見:

張貼留言