web服务减少服务器TIME_WAIT
TIME_WAIT狀態(tài)的意義:
???????? 客戶端與服務(wù)器端建立TCP/IP連接后關(guān)閉SOCKET后,服務(wù)器端連接的端口狀態(tài)為TIME_WAIT,是不是所有執(zhí)行主動關(guān)閉的socket都會進(jìn)入TIME_WAIT狀態(tài)呢?有沒有什么情況使主動關(guān)閉的socket直接進(jìn)入CLOSED狀態(tài)呢?
???????? 主動關(guān)閉的一方在發(fā)送最后一個(gè) ack 后就會進(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ù)包都會消失)
???????? 2、可靠的關(guān)閉TCP連接在主動關(guān)閉方發(fā)送的最后一個(gè) ack(fin) ,有可能丟失,這時(shí)被動方會重新發(fā)fin, 如果這時(shí)主動方處于 CLOSED 狀態(tài) ,就會響應(yīng) rst 而不是 ack。所以主動方要處于 TIME_WAIT 狀態(tài),而不能是 CLOSED 。TIME_WAIT 并不會占用很大資源的,除非受到***。在Squid服務(wù)器中可輸入如下命令:
主動方要處于 TIME_WAIT 狀態(tài),而不能是 CLOSED 。TIME_WAIT 并不會占用很大資源的,除非受到***。在Squid服務(wù)器中可輸入如下命令:
?
狀態(tài)描述:
CLOSED:無連接是活動的或正在進(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)前系統(tǒng)的網(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í)候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。
——————————————————————
再來看看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)容:
然后執(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
增加以下幾行:引用
?
說明:
執(zhí)行以下命令使配置生效:
/sbin/sysctl -p
轉(zhuǎn)載于:https://blog.51cto.com/yinhaijin/1113023
總結(jié)
以上是生活随笔為你收集整理的web服务减少服务器TIME_WAIT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HP-JavaUtil: xls 操作类
- 下一篇: 智慧水务建设纪实:数字可视化大屏+智能A