最近發(fā)現(xiàn)使用的Tomcat 7會經(jīng)常假死。前端點擊頁面無任何反應(yīng),打開firebug,很多鏈接一直在等待服務(wù)器的反應(yīng)。查看服務(wù)器的狀態(tài),CPU占用很少,最多不超過10%,一般只有2%,3%左右,內(nèi)存占用倒是接近80, 90%。一開始懷疑是tomcat內(nèi)存配置不夠,但是打開 jvisualvm.exe 分析,發(fā)現(xiàn)Tomcat 占用的堆內(nèi)存沒有什么問題。因為是假死,所以最后懷疑到 tomcat的 鏈接數(shù)和 數(shù)據(jù)庫的鏈接數(shù)的配置估計太小了。netstat -na 結(jié)果頁顯示很多time_wait.
查看各種狀態(tài)的網(wǎng)絡(luò)連接的數(shù)量:
1)Linux 使用命令:netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
上面的命令可以查出各種狀態(tài)的網(wǎng)絡(luò)連接的數(shù)量 2)windows使用命令:
netstat -n |find /i “time_wait” /c
netstat -n |find /i “close_wait” /c
netstat -n |find /i “established” /c
windows下沒有awk,所以要一個一個狀態(tài)的統(tǒng)計它們的數(shù)量。
結(jié)果是:
1)TIME_WAIT: 狀態(tài)的連接達到了 709
sql server占用的TIME_WAIT最多,還有nginx, tomcat都有一些處于 TIME_WAIT狀態(tài)。
2)并且最大的端口達到了 65327 ,六萬多,幾乎接近端口的最大值 65535.
因為是 Windows server 2008,不同Linux下的TCP的調(diào)優(yōu)。
解決方法:將 TcpTimedWaitDelay 調(diào)到 30S,讓 TIME_WAIT 狀態(tài)的維持最多30S,默認是4分鐘。
如何查看或設(shè)置TcpTimedWaitDelay:
cmd中運行 regedit 命令,找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注冊表子鍵
看看有沒有 TcpTimedWaitDelay 項,有的話直接修改,沒有的話創(chuàng)建一個并創(chuàng)建名為 TcpTimedWaitDelay 的新 REG_DWORD 值。 將此值設(shè)置為十進制 30,其為十六進制 0x0000001e。該值將等待時間設(shè)置為 30 秒。 停止并重新啟動系統(tǒng)。 缺省值:0xF0,它將等待時間設(shè)置為 240 秒(4 分鐘)。 建議值:最小值為 0x1E,它將等待時間設(shè)置為 30 秒。
修改之后,重啟系統(tǒng),在觀察,TIME_WAIT在100左右徘徊。效果還是立竿見影的。幾天來一直再也沒有出現(xiàn)Tomcat假死的情況。
當然也可以同時 增大 MaxUserPort 的數(shù)值(2008最大值好像是 65535):
MaxUserPort :確定在應(yīng)用程序從系統(tǒng)請求可用用戶端口時,TCP/IP 可指定的最高端口號。默認是65535,可以調(diào)到10萬.
如何查看或設(shè)置: 使用 regedit 命令訪問 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注冊表子鍵并創(chuàng)建名為 MaxUserPort 的新 REG_DWORD 值,比如設(shè)置成200000。
參見:http://www.cnblogs.com/tianzhiliang/articles/2400176.html