這篇文章主要介紹“怎么減少Linux服務(wù)器TIME_WAIT過多的問題”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“怎么減少Linux服務(wù)器TIME_WAIT過多的問題”文章能幫助大家解決問題。
站在用戶的角度思考問題,與客戶深入溝通,找到旺蒼網(wǎng)站設(shè)計(jì)與旺蒼網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋旺蒼地區(qū)。
time_wait狀態(tài)的意義:
客戶端與服務(wù)器端建立tcp/ip連接后關(guān)閉socket后,服務(wù)器端連接的端口狀態(tài)為time_wait
是不是所有執(zhí)行主動(dòng)關(guān)閉的socket都會(huì)進(jìn)入time_wait狀態(tài)呢?
有沒有什么情況使主動(dòng)關(guān)閉的socket直接進(jìn)入closed狀態(tài)呢?
主動(dòng)關(guān)閉的一方在發(fā)送最后一個(gè) ack 后就會(huì)進(jìn)入 time_wait 狀態(tài) 停留2msl(max segment lifetime)時(shí)間,這個(gè)是tcp/ip必不可少的,也就是“解決”不了的。
也就是tcp/ip設(shè)計(jì)者本來是這么設(shè)計(jì)的。
主要有兩個(gè)原因
1。防止上一次連接中的包,迷路后重新出現(xiàn),影響新連接(經(jīng)過2msl,上一次連接中所有的重復(fù)包都會(huì)消失)
2。可靠的關(guān)閉tcp連接
在主動(dòng)關(guān)閉方發(fā)送的最后一個(gè) ack(fin) ,有可能丟失,這時(shí)被動(dòng)方會(huì)重新發(fā)fin, 如果這時(shí)主動(dòng)方處于 closed 狀態(tài) ,就會(huì)響應(yīng) rst 而不是 ack。所以主動(dòng)方要處于 time_wait 狀態(tài),而不能是 closed 。
time_wait 并不會(huì)占用很大資源的,除非受到攻擊。
在squid服務(wù)器中可輸入如下命令:
#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
狀態(tài):描述
closed:無連接是活動(dòng)的或正在進(jìn)行
listen:服務(wù)器在等待進(jìn)入呼叫
syn_recv:一個(gè)連接請求已經(jīng)到達(dá),等待確認(rèn)
syn_sent:應(yīng)用已經(jīng)開始,打開一個(gè)連接
established:正常數(shù)據(jù)傳輸狀態(tài)
fin_wait1:應(yīng)用說它已經(jīng)完成
fin_wait2:另一邊已同意釋放
itmed_wait:等待所有分組死掉
closing:兩邊同時(shí)嘗試關(guān)閉
time_wait:另一邊已初始化一個(gè)釋放
last_ack:等待所有分組死掉
也就是說,這條命令可以把當(dāng)前l(fā)inux服務(wù)器的網(wǎng)絡(luò)連接狀態(tài)分類匯總。
下面解釋一下為啥要這樣寫:
一個(gè)簡單的管道符連接了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
你實(shí)際執(zhí)行這條命令的時(shí)候,可能會(huì)得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。
再來看看awk:
/^tcp/
濾出tcp開頭的記錄,屏蔽udp, socket等無關(guān)記錄。
state[]
相當(dāng)于定義了一個(gè)名叫state的數(shù)組
nf
表示記錄的字段數(shù),如上所示的記錄,nf等于6
$nf
表示某個(gè)字段的值,如上所示的記錄,$nf也就是$6,表示第6個(gè)字段的值,也就是time_wait
state[$nf]
表示數(shù)組元素的值,如上所示的記錄,就是state[time_wait]狀態(tài)的連接數(shù)
++state[$nf]
表示把某個(gè)數(shù)加一,如上所示的記錄,就是把state[time_wait]狀態(tài)的連接數(shù)加一
end
表示在最后階段要執(zhí)行的命令
for(key in state)
遍歷數(shù)組
print key,”\t”,state[key]
打印數(shù)組的鍵和值,中間用\t制表符分割,美化一下。
如發(fā)現(xiàn)系統(tǒng)存在大量time_wait狀態(tài)的連接,通過調(diào)整內(nèi)核參數(shù)解決,
vim /etc/sysctl.conf
編輯文件,加入以下內(nèi)容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后執(zhí)行 /sbin/sysctl -p 讓參數(shù)生效。
linux下高并發(fā)的squid服務(wù)器,tcp time_wait套接字?jǐn)?shù)量經(jīng)常達(dá)到兩、三萬,服務(wù)器很容易被拖死。通過修改linux內(nèi)核參數(shù),可以減少squid服務(wù)器的time_wait套接字?jǐn)?shù)量。
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。當(dāng)出現(xiàn)syn等待隊(duì)列溢出時(shí),啟用cookies來處理,可防范少量syn攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將time-wait sockets重新用于新的tcp連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟tcp連接中time-wait sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在fin-wait-2狀態(tài)的時(shí)間。
net.ipv4.tcp_keepalive_time = 1200 表示當(dāng)keepalive起用的時(shí)候,tcp發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外連接的端口范圍。缺省情況下很?。?2768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示syn隊(duì)列的長度,默認(rèn)為1024,加大隊(duì)列長度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets = 5000表示系統(tǒng)同時(shí)保持time_wait套接字的最大數(shù)量,如果超過這個(gè)數(shù)字,time_wait套接字將立刻被清除并打印警告信息。默認(rèn)為 180000,改為5000。對于apache、nginx等服務(wù)器,上幾行的參數(shù)可以很好地減少time_wait套接字?jǐn)?shù)量,但是對于squid,效 果卻不大。此項(xiàng)參數(shù)可以控制time_wait套接字的最大數(shù)量,避免squid服務(wù)器被大量的time_wait套接字拖死。
執(zhí)行以下命令使配置生效:
/sbin/sysctl -p
關(guān)于“怎么減少Linux服務(wù)器TIME_WAIT過多的問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。