我為啥會發現呢,本來任務是發現pinpoint上有的請求時間等待間隙過長,為了查詢出tomcat的api鏈路有等待的。我開始排查tcp的連線開始,然後再到tomcat的執行緒優化數。再檢查到tcp連線的時候發現了大問題。
netstat -ant |
grep 8080 |
wc -l
使用以上命令檢視tomcat的連線數,忽然發現連線數500多,一時我驚到了,公司業務並沒有達到那個級別,服務的併發連線數也就三四十是正常的。
然後我使用了另乙個命令統計這台服務的tcp數
~$ netstat -n |
awk'/^tcp/ end '
last_ack 1
close_wait 4
established 144
time_wait 4234
然後看到結果,time_wait的狀態連線是4234。再看established的狀態才144,這個很不正常。
tcp/ip協議我就不講解了,因為我怕我講的也不是很官方話,大家可以自己去了解下這些狀態
這個出現大量time_wait,我檢查了cpu負載,和記憶體,發現都還正常。這個話只會占用了連線的埠,可是這個也是個大問題。需要處理下。不然後邊遇到大流量,或者攻擊的話,會提前影響業務了。
乙個tcp/ip連線斷開以後,會通過time_wait的狀態保留一段時間,時間過了才會釋放這個埠,當埠接受的頻繁請求數量過多的時候,就會產生大量的time_wait狀態的連線,這些連線佔著埠,會消耗大量的資源。
1、開啟/etc/sysctl.conf檔案,修改tcp/ip核心引數。(建議先備份一下舊的檔案,養成習慣。)
vim /etc/sysctl.conf
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 時間。
# 下邊幾個引數,建議只在流量非常大的伺服器上開啟,會有顯著的效果。一般的流量小的伺服器上,沒有必要去設定這幾個引數。這幾個引數的含義如下:
net.ipv4.tcp_keepalive_time = 1200 #表示當keepalive起用的時候,tcp傳送keepalive訊息的頻度。預設是2小時,改為20分鐘。
net.ipv4.ip_local_port_range = 10000 65000 #表示用於向外連線的埠範圍。預設情況下很小:32768到61000,改為10000到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拖死。
2、修改完後執行
sysctl -p
然後就可以了。可以再使用命令檢查下。tcp的time_wait狀態數。 很多TIME WAIT連線解決
發現很多time wait連線,但是程序fd正常,connect 返回 1時候errno 99 cannot assign requested address的解決辦法 今天多程序導資料時候,遇到乙個問題,現象是 多程序跑一會,所有程序開始connect 返回 1 同時errno 99 cannot...
幾種TCP連線中出現RST的情況
應該沒有人會質疑,現在是乙個網路時代了。應該不少程式設計師在程式設計中需要考慮多機 區域網 廣域網的各種問題。所以網路知識也是避免不了學習的。而且筆者一直覺得tcp ip網路知識在乙個程式設計師知識體系中必需占有一席之地的。在tcp協議中rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或...
幾種TCP連線中出現RST的情況
在tcp協議中rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或缺的。傳送rst包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄快取區的包傳送rst包。而接收端收到rst包後,也不必傳送ack包來確認。其實在網路程式設計過程中,各種rst錯誤其實是比較難排查和找到原因的。下面列出幾種會...