KB / MB / Bytes形式で、特定のポートまたはアプリケーションのprocessIDについて、Linuxでリアルタイムのネットワーク統計を取得する方法


19

私が使った IPTrafIftopvnstatbwm-ngifconfig -a。これらのどれも、私のアプリケーションから送受信されているリアルタイムパケットをKBまたはMB形式で見つけるのを助けてくれません。その理由は、私は自分の圧縮が正しいことを非常によく確認する必要があるアプリケーションを書いているのですが、先に進むことをテストすることはできません。

非常に具体的で正確なリアルタイムネットワーク統計を追跡するために使用できるものは何ですか?

enter image description here

回答:


23

あなたのアプリケーションはおそらく特定のUDPもしくはTCPポート番号あるいは特定のIPアドレスにパケットを送信しています。

そのため、TCPdumpのようなものを使ってそのトラフィックを捉えることができます。

TCPdumpはあなたが望むリアルタイムの統計をあなたに与えませんが、あなたはそれがするものにその出力を供給することができます(私は後でこの答えを更新しようとします)。


更新:

$ sudo tcpdump -i eth1 -l -e -n | ./netbps
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:36:53    2143.33 Bps
11:37:03    1995.99 Bps
11:37:13    2008.35 Bps
11:37:23    1999.97 Bps
11:37:33    2083.32 Bps
131 packets captured
131 packets received by filter
0 packets dropped by kernel

しばらくしてCtrl + Cを押して中断しました。

最後に適切なフィルタ式を追加する必要があります。 tcpdump アプリによって生成されたトラフィックのみを含めるように指示します(例: port 123

プログラム netbps これは:

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;

my $reporting_interval = 10.0; # seconds
my $bytes_this_interval = 0;
my $start_time = [Time::HiRes::gettimeofday()];

STDOUT->autoflush(1);

while (<>) {
  if (/ length (\d+):/) {
    $bytes_this_interval += $1;
    my $elapsed_seconds = Time::HiRes::tv_interval($start_time);
    if ($elapsed_seconds > $reporting_interval) {
       my $bps = $bytes_this_interval / $elapsed_seconds;
       printf "%02d:%02d:%02d %10.2f Bps\n", (localtime())[2,1,0],$bps;
       $start_time = [Time::HiRes::gettimeofday()];
       $bytes_this_interval = 0;
    }
  }
}

それはほんの一例です、好みに合わせて調整してください。


どうもありがとう、私はあなたの実用的な例を待ちます。私の目標は、私が$ bwm-ng -oプレーン-N -dを使ってやったようなものでした。これは出力をビット単位で表示しますが、lo以外のインターフェイスを使うと失敗します。一方、IPtrafは優秀なバイトをリアルタイムで表示します。しかし、RX / TXのビットやバイトをリアルタイムで特定のインターフェイスに、あるいはすべてのインターフェイスに合わせてリアルタイムで表示することができるツールはありません。
YumYumYum

@YumYum:答えが更新されました。
RedGrittyBrick

1
あなたは絶対的な伝説です!素晴らしい脚本!共有してくれてありがとう。これは私の質問に答える superuser.com/questions/395226/…
Eamorr

これは組み込みルータのbusybox bashで動作するはずです。 gist.github.com/dagelf/8a842ed755354b31e79214042a4a4695
Dagelf

これはまた達成されます vnstat -tr
St0rM

11

同じフォルダから以下のように使用します。

インターフェイスごとにパッカーをチェックするには ./netpps.sh eth0

インターフェイスごとの速度を確認するには ./netspeed.sh eth0

インターフェイス上の1秒あたりのパケット数の測定 netpps.sh ファイル名として

#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        echo shows packets-per-second
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_packets`
        T1=`cat /sys/class/net/$1/statistics/tx_packets`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_packets`
        T2=`cat /sys/class/net/$1/statistics/tx_packets`
        TXPPS=`expr $T2 - $T1`
        RXPPS=`expr $R2 - $R1`
        echo "TX $1: $TXPPS pkts/s RX $1: $RXPPS pkts/s"
done

インターフェイスのネットワーク帯域幅を測定する netspeed.sh ファイル名として

#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_bytes`
        T1=`cat /sys/class/net/$1/statistics/tx_bytes`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_bytes`
        T2=`cat /sys/class/net/$1/statistics/tx_bytes`
        TBPS=`expr $T2 - $T1`
        RBPS=`expr $R2 - $R1`
        TKBPS=`expr $TBPS / 1024`
        RKBPS=`expr $RBPS / 1024`
        echo "TX $1: $TKBPS kB/s RX $1: $RKBPS kB/s"
done

詳細についてはこのサイトを参照してください http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html


これは「特定のポートまたはアプリケーションのprocessID」に対する実現可能な解決策ではありません。インターフェイスあたりのレートしか得られないためです。
Mene

3

最も使いやすく、出力を制御し、連続ロギングのためにファイルにリダイレクトするのが最も簡単です。

ifstat

おそらくほとんどのLinuxディストリビューションに付属しており、MacでBREWを使ってインストールすることができます。


ありがとう。他の人たちはどのようにしてMacと公平を期すのでしょうか。私はifstatをインストールしようとし、それがどのようになるのか見ていきます。もう少し情報があれば間違いなく役に立つでしょう。
nyxee

3

私はあなたがあなたが必要とする情報を得るためにprocインターフェースを使うことができると思います。私はrt_traf.shと呼ばれるこの小さなシェルスクリプトを作成しました:

#!/bin/bash

cat /proc/$1/net/netstat | grep 'IpExt: ' | tail -n 1 | awk '{ print $8 "\t" $9 }'

これにより、タブで区切られた入力オクテットと出力オクテットが印刷されます。オクテットに8を掛けるとビット/秒になり、次に10 ^ 6で割るとメガビット/秒になります。もちろん、これをシェルスクリプトに追加して、出力を希望どおりにフォーマットすることができます。あなたはそのようにあなたのアプリケーションのPIDでこれを呼ぶことができます ./rt_traf.sh <PID> これにより、起動してからあなたのアプリケーションを瞬時に読み取ることができます。 1秒あたりのリアルタイムの統計を見るには、watchコマンドでシェルスクリプトをラップできます。

watch -n 1 ./rt_traf.sh <PID>

-n パラメータは10分の1秒までずっと調整できます。時間をかけて計算するには、次のようにします。

PID=<PID>; START=`./rt_traf.sh $PID`;IN_START=`echo $START | awk '{ print $1 }'`; OUT_START=`echo $START | awk '{ print $2 }'`; sleep 10; END=`./rt_traf.sh $PID`; IN_END=`echo $END | awk '{ print $1 }'`; OUT_END=`echo $END | awk '{ print $2 }'`; IN_BPS=`echo "scale=2; (($IN_START-$IN_END)/10)/8" | bc`; OUT_BPS=`echo "scale=2; (($OUT_START-$OUT_END)/10)/8" | bc`; echo "In: " $IN_BPS "Bits/second"; echo "Out: " $OUT_BPS "Bits/second"

繰り返しますが、数学はあなたが必要とするサイズ/時間に調整することができます。最もエレガントでシュリンクラップされたソリューションではありませんが、それはピンチで動作するはずです。


3
これは間違っています。 / proc /&lt; PID&gt; / net / netstatにプロセスごとのデータが含まれていません。
nab

nabのコメントを拡張するには: /proc/<pid>/net/netstat と同じデータを返します proc/net/netstatすなわち。すべてのプロセスに対して同じデータが得られます。
EML

2

私はちょうどperlが正しく動かなかった古いシステムでどのくらいのmysqlトラフィックが出入りしているかを測定する必要があったので、私はtcpdumpによって見られる総トラフィックを測定する同じ目的に役立つ数行のawkを書くことに抵抗できませんでした。

# tcpdump -l -e -n port 3306 | \
  awk '{
  t=substr($1, 0, 8);
  n=substr($9, 0, length($9)-1);
  if(t != pt){
    print t, sum;
    sum = 0;
  } else {
    sum += n
  }
  pt=t;
}'

tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:41:54 
14:41:55 466905
14:41:56 765220
14:41:57 741511
14:41:58 688219
14:41:59 492322
14:42:00 800087
14:42:01 1248608
14:42:02 1276476
14:42:03 755586
14:42:04 1029453
14:42:05 818298
^C32515 packets captured
32633 packets received by filter
107 packets dropped by kernel

そして、あなたがワンライナーが好きなら、ここにあなたのためのものがあります:

tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;}else{sum+=n}pt=t;}'

else 文を削除しないと、行がスキップされます。 sum 正確にはなりません。 tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;};sum+=n;pt=t;}
david

0

アプリケーションごとに、xtablesと以下の変更を使用してファイアウォールルールを使用して実行できます。

これは「アプリケーションごと」の質問に答えるのではなく、「インタフェースごと」の質問だけに答えます。

以下は、UbiquitiやOpenWRT互換のものなど、ほとんどの組み込みLinuxルータで動作し、その詳細を/ proc / net / devから取得するスクリプトです。

(そしてパケットなどに変更しやすい)

#!/bin/sh

SLP=1 # output / sleep interval
DEVICE=$1
IS_GOOD=0
for GOOD_DEVICE in `grep \: /proc/net/dev | awk -F: '{print $1}'`; do
    if [ "$DEVICE" = $GOOD_DEVICE ]; then
        IS_GOOD=1
        break
    fi
done

if [ $IS_GOOD -eq 0 ]; then
    echo "Device not found. Should be one of these:"
        grep ":" /proc/net/dev | awk -F: '{print $1}' | sed s@\ @@g 
    exit 1
fi

while true; do

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED1=`echo $LINE | awk '{print $1}'`
TRANSMITTED1=`echo $LINE | awk '{print $9}'`
TOTAL=$(($RECEIVED1+$TRANSMITTED1))

sleep $SLP

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED2=`echo $LINE | awk '{print $1}'`
TRANSMITTED2=`echo $LINE | awk '{print $9}'`
SPEED=$((($RECEIVED2+$TRANSMITTED2-$TOTAL)/$SLP))
INSPEED=$((($RECEIVED2-$RECEIVED1)/$SLP))
OUTSPEED=$((($TRANSMITTED2-$TRANSMITTED1)/$SLP))

printf "In: %12i KB/s | Out: %12i KB/s | Total: %12i KB/s\n" $(($INSPEED/1024)) $(($OUTSPEED/1024)) $((($INSPEED+$OUTSPEED)/1024)) ;

done;

上記をクリップボードにコピーしてから、ルータのターミナルセッションにコピーします。

$ cat > /tmp/n.sh

Ctrl + V(または右クリック/貼り付け)

Ctrl + D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

メモ帳に貼り付けることもできます。編集する必要がある場合は上記の手順を繰り返します。すべての組み込みルーターにエディタがあるわけではありません。 #の上から最後まですべてをコピーしてください。下部にあります。

上のnetppsの例は素晴らしいBTWです - しかし、すべてのデバイスが/ sysファイルシステムをマウントしているわけではありません。 / bin / bashを/ bin / shに、またはその逆に変更する必要があるかもしれません。

ソース: https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549


複数の質問に同じ回答を投稿しないでください。同じ情報が実際に両方の質問に答える場合、一方の質問(通常は新しいもの)をもう一方の質問として閉じる必要があります。あなたはこれを示すことができます 重複して閉じるために投票する あるいは、それについて十分な評判がない場合は、 旗を掲げる それが重複していることを示します。それ以外の場合は、この質問に対する回答を調整し、同じ回答を複数の場所に貼り付けることは避けてください。
DavidPostill

あなたは私の他の記事にまったく同じコメントを投稿しました。
Dagelf

それがカスタマイズされていたのであれば、それは投稿がシステムによってオートフラッグされた後に起こりました。カスタマイズされているかどうかを確認するためにすべての単語を読む時間がありません。
DavidPostill

1
あなたがした唯一のカスタマイズはあなたのanserの始めに2つの文を追加することでした。残りは同じようです。そして、これら2つの文は投稿された通りの元の回答には含まれていませんでした - それが自動的に重複する回答としてフラグが立てられた理由です。
DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.