有一臺服務器,運行sqlserver數據庫,有兩個網站模塊的數據庫在上面,負載壓力不大,平時沒出現過問題。後來另外一個L部門放了一個網站上去,數據庫也在同一臺機器上,突然有天L部門反應網站訪問不了了,FTP也連不上了。但數據庫能夠遠程連接上。
遠程到服務器上,FTP服務重啓,無效;網站重啓,無效,查看系統日誌,發現有如下錯誤:
xxx在與 SQL Server 建立連接時出現與網絡相關的或特定於實例的錯誤。未找到或無法訪問服務器。請驗證實例名稱是否正確並且 SQL Server 已配置爲允許遠程連接。 (provider: TCP Provider, error: 0 - 由於系統緩衝區空間不足或隊列已滿,不能執行套接字上的操作。)。
沒碰到過這種情況,爲了恢復服務,索性把服務器重啓了,一切都好了。過了兩天,又有這種情況出現。google一下,知道大概原因是端口用完了,猜測是不是L部門網站代碼有問題,數據庫連接泄露沒關閉完?沒有使用連接池?看了代碼,都沒問題。只好查看系統端口的使用情況:
1 命令行下輸入 netstat -ano >>D://net.txt ,列出目前端口使用情況,如下大概有三千多條 ,注意紅色端口的使用
TCP 222.122.222.222:2756 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2766 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2776 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2786 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2796 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2806 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2816 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2828 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2838 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2851 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2860 52.122.120.88:80 CLOSE_WAIT 2144
TCP 222.122.222.222:2870 52.122.120.88:80 CLOSE_WAIT 2144
.......
發現本地在訪問一個外網地址的80端口,對應PID是2144
2.命令行下輸入 tasklist|findstr "2144" 查看 PID對應的進程
w3wp.exe 2144 services
看起來是一個網站,這時突然想起來,不久前發佈了一個webservice,主要功能是用httpwebrequest分析提取某個網站的部分內容,返回給調用方
3.命令行下輸入 C:\Windows\System32\inetsrv>appcmd list wp
WP "5648" (applicationPool:testmozhou)
WP "5664" (applicationPool:tqh.xxx.cn)
WP "1544" (applicationPool:www.lxxxg.com)
WP "2144" (applicationPool:data.tt.com)
確認問題來源,webservice多線程下,每個httpwebrequest沒有及時釋放問題所致
參考文章:http://blog.zhaojie.me/2010/08/lack-of-dynamic-ports-when-frequently-open-and-close-socket.html