単一プロセスの帯域幅使用量を監視できるツールはありますか?


15

素敵なモニターを見つけまし単一のプロセスのさまざまなランタイムデータを記録できるを。私は帯域幅の使用について同じことをする同等のものを探しています。理想的には、コマンドは次のようになりbwmon --pid 1 --log init.logます。そのようなものはありますか?管理者権限なしで実行できますか?



回答:


3

あなたが始めるための何か(あなたが自分でそれを書きたい場合に備えて):

#!/bin/bash
#
# usage: bwmon PID

IN=0; OUT=0; TIME=0

get_traffic() {
    t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
    IN=${t#*,}; IN=${IN%,*}
    OUT=${t##*,};
    TIME=${t%%,*};
}

get_traffic $1
while true
do
    _IN=$IN; _OUT=$OUT; _TIME=$TIME
    get_traffic $1
    echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
    sleep 1
done

コメント:

  • eth0のみをチェックします
  • 1秒ごとにチェックします
  • Linuxでのみ動作しますが、他のUNIXも同様に動作します(procfsまたは何でも)
  • 出力はsqlite.dbに保存できます stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3

11
これは実際にはプロセスごとのカウンターではないと思います。これは、プロセスの観点から見たインターフェイスの総数にすぎないと思います。nclocalhostでクライアント/サーバーのペアを実行し、1秒あたり1バイトを送信して監視しました/proc/<listening-nc-pid>/net/dev。次に、2番目のncペアを実行し、最大レートで送信しました。私が見ていたファイルは、明らかに2番目のペアのデータと最初のペアのデータをカウントしました。Linux 2.6.32で実行しています。
ジャンダー

エラーが発生しましたfunction strftime never definedgawkをインストールすることで修正されました。
シェパン

4
@Janderそれは正しいです、/proc/<pid>/net/devそして/proc/net/devここに同じ内容があります。したがって、sciptは、特定のプロセスではなく、eth0のトラフィックのみを報告します。
scai

1
これが答えではないことを確認します。eth0プロセスで見られるように、のインターフェイスカウンターを測定します。そのインターフェイスを介してプロセスによって送信されたデータカウントされませ
ナビン

@Navin答えは、質問に答えようとするものです。間違った答えはまだ答えです。これが間違っている場合、あなたはそれを投票するかもしれませんが、それはまだ答えです。
テルドン

6

使用される一般的なI / O帯域幅に満足している場合(またはプログラムがほぼ完全にネットワークI / Oを行う場合)、/proc/<pid>/ioファイルを監視できます。rcharwcharフィールドが必要です。あなたは減算することをお勧めしますread_byteswrite_bytes、彼らは読み込み、ストレージ層への書き込みを表しているので、。http://www.kernel.org/doc/Documentation/filesystems/proc.txtのセクション3.3を参照してください

さらに解像度が必要な場合は...とを使用lsofしてスクリプトを作成することもできますがstrace、すべてのコーナーケースを正しく行うのは苦痛です。基本的な考え方は、出力解析することですstrace -p <pid>、最初のパラメータをつかん(=ファイルディスクリプタ)からの戻り値(=バイト数)read()write()send()、およびrecv()コール( I避難所」;をリッスンするには、いくつかのより多くのシステムコールがあるがtはそれらをすべて追跡しました)。負の値を破棄します。エラーを示しています。lsof -p <pid>どのファイル記述子がTCP / UDPソケットであるかを把握し、fdごとのカウントを合計するために使用します。検査しているプロセスを所有している限り、この戦略はルートを必要としませんが、うまく書くことはもちろん、書くのは本当に難しいでしょう。


3

nethogsを試してください

NetHogsは小さな「ネットトップ」ツールです。ほとんどのツールのように、プロトコルごとまたはサブネットごとにトラフィックを分類する代わりに、プロセスごとに帯域幅をグループ化します。NetHogsは、ロードされる特別なカーネルモジュールに依存しません。突然大量のネットワークトラフィックが発生した場合は、NetHogsを起動して、どのPIDがこれを引き起こしているかをすぐに確認できます。これにより、ワイルドになり、突然帯域幅を占有しているプログラムを簡単に特定できます。

2
悲しいことに、単一のプロセスを監視することはできず、ログも記録しません。2番目の要件(ロギング)は、最初の要件よりもはるかに重要です。ああ、それは管理者権限なしでは実行されません:(
tshepang

1
これにはほぼ確実にルート権限が必要です。
ファルマーリ

-tフラグ(トレースモード)を指定してnethogsを使用してみてください。結果の出力は、あなたが興味を持っている単一のプロセスのトラフィックを抽出するために解析することができます。
ヴァレリオ・スキアヴォーニに
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.