システム上の現在のTCP接続カウントを取得する


22

を行う代わりにwc -l /proc/net/tcp、それを行うより速い方法はありますか?

tcp接続の総数が必要です。


5
たぶん試してみてくださいss -s
ウルリッヒ・ダンジェル

@UlrichDangelかっこいい、それはsockstatを読むことで速くなります。あなたは実際に回答エリアにそれを置くことができます;
デイジー

回答:


20

番号を取得するだけで、詳細が必要ない場合は、からデータを読み取ることができます/proc/net/sockstat{,6}。接続の絶対数を取得するには、両方の値を組み合わせる必要があることに注意してください。

カーネル自体から情報を取得する場合は、カーネルから情報を取得するために使用NETLINK_INET_DIAGすることができます。 /proc


1
私のソリューションと最終的な答えを得るために追加の計算とフィルタリングを必要とする上記の提案されたソリューションのパフォーマンスを比較する多くの接続を備えたシステムでのテストを見てください。
ヨハン

7

より速い方法ですか?そのようにすると、ほんの数秒で答えが得られます。実際、私のコンピューターでは0.009秒かかります。

より少ないタイピングを必要とする方法を探していますか?その場合、エイリアスを設定します、例えば

alias tcpcount="wc -l /proc/net/tcp"

これでエイリアス名を入力できますtcpcount。たとえば、この例で使用したように、この番号を取得できます。

行を入力するか、.bashrcに追加して、ログインするたびにエイリアスが定義されるようにします。

多数の接続の場合、次の動作が少し速くなる可能性があります(非常に少数の接続では少し遅くなります)

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

または多分 ...

awk 'END {print NR}' /proc/net/tcp

これらのソリューションは両方とも、「wc」が行数を数えるだけではあまり最適ではないと想定しています。私のテストでは、この仮定が正しいことが示されています。

1つ目は、tailコマンドが不要なデータの破棄に非常に優れているという前提で機能するため、追加のサブシェルの作成と環境変数の追加作業を補います。/ proc / net / tcpの行にすでに番号が付けられているという事実を活用して、行をカウントする必要をなくします。最後のソリューションでは、awkが十分にカウントされ、より大きなプログラムのロードと複数のプロセスの作成に起因する不利益を相殺することを前提としています。awkソリューションには、単純な1行のエイリアス定義にうまく適合するという追加の利点があります(スクリプトが呼び出されないため、追加のシェルプロセスが分岐せず、ミリ秒の利点が追加されるという追加の利点があります)。


1
3秒以上かかる40k +接続があります
デイジー

2
うーん、から読むよりもずっと速い方法はないと思います/proc/net/tcp。試してみることができますnetstat -n -t | wc -lが、私の推測では、netstatからも読み取ります/proc/net/tcp
-Kotte

netstatは私のシステムで/ proc / net / tcpを読み取るよりも3倍以上遅くなりますが、接続数が非常に少ないため、接続数が多い場合は起動時のオーバーヘッドがいくらか軽減される可能性があります。netstatを使用すると、さまざまな状態の接続数を簡単に取得できます
Johan

1
16 GB RAMを搭載したサーバーでは、netstat -nt約180.000の接続で1分以上かかるようになりました。私はそれがとても遅くする必要がありますない理由を見ない...(読み取りが/proc/net/tcp非常に遅いもある)
Marki555

1
接続が180kのマシンでの恥ずかしがり屋のテストのいくつかawkは、アプローチが非常に遅いことを示していwcます。tailと同等のようwcです。
フェリックスフランク14

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.