2014年10月21日 星期二

Windows server 2008 R2 SP1 kernel socket leak

最近發現在 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
再看看之後會不會發生

沒有留言:

張貼留言