最近發現在 server 2008 上面跑的 service 出現 connection error,
經過測試, 確定網路是通的
後來自己寫了小程式去做 socket connect 測試, 發現只要同時開多個 socket, 一定會出現 exception
an operation on a socket could not be performed because the system lacked sufficient buffer space
上網查了資料, 這個錯誤常常是因為 windows 有 socket port range 限制, 但是 application 頻繁的打開跟關閉 socket 所已 port number 達到 windows 規定上限
http://blog.zhaojie.me/2010/08/lack-of-dynamic-ports-when-frequently-open-and-close-socket.html
http://blog.miniasp.com/post/2010/11/17/How-to-deal-with-TIME_WAIT-problem-under-Windows.aspx
這種情況通常等個一會讓 windows 把關掉的 socket port number 再重用, 就可以避開
但是我遇到的情況是不管等多久這個 exception 都會出現
繼續查資料發現 windows 還有一個 known issue, kernel socket leak
http://support.microsoft.com/kb/2577795
當這個 issue 發生時, 因為是 kernel 沒有把 socket 正確關閉, 所以除了重開機不然沒救
這個 KB 描述的現象跟我遇到的非常相似, 而且我使用的 server 剛好就是該 KB 有提到的
server 2008 R2 SP1.
可惜的是沒有一個方法可以確定是不是真的發生了 kernel socket leak, 只能先裝上 hotfix
再看看之後會不會發生
沒有留言:
張貼留言