
Linux サーバーでは使用できますnetstat -tan | grep ESTABLISHED| wc -l
が、これは を使用した高負荷サーバーでは機能しませんwatch -n1
。
このアプローチは、サーバーがあまりビジーでない場合、または監視間隔が十分に大きい場合には正常に機能します。しかし、高負荷のサーバーの場合、代替として何が推奨されるでしょうか?
答え1
/proc を使って作業負荷を軽減する
アクセスしたいカーネル変数直接/proc
。これは非常に効率的で、迅速で、システムフレンドリーです。
カーネルがTCP接続とリスニングのリストを保存する擬似ファイル(カーネル変数テーブル)があります/proc/net/tcp
。6番目のフィールドはst
のために州0A
listen エントリと01
確立された接続を含めることができます。
カウントTCP 設立接続:
使用することでグレップgrep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
使用することでawk
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
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
、他のコマンドへのパイプは不要になるため、非常に高速になります。
ss
netstat
は、netstat
ファイル ロックの影響を受ける procfs から読み取るだけなので、より優れています。ss
実際には、カーネル スケジューラによって処理されるカーネル内でクエリが実行され、常に正確な情報が返されます。
答え3
答え4
プロトコルと状態ごとにフィルタリングできる lsof もあります。たとえば、TCP ESTABLISHED 接続を探すには次のようにします。
~# lsof -i tcp -s tcp:ESTABLISHED
次に | wc -l を実行してカウントします。注: 膨大な数の接続でこのコストを試していません。