確立されたTCP接続の数を取得する

確立されたTCP接続の数を取得する

Linux サーバーでは使用できますnetstat -tan | grep ESTABLISHED| wc -lが、これは を使用した高負荷サーバーでは機能しませんwatch -n1

このアプローチは、サーバーがあまりビジーでない場合、または監視間隔が十分に大きい場合には正常に機能します。しかし、高負荷のサーバーの場合、代替として何が推奨されるでしょうか?

答え1

/proc を使って作業負荷を軽減する

アクセスしたいカーネル変数直接/proc。これは非常に効率的で、迅速で、システムフレンドリーです。

カーネルがTCP接続とリスニングのリストを保存する擬似ファイル(カーネル変数テーブル)があります/proc/net/tcp。6番目のフィールドはstのために0Alisten エントリと01確立された接続を含めることができます。

カウントTCP 設立接続:

使用することで
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
使用することで
awk  </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'

または

awk  </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
使用することで
sed  </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l

実行時間

この質問は高負荷システムを表しています。私はちょっとしたベンチをやりました:

ミリ秒単位のメソッド回答

grep テクノ 2.48
awk 正規表現なし ($4=="01") 2.51
sed | WC 2.67
正規表現を使用した awk 2.93

ss -neopt 状態が確立されました | wc -l Suprjami 15.14
lsof -i tcp -s tcp:ESTABLISHED トニオック 25055.00

わかりました。Tonioc の回答は非常に遅いですが、冗長性が非常に興味深いです。したがって、高負荷のシステムでは使用できません。

ssこのベンチを見ると、非常に便利な専用ツールであれば、/proc変数の問い合わせがはるかに速くなることがわかります。

答え2

次のコマンドを使用します:

ss -neopt state established

これにより、状態にある TCP セッションのみが表示されESTABLISHED、他のコマンドへのパイプは不要になるため、非常に高速になります。

ssnetstatは、netstatファイル ロックの影響を受ける procfs から読み取るだけなので、より優れています。ss実際には、カーネル スケジューラによって処理されるカーネル内でクエリが実行され、常に正確な情報が返されます。

答え3

こちらもチェック:527875

netstat + grep少数の接続には良いシンプルなオプションですが、接続数が非常に多い場合はssニクスクラフト

例えば:ss -s

Total: 78 (kernel 79)
TCP:   31 (estab 27, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 16

Transport Total     IP        IPv6
*     79        -         -        
RAW   0         0         0        
UDP   4         2         2        
TCP   31        2         29       
INET      35        4         31       
FRAG      0         0         0  

答え4

プロトコルと状態ごとにフィルタリングできる lsof もあります。たとえば、TCP ESTABLISHED 接続を探すには次のようにします。

~# lsof -i tcp -s tcp:ESTABLISHED

次に | wc -l を実行してカウントします。注: 膨大な数の接続でこのコストを試していません。

関連情報