關于Linux下如何查看Nginx的并發連接數和連接狀態的詳細介紹

linux下查看nginx等的并發連接數和連接linux

1、查看Web服務器(Nginx Apache)的并發請求數及其TCP連接狀態:?

netstat?-n?|?awk?'/^tcp/?{++S[$NF]}?END?{for(a?in?S)?print?a,?S[a]}'

或者:

netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(linux in state) print key,”t”,state[key]}’返回結果一般如下:?

LAST_ACK?5?(正在等待處理的請求數)  SYN_RECV?30?  ESTABLISHED?1597?(正常數據傳輸狀態)?  FIN_WAIT1?51?  FIN_WAIT2?504?  TIME_WAIT?1057?(處理完畢,等待超時結束的請求數)

其他參數說明:?

CLOSED:無連接是活動的或正在進行

linuxEN:服務器在等待進入呼叫?

SYN_RECV:一個連接請求已經到達,等待確認?

SYN_SENT:應用已經開始,打開一個連接?

ESTABLISHED:正常數據傳輸狀態?

FIN_WAIT1:應用說它已經完成?

FIN_WAIT2:另一邊已同意釋放?

ITMED_WAIT:等待所有linux死掉?

CLOSING:兩邊同時嘗試關閉?

TIME_WAIT:另一邊已初始化一個釋放?

LAST_ACK:等待所有分組死掉?

常用的三個狀態是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主動關閉,CLOSE_WAIT 表示被動關閉。

TCP協議規定,對于已經建立的連接,網絡雙方要進行四次握手才能成功斷開連接,如果缺少了其中某個步驟,將會使連接處于假死狀態,連接本身占用的資源不會被釋放。網絡服務器程序要同時管理大量連接,所以很有必要保證無用連接完全斷開,否則大量僵死的連接會浪費許多服務器資源。在眾多TCP狀態中,最值得注意的狀態有兩個:CLOSE_WAIT和TIME_WAIT。 ?

TIME_WAIT?

TIME_WAIT 是主動關閉鏈接時形成的,等待2MSL時間,約4分鐘。主要是防止最后一個ACK丟失。 ?由于TIME_WAIT 的時間會非常長,因此server端應盡量減少主動關閉連接

CLOSE_WAIT

CLOSE_WAIT是被動關閉連接是形成的。根據TCP狀態機,服務器端收到客戶端發送的FIN,則按照TCP實現發送ACK,因此進入CLOSE_WAIT狀態。但如果服務器端不執行close(),就不能由CLOSE_WAIT遷移到LAST_ACK,則系統中會存在很多CLOSE_WAIT狀態的連接。此時,可能是系統忙于處理讀、寫操作,而未將已收到FIN的連接,進行close。此時,recv/read已收到FIN的連接socket,會返回0。

為什么需要 TIME_WAIT 狀態?

假設最終的ACK丟失,server將重發FIN,client必須維護TCP狀態信息以便可以重發最終的ACK,否則會發送RST,結果server認為發生錯誤。TCP實現必須可靠地終止連接的兩個方向(全雙工關閉),client必須進入 TIME_WAIT 狀態,因為client可能面 臨重發最終ACK的情形。

為什么 TIME_WAIT 狀態需要保持 2MSL 這么長的時間?

如果 TIME_WAIT 狀態保持時間不足夠長(比如小于2MSL),第一個連接就正常終止了。第二個擁有相同相關五元組的連接出現,而第一個連接的重復報文到達,干擾了第二個連接。TCP實現必須防止某個連接的重復報文在連接終止后出現,所以讓TIME_WAIT狀態保持時間足夠長(2MSL),連接相應方向上的TCP報文要么完全響應完畢,要么被 丟棄。建立第二個連接的時候,不會混淆。

?TIME_WAIT 和CLOSE_WAIT狀態socket過多

如果服務器出了異常,百分之八九十都是下面兩種情況:

1.服務器保持了大量TIME_WAIT狀態

2.服務器保持了大量CLOSE_WAIT狀態,簡單來說CLOSE_WAIT數目過大是由于被動關閉linux不當導致的。

因為linux分配給一個用戶的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT兩種狀態如果一直被保持,那么意味著對應數目的通道就一直被占著,而且是“占著茅坑不使勁”,一旦達到句柄數上限,新的請求就無法被處理了,接著就是大量Too Many Open linuxs異常,Tomcat崩潰。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享