[.NET]台北使用者使用系統很快,但外縣市使用者使用系統卻是超慢的

伺服器是放在台北總部,而當您收的訊息是「台北使用者使用系統很快,但外縣市使用者使用系統卻是超慢的」時,

您覺得會是什麼問題呢?

台北 3秒 ,外縣市使用者使用系統時,用Fiddler錄的結果如下(約 35 秒),

嗯.... 直覺就是應該是網路問題吧!!! 

可是使用 ping serverip (10ms以內) 及 pathping serverip 的結果都很快,狀況很良好,頻寬也都夠。

系統的效能狀況看起來也都很好 ...

IIS也有設定壓縮,防毒軟體也關掉試試看 ... 

還是慢 ...

 

回到基本面,使用簡單的程式來測試,對照一下,

筆者用只有UI的aspx(分body多跟少各一支)放在 wwwroot 目錄跟應用程式目錄從外縣市的電腦來測試反應卻是超快的 .....

那就不是下載內容大小的問題了 ... 

 

加上有資料庫存取吧~~ 

再來在 aspx 中使用我們公司的元件去存取資料庫來試看看。

結果放在 wwwroot 中的程式很快,在應用程式目錄中的程式卻變慢了 !!! 

在我們的應用程式中的程式,如果使用元件存取資料庫 會變慢 ... 在不同的應用程式目錄之中卻不會 ...

那會是有什麼 Firewall or WAF 嗎? 詢問網管人員也沒有呀 ... 

 

會是應用程式名稱的問題嗎?

Copy原有應用程式的檔案,然後在 IIS 上建立一個TEST應用程式來測試,還是一樣 ...

拿另一個模組的 web.config 放過去測試,變快了 !!!

那就是 config 的問題了 (鎖定在 web.config 中到底有什麼設定影響呢?)

一步步去刪除 config 的內容,在 AppSettings 中有個設定,當存取資料時,同時會記錄一份 Log 到 DB 之中,

將 Flag 設定成 N,外縣市的速度就跟台北一樣快了。

Yeap ... 灑花... 收工 ...  

But ...可是客戶說一定要記錄哦~~~  不可以停 ...

 

那是否程式中有針對 外縣市 的 IP 去做 Filter 然後記錄嗎??? 

不然應該不會有這種不同的狀況才對呀! 

錄一下台北跟外縣市使用的 SQL ,都有去記Log呀! 而且 DB 的回應也不慢 ...

那應該是程式的問題了... 查看記Log的那一段程式碼,如下,

看了之後,心中一驚 ... 該不會是 Dns.GetHostEntry 吧?

於是在 Dns.GetHostEntry 中給台北使用者的 IP 跟 外縣市使用者的 IP ,

台北可以解析出 HostName,而外縣市則解析不出來 HostName,而且花費約 4~5秒 的時間。

於是在 AP Server 上下 ping -a 台北使用者的 IP ,跟 ping -a 外縣市使用者的 IP ,果然也是一樣的狀況!

 

所以一支程式中會有多個Query,就會用 Dns.GetHostEntry 去試著取得電腦名稱,

外縣市使用者的 IP 解析不出來,做了多次,於是那支程式的就需要等很久很久才會有反應!

35 秒或是1分鐘的等待時間就是這樣出來的 ...

 

找出這問題後,跟網管討後,網管說他需要查一下為何會解析不出來。

所以就先調整程式,不要使用 Dns.GetHostEntry 來及時解析出電腦名稱。

以上是筆者在查問題的過程,後來還好有到現場去觀察整個的過程,才能一步步的狀問題釐清。

希望對於大家在查問題時,有所幫忙。

結論

如果將來真的需要解析出 Client 的電腦名稱的話,要先讓 ping -a IP 可以解析的出來。

再以批次 Job 的方式去解析即可. 

用 Dns.GetHostEntry 要小心,當解析不出來時,就會花費很久的時間哦!

 

參考資訊

What is difference between nslookup and GetHostEntry?

GetHostEntry is very slow

Diffrence in "Ping -a", "nslookup", and "[System.Net.DNS]::GetHostEntry"?

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^