最近用http_load做壓測,跑出來一大串「cannot assign requested address 」的錯誤,查了一下,是time_wait過多導致的。因為短時間內有太多連線,所以占用了大量埠,同時關閉連線後又處於time_wait狀態,埠不能復用,所以慢慢的無埠可用,所以就「cannot assign requested address」了。
可以對核心引數進行優化:
sysctl -w net.ipv4.tcp_timestamps=1 開啟對於tcp時間戳的支援,若該項設定為0,則下面一項設定不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示開啟tcp連線中time-wait sockets的快速**
echo 5000> /proc/sys/net/ipv4/tcp_max_tw_buckets
問題解決了,不過還是要來**一下,為什麼會有time_wait,以及上面的修改是什麼意思。
time_wait是tcp關閉連線中,主動關閉的一方,在接收到對方的fin包,並給出ack應答後,會進入的乙個狀態。下面的圖來自《unp》
為什麼一定要有time_wait的狀態?能否直接進入closeed?不能,tcp是建立在不可靠網路上的可靠協議,主動方傳送的ack包可能延遲,從而觸發被動方的fin包重傳,這一來一去,就是2msl的時間。因此,必須要有這個狀態,以保證tcp的可靠性。否則,如果當重傳的fin包到達後,可能導致兩個問題:
1. 舊連線已經不在,只能返回rst包,被動關閉的一方無法關閉tcp連線
2. 新連線已經建立,fin包可能對新連線有干擾。
所以,time_wait不能沒有,但不能太多,該考慮限制它的數量。
tcp_max_tw_buckets:很顯然,用於控制time_wait數量的。
tcp/ip協議還有許多要了解的地方。
解決TIME WAIT過多問題
netstat n 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過多問題
netstat n 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過多造成的問題
tcp ip time wait狀態原理 通訊雙方建立tcp連線後,主動關閉連線的一方就會進入time wait狀態 客戶端主動關閉連線時,會傳送最後乙個ack後,然後會進入time wait狀態,再停留2個msl時間 後有msl的解釋 進入closed狀態 下圖是以客戶端主動關閉連線為例,說明這一...