解決web中出現大量TIME WAIT問題

2021-09-04 10:25:08 字數 1667 閱讀 7284

新增的一組apache伺服器上線以來,我用netstat -an命令發現伺服器中有大量狀態為time-wait的tcp連線,於是用/sbin/sysctl -a檢視了一下linux的各項核心引數,並翻閱有關資料,決定修改其中的兩項引數,以達到減少tcp連線中time-wait sockets的目的。

vi /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 

說明:

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,表示關閉。

再執行以下命令,讓修改結果立即生效:

/sbin/sysctl -p

用以下語句看了一下伺服器的tcp狀態:

netstat -n | awk '/^tcp/  end '

返回結果如下:

established 1423

fin_wait1 1

fin_wait2 262

syn_sent 1

time_wait 962

效果:處於time_wait狀態的sockets從原來的10000多減少到1000左右。處於syn_recv等待處理狀態的sockets為0,原來的為50~300。

下面附上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 並不會占用很大資源的,除非受到***。

還有,如果一方 send 或 recv 超時,就會直接進入 closed 狀態。

本文出自 「為生活喝彩

」 部落格,請務必保留此出處

解決web中出現大量TIME WAIT問題

新增的一組apache伺服器上線以來,我用netstat an命令發現伺服器中有大量狀態為time wait的tcp連線,於是用 sbin sysctl a檢視了一下linux的各項核心引數,並翻閱有關資料,決定修改其中的兩項引數,以達到減少tcp連線中time wait sockets的目的。vi...

解決web中出現大量TIME WAIT問題

新增的一組apache伺服器上線以來,我用netstat an命令發現伺服器中有大量狀態為time wait的tcp連線,於是用 sbin sysctl a檢視了一下linux的各項核心引數,並翻閱有關資料,決定修改其中的兩項引數,以達到減少tcp連線中time wait sockets的目的。vi...

解決使用fastJson中出現 ref問題

首先 部門與組織是manytoone和onetomany的關係,並且兩張表都有自關聯,查詢部門資訊時會級聯查詢上級部門以及他的組織結構,然後返回json資料時,會出現 ref 即 為了攻破它,在兩張表的onetomany那方,也就是set的那方,加乙個fastjson的註解 jsonfield se...