
見つけました。良いモニターこれにより、単一プロセスのさまざまなランタイムデータを記録できます。帯域幅使用量と同じことを行う同等の方法を探しています。理想的には、コマンドはbwmon --pid 1 --log init.log
次のようになります。管理者権限なしで実行できますか?
答え1
使用されている一般的なI / O帯域幅に満足している場合(またはプログラムがほぼ排他的にネットワークI / Oを実行している場合)、ファイルを表示できます/proc/<pid>/io
。あなたはフィールドrchar
が欲しいですwchar
。合計はストレージ階層への読み取りと書き込みを表すため、read_bytes
合計を引く必要があるかもしれません。write_bytes
セクション3.3を参照してください。http://www.kernel.org/doc/Documentation/filesystems/proc.txt。
さらにソリューションが必要な場合は、lsof
このスクリプトを使用して作成できますstrace
。しかし、すべての特別なケースを正しく処理するのは難しいでしょう。基本的なアイデアは、および呼び出しの出力をstrace -p <pid>
解析することです(read()
write()
send()
recv()
ノート受信するシステムコールがいくつかあります。まだすべて追跡していません。負の値は削除され、エラーを示します。lsof -p <pid>
どのファイル記述子がTCP / UDPソケットであるかを確認し、各fdの数を合計するために使用されます。このポリシーは確認されているプロセスを所有している限り、rootを必要としませんが、うまく書くのはかなり面倒です。
答え2
努力するインターネット豚:
NetHogsは小さな「netHogs」ツールです。ほとんどのツールと同様に、プロトコルやサブネットごとにトラフィックを分類するのではなく、プロセスごとに帯域幅をグループ化します。 NetHogsはロードするために特別なカーネルモジュールに依存しません。ネットワークトラフィックが突然急増した場合は、NetHogsを起動し、どのPIDが状況を引き起こしているかをすぐに確認できます。これにより、狂ったように実行され、突然帯域幅を占めるプログラムを簡単に識別できます。
答え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