處理 TIME WAIT 過多

2021-10-02 15:13:22 字數 1668 閱讀 2774

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

last_ack 14

syn_recv 348

established 32

fin_wait1 239

fin_wait2 30

closing 31

time_wait 1643

狀態描述

closed:無連線是活動的或正在進行

listen:伺服器在等待進入呼叫

syn_recv:乙個連線請求已經到達,等待確認

syn_sent:應用已經開始,開啟乙個連線

established:正常資料傳輸狀態

fin_wait1:應用說它已經完成

fin_wait2:另一邊已同意釋放

itmed_wait:等待所有分組死掉

closing:兩邊同時嘗試關閉

time_wait:另一邊已初始化乙個釋放

last_ack:等待所有分組死掉

如發現系統存在大量time_wait狀態的連線,通過調整核心引數解決,

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

net.ipv4.tcp_fin_timeout 修改系統預設的 timeout 時間

然後執行 /sbin/sysctl -p 讓引數生效.就是開啟系統的timewait重用和快速**。

以上配置調優後效能還不理想,可繼續修改一下配置:

vim /etc/sysctl.conf

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套接字拖死。

TIME WAIT過多的處理方法

之所以起這樣乙個題目是因為很久以前我曾經寫過一篇介紹time wait的文章,不過當時基本屬於淺嘗輒止,並沒深入說明問題的來龍去脈,碰巧這段時間反覆被別人問到相關的問題,讓我覺得有必要全面總結一下,以備不時之需。討論前大家可以拿手頭的伺服器摸摸底,記住 ss 比 netstat 快 shell ss...

TIME WAIT過多的問題

netstat ant awk tcp end last ack 14 syn recv 348 established 70 fin wait1 229 fin wait2 30 closing 33 time wait 18122 命令解釋 closed 無連線是活動的或正在進行 listen ...

TIME WAIT過多及解決

最近用http load做壓測,跑出來一大串 cannot assign requested address 的錯誤,查了一下,是time wait過多導致的。因為短時間內有太多連線,所以占用了大量埠,同時關閉連線後又處於time wait狀態,埠不能復用,所以慢慢的無埠可用,所以就 cannot ...