Daily Archives: 2007/03/21

奇怪的網路衝突-.Net 2.0 TcpClient.Connect 連線建立所需時間為 .Net 1.1 50 倍


網路上常嫌一些初心菜鳥向小白,發問時都不會提供必要完整資訊,所以這篇發信時的內容,就當作發問的範例,看看我怎樣問問題。

標題:
.Net 2.0 TcpClient.Connect 連線建立所需時間為 .Net 1.1 50 倍
 
造成問題:
嚴重影響網頁系統執行效能,請求改善。
 
重現步驟:
附件為單一可執行檔案,可直接掛載於 Test 目錄下後 (建議),以 http://localhost/Test/ 測試。
並利用 Win2003 IIS 6.0 建立 ASP.NET 1.1 集區及 2.0 集區,分別進行測試。
建議可開設兩虛擬目錄指向同一檔案,例如 Test11 採用 ASP.NET 1.1 ,Test20 採用 ASP.NET 2.0 ,分別以 http://localhost/Test11/TcpClient.aspxhttp://localhost/Test20/TcpClient.aspx 測試執行。
 
說明:
1. 以如下程式碼觀測 TcpClient.Connect 連線所需時間,時間採用真實世界時間,完整程式碼請參考附件:

Public Function GetPassTime(ByVal baseTime As Date, ByVal nowTime As Date) As String 
     Return "經過秒數:" & (nowTime.Ticks – baseTime.Ticks) / CDate("0:0:1").Ticks & "(目前時間:" & nowTime.ToString("yyyy/MM/dd HH:mm:ss.fff") & ")"
End Function

Public Sub MainTest() 
     Dim m_TcpClient As New System.Net.Sockets.TcpClient 
     Dim startTime As Date = DateTime.Now  

     m_TcpClient.SendTimeout = 5000 
     m_TcpClient.ReceiveTimeout = 5000 
     Response.Write("初始化設定->" & GetPassTime(startTime, DateTime.Now) & "<br />") 
     Try 
          m_TcpClient.Connect("news.microsoft.com", 119) 
          Response.Write("連線成功") 
     Catch 
          Response.Write("連線失敗") 
     End Try 
     Response.Write("->" & GetPassTime(startTime, DateTime.Now) & "<br />")  

     m_TcpClient.Close() 
     Response.Write("完成關閉連線->" & GetPassTime(startTime, DateTime.Now) & "<br />")
End Sub

 
2. 為避免 ASP.NET 執行時自動編譯、初次執行、快取等問題造成時間判定可能發生偏差,螢幕擷圖為該網頁以 IE7 Ctrl+F5 強制重新整理第三次畫面為準,版本抓取程式碼為:

<td align="right">目前.Net framework 版本:</td>
<td> <% =Environment.Version %>

 
3. 以 ASP.NET 2.0 集區執行時,需時 14.6875 秒。
 

3. 以 ASP.NET 1.1 集區執行時,需時 0.296875 秒。
 
 
5. 由兩畫面相除得知,ASP.NET 2.0 初始連線所耗用時間為 ASP.NET 1.1 約為 50 倍 (49.473684210 倍)。
 
補充說明:
 
連絡資訊:
姓名:鄭子璉
電話:xxxxxxxx/xxxxxxx
技術支援服務合約編號:xxxxxxxx
E-Mail :xxxxxxxx , xxxxxxx 

 
背景:
以下軟體皆為繁體中文版 (MSDN VST 版)
OS: Windows 2003 R2 + Windows Update (2007/3/9)
開發工具: Visual Studio Team Suite 2005 SP2


問題提出後,約 4 天微軟回覆可以重現,等待更進一步的測試回覆,往後送。
目前微軟在中國成立大型的技術支援中心及研究院,所以往後送會先送到中國,前天由中國技術人員、台灣技術人員跟我 三方通話討論這個問題。
說之前,不得不抱怨台灣微軟一下,中國技術人員是透過網路語音連線轉到一般電話,那個音量實在有點小,這部份要改善,我在很安靜的環境下都聽的很吃力,此外,內地的人講話都比較快,聲音小、講話快、甚至有時中文夾雜英文,猛然之間根本不知道在說什麼,常常中文部分我就要請內地人員慢慢重複一遍,程式開發問題有些是要思考的,講太快根本沒辦法用腦想。
因為中間討論及測試很多東西,花了 3 個多小時,就直接說結論。
 
在中國微軟那邊無法重現問題,希望能透過遠端連線與桌面分享從我的電腦除錯。
(我的電腦使用的是 Microsoft MN-700 無線基地台 + Microsoft MN-710 無線網卡,中國微軟那邊認為可能原因包含無線網卡,我自己認為不是,所以用括號來表示)
 
由於這個問題在 .Net 2.0 + (無線網卡) + 域名會這樣,使用 .Net 1.1 或直接用 IP 不會發生,所以可能要透過封包擷取器來看看我的電腦再做什麼。舊版的封包擷取器不能抓無線網卡,所以透過新版的:Microsoft Network Monitor 3.0 來抓:
 
在 .Net 2.0 下使用域名,會發現網路動作為:
1. 向 DNS 查詢 IP
2. IPX 查詢近端是否有該名稱的電腦三次,連線逾時分別為 2, 4, 8 秒,故總秒數 14 秒。
3. 部份情況可能會向 DNS 再次查詢 IP ,有時候不會,估計可能是快取還在。
4. 進行 TCP 連線,約 0.2 秒完成。
 
但使用 .Net 1.1 時,僅有 4 的動作,所以立即可完成,理論上,1 的動作應該是要做,沒有查詢可能是從快取直接回應,所以沒有 1 的部分僅供參考。
 
故把網路卡中,NWLink IPX/SPX/NetBIOS 相容通訊協定 不啟用,就沒有 2 的問題,就不會在那邊發呆。
 
不過中國微軟那邊還無法重現問題,所以還需要再進一步測試,所以週一就到此結束,需靜心等待回應。

補充效應:
原先在每次開啟一個新的 IE 執行個體瀏覽 http://localhost/ 時,會發生約有 15 秒的延遲,把 NWLink IPX/SPX/NetBIOS 相容通訊協定 關閉後,現在開 IE 執行個體瀏覽 http://localhost/ 可以馬上顯示,不確定是否是因為 IPX 在查詢近端是否有同名的電腦。
Categories: 更新與回報 | 3 則迴響

在WordPress.com寫網誌.

%d 位部落客按了讚: