1、time_wait的產生原因
因為tcp連線是雙向的,所以在關閉連線的時候,兩個方向各自都需要關閉。先發fin包的一方執行的是主動關閉;後發fin包的一方執行的是被動關閉。主動關閉的一方會進入time_wait狀態,並且在此狀態停留兩倍的msl時長。
time_wait問題小結 – 網易杭州qa – 網易杭州 qa team
msl指的是報文段的最大生存時間,如果報文段在網路活動了msl時間,還沒有被接收,那麼會被丟棄。關於msl的大小,rfc 793協議中給出的建議是兩分鐘,不過實際上不同的作業系統可能有不同的設定,以linux為例,通常是半分鐘,兩倍的msl就是一分鐘,也就是60秒,並且這個數值是硬編碼在核心中的,也就是說除非你重新編譯核心,否則沒法修改它。
time_wait狀態存在的必要性。為什麼主動關閉的一端不直接進入closed狀態,而是要先進入time_wait並且停留兩倍的msl時長呢?這是因為tcp是建立在不可靠網路上的可靠協議。如果主動關閉的一端收到被動關閉一端的發出的fin包後,返回ack包,同時進入time_wait,但是由於網路的原因,主動關閉一端傳送的ack包可能會延遲,從而觸發被動關閉一方重傳fin包,這樣一來一回極端情況正好是2msl。如果主動關閉的一端直接close或者不到兩倍msl時間就關閉,那麼被動關閉發出重傳fin包到達,可能出現的問題是:舊的連線不存在,系統只能返回rst包;新的tcp連線已經建立,延遲包可能會干擾新連線。這都可能導致tcp不可靠。
2、time_wait過多的危害
在生產過程中,如果伺服器使用短連線,那麼完成一次請求後會主動斷開連線,就會造成大量time_wait狀態。因此我們常常在系統中會採用長連線,減少建立連線的消耗,同時也減少time_wait的產生,但實際上即使使用長連線配置不當時,當time_wait的生產速度遠大於其消耗速度時,系統仍然會累計大量的time_wait狀態的連線。time_wait狀態連線過多就會造成一些問題。如果客戶端的time_wait連線過多,同時它還在不斷產生,將會導致客戶端埠耗盡,新的埠分配不出來,出現錯誤。如果伺服器端的time_wait連線過多,可能會導致客戶端的請求連線失敗,這在接下來舉例說明。
案例一:
將nginx作為反向**時,後連tomcat等伺服器。測試中不同併發壓力下多次、反覆出現nginx伺服器端口資源耗盡的問題。表現為nginx伺服器出現大量time_wait狀態連線,埠資源耗盡(nginx報錯:cannot assign requested address )。首先檢查nginx開啟了長連線keepalive,但是系統仍然出現了大量的time_wait,這就和之前提到的當系統產生time_wait的速度大於其消耗速度時,就會累計time_wait。原因是:keepalive取配置太小,將其增大後問題得以解決。(ps:nginx總的keepalive連線池大小 = keepalive取值 * nginx worker數)
案例二:
某應用其中一層系統架構nginx+tomcat,tomcat伺服器上出現了大量的time_wait。
nginx作為反向**,長連線配置主要有三項,upstream中的keepalive設定單個worker最大請求數,引數proxy_http_version 1.1強制轉換為http1.1協議(預設支援長連線),proxy_set_header connection將請求頭部connection為空(http1.0請求預設connection頭部為close),後兩項要放到server域中,配置後問題即可解決。
但是我們不禁會嘗試疑問time_wait出現在tomcat而不是在nginx上?從抓包可以看出nginx傳送給tomcat包頭部connection為close,所以tomcat在處理完head請求後就主動關閉,所以time_wait出現在tomcat伺服器。
參考:
tomcat大量time wait問題
在服務端訪問量大的時候檢測到大量的time wait,並且介面請求延時較高。執行 netstat n awk tcp end 這個shell命令的意思是把netstat n 後結果的最後一條放到s陣列中,如果相同則執行 1操作。此時能看到tcp各種狀態下的連線數量,示例 服務端架構是採用nginx ...
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過多問題
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 伺...