接獲通報,某台機器昨天忽然網路功能失常,連線其他網路芳鄰時好時壞,在查不出原因的情況下,重新開機後恢復正常。隔了一天,同樣的情況又再度發生,這次我Terminal Service進入命案現場,仔細勘察了一審,觀察到以下的現象: (將有問題的Server命名為WebSvr, 另一台關係主機則命名SqlSvr)

1) 部分網路功能是好的,但有些是壞的
例如: 我可以Terminal Service進WebSvr,傳檔案到它的分享資料夾。但是WebSvr上IE無法瀏覽任何網站(Google, Yahoo, 用IP也不成),也無法連到其他機器的分享目錄。

2) 基本網路測試結果
ping SqlSvr OK
telnet SqlSvr 1433, telnet SqlSvr 135 都立即傳回無法建立連線(跟找不到機器要等一下的狀況不同)
nslookup 168.95.1.1 OK

3) 怪異的錯誤訊息
測了FTP, 傳回一個怪異的訊息,No buffer space is supported

 

我由3)中的錯誤訊息Google到,這是WinSock資源不足一類的問題。一開始是懷疑WinSock被SpyWare或Virus破壞,一篇技術文件提到:
You receive socket errors from network applications that used to work before you used the spyware removal tools.
是SpyWare引發的現象之一。於是我參考了MS判定及修復Winsock2毀損的KB,分別用netdiag /test:winsock及msinfo32檢查,卻發現WinSock良好,沒有被破壞的跡象,看來應可以排除Spyware及Virus。

苦無對策之計,靈機一動,心想,既然與WinSock有關,何不看一下目前的連線狀況,於是我netstat -a了一下,嘩~~~~

Active Connections

Proto Local Address Foreign Address State
TCP WebSvr:epmap WebSvr.blah.com.tw:0 LISTENING
TCP WebSvr:microsoft-ds WebSvr.blah.com.tw:0 LISTENING
TCP WebSvr:1024 WebSvr.blah.com.tw:0 LISTENING
TCP WebSvr:51223 WebSvr.blah.com.tw:0 LISTENING
TCP WebSvr:netbios-ssn WebSvr.blah.com.tw:0 LISTENING
TCP WebSvr:microsoft-ds Y220001091C:10279 ESTABLISHED
TCP WebSvr:1025 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:1026 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:1027 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:1028 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:1029 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:1030 SqlSvr:ms-sql-s ESTABLISHED

共有近四千列,省略...
TCP WebSvr:4999 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:5000 SqlSvr:ms-sql-s ESTABLISHED
TCP WebSvr:1055 WebSvr.blah.com.tw:0 LISTENING
TCP WebSvr:2301 WebSvr.blah.com.tw:0 LISTENING

...以下省略...

天哪! WebSvr跟SqlSvr間居然建了5000-1025+1,共3976條連線。這下子,先前觀察到的現象都有了合理解釋。

1) 網路功能有好有壞,是因為些網路服務需要建立新的Socket,有些可以沿用現存的。
2) ping與Socket無關,nslookup用UDP,所以要建Socket的telnet功能全倒。
3) ftp失敗的訊息,其實就是Windows因Socket建太多而資源不足的警訊。

所有的謎團都解開了,爽! 我下了個netstat -ao,[2007-04-20補充: Windows XP/2003之後,netstat多了-o參數,可以列出Connetion是由哪一個Process ID所建立的,再對照Task Manager就可以找到Process的執行檔名稱] 抓出凶手Process的PID(一隻失控的索引服務),接著就在Task Manager中執行槍決,馬上telnet OK, IE OK, 網芳OK,天下太平。

Case Closed.


Comments

# by linus

jeffrey兄您好 您這篇debug很精彩, 不過ending的地方跳太快了, 能否提示一下如何判斷出哪個process"失控"? 是從哪些特徵看出來?

# by 小熊子

netstat -ao 可以找到 PID ,再用 task manager 找到 mssearch.exe 這個失控的執行程序

# by Jeffrey

Linus(嘩... Linux的祖師爺來了? 開玩笑的 XD) 就是用小熊子說的方法沒錯,再補充一點: netstat -ao的-o參數是XP之後才加的,在2000上要找3rd Party的工具去找那一條Connection是哪一個Process所開啟的。

Post a comment