1. 程式人生 > >服務器性能調優(netstat監控大量ESTABLISHED連接與Time_Wait連接問題)

服務器性能調優(netstat監控大量ESTABLISHED連接與Time_Wait連接問題)

r報錯 nginx vim 個數字 syn攻擊 並發 tco dir XML

netstat監控大量ESTABLISHED連接與Time_Wait連接問題

問題描述:

在不考慮系統負載、CPU、內存等情況下,netstat監控大量ESTABLISHED連接與Time_Wait連接。

# netstat -n | awk ‘/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}‘
CLOSE_WAIT         348
ESTABLISHED        1240
TIME_WAIT          5621

監控Apache與tomcat之間的鏈接端口

#netstat -n | grep 8009 | wc -l

7198

問題1:怎麽解決大量Time_Wait

通過調整內核參數:

技術分享
vim /etc/sysctl.conf
#編輯文件,加入以下內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
#然後執行 /sbin/sysctl -p 讓參數生效。
技術分享

配置說明:

net.ipv4.tcp_syncookies = 1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0,表示關閉;

net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;

net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉;

net.ipv4.tcp_fin_timeout=30修改系統默認的 TIMEOUT 時間。

如果以上配置調優後性能還不理想,可繼續修改一下配置:

技術分享
vi /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 1200 
#表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為20分鐘。
net.ipv4.ip_local_port_range = 1024 65000 
#表示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 
#表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_tw_buckets = 5000 
#表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。
默認為180000,改為5000。對於Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於 Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。
技術分享

調優完畢,再壓一下看看效果吧。

# netstat -n | awk ‘/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}‘

ESTABLISHED        968

問題1:怎麽解決請求結束後依然存在大量ESTABLISHED沒有被釋放

初步推斷是tomcat服務器回收session時出了問題,這個一般都跟服務器的Timeout設置有聯系。

查看tomcat的配置文件 server.xml

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />
*****

檢查配置得出20000毫秒的時候acceptCount=”100” ,明顯不合理,最大連接數也太小了吧。

所以進一步優化:

connectionTimeout="20000" 改為 connectionTimeout="100"

acceptCount="100"改為acceptCount="5000"

優化完畢,繼續壓測...

系統響應能力節節攀升,之前LoadRunner報錯問題直到壓倒***並發也再也沒有出現。

Action.c(380): 錯誤 -26608: 對於“http://www.cnlogs.com/javame”,HTTP 狀態代碼=504 (Gateway Time-out)

服務器性能調優(netstat監控大量ESTABLISHED連接與Time_Wait連接問題)