web-dev-qa-db-ja.com

システムの現在のTCP接続数を取得する

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

TCP接続の合計数が必要です。

22
daisy

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

カーネル自体から情報を取得したい場合は、NETLINK_INET_DIAGを使用して、/procから読み取らずにカーネルから情報を取得できます。

20
Ulrich Dangel

より速い方法?そうすれば、ほんの一瞬で答えが出ます。実際、私のコンピューターでは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」はあまり最適ではないと想定しています。私のテストでは、この仮定が正しいことが示されています。

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

7
Johan