您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么減少Linux服務器TIME_WAIT過多的問題”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么減少Linux服務器TIME_WAIT過多的問題”文章能幫助大家解決問題。
time_wait狀態的意義:
客戶端與服務器端建立tcp/ip連接后關閉socket后,服務器端連接的端口狀態為time_wait
是不是所有執行主動關閉的socket都會進入time_wait狀態呢?
有沒有什么情況使主動關閉的socket直接進入closed狀態呢?
主動關閉的一方在發送最后一個 ack 后就會進入 time_wait 狀態 停留2msl(max segment lifetime)時間,這個是tcp/ip必不可少的,也就是“解決”不了的。
也就是tcp/ip設計者本來是這么設計的。
主要有兩個原因
1。防止上一次連接中的包,迷路后重新出現,影響新連接(經過2msl,上一次連接中所有的重復包都會消失)
2。可靠的關閉tcp連接
在主動關閉方發送的最后一個 ack(fin) ,有可能丟失,這時被動方會重新發fin, 如果這時主動方處于 closed 狀態 ,就會響應 rst 而不是 ack。所以主動方要處于 time_wait 狀態,而不能是 closed 。
time_wait 并不會占用很大資源的,除非受到攻擊。
在squid服務器中可輸入如下命令:
#netstat -n | awk '/^tcp/ {++s[$nf]} end {for(a in s) print a, s[a]}'
last_ack 14
syn_recv 348
established 70
fin_wait1 229
fin_wait2 30
closing 33
time_wait 18122
狀態:描述
closed:無連接是活動的或正在進行
listen:服務器在等待進入呼叫
syn_recv:一個連接請求已經到達,等待確認
syn_sent:應用已經開始,打開一個連接
established:正常數據傳輸狀態
fin_wait1:應用說它已經完成
fin_wait2:另一邊已同意釋放
itmed_wait:等待所有分組死掉
closing:兩邊同時嘗試關閉
time_wait:另一邊已初始化一個釋放
last_ack:等待所有分組死掉
也就是說,這條命令可以把當前linux服務器的網絡連接狀態分類匯總。
下面解釋一下為啥要這樣寫:
一個簡單的管道符連接了netstat和awk命令。
先來看看netstat:
netstat -n
active internet connections (w/o servers)
proto recv-q send-q local address foreign address state
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 time_wait
你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。
再來看看awk:
/^tcp/
濾出tcp開頭的記錄,屏蔽udp, socket等無關記錄。
state[]
相當于定義了一個名叫state的數組
nf
表示記錄的字段數,如上所示的記錄,nf等于6
$nf
表示某個字段的值,如上所示的記錄,$nf也就是$6,表示第6個字段的值,也就是time_wait
state[$nf]
表示數組元素的值,如上所示的記錄,就是state[time_wait]狀態的連接數
++state[$nf]
表示把某個數加一,如上所示的記錄,就是把state[time_wait]狀態的連接數加一
end
表示在最后階段要執行的命令
for(key in state)
遍歷數組
print key,”\t”,state[key]
打印數組的鍵和值,中間用\t制表符分割,美化一下。
如發現系統存在大量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 讓參數生效。
linux下高并發的squid服務器,tcp time_wait套接字數量經常達到兩、三萬,服務器很容易被拖死。通過修改linux內核參數,可以減少squid服務器的time_wait套接字數量。
vi /etc/sysctl.conf
增加以下幾行:引用
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
說明:
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 表示如果套接字由本端要求關閉,這個參數決定了它保持在fin-wait-2狀態的時間。
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套接字拖死。
執行以下命令使配置生效:
/sbin/sysctl -p
關于“怎么減少Linux服務器TIME_WAIT過多的問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。