KB / MB / 바이트 형식의 Linux에서 특정 포트 또는 응용 프로그램 processID에 대한 실시간 네트워크 통계를 얻는 방법은 무엇입니까?


22

내가 사용 IPTraf, Iftop, vnstat, bwm-ng, ifconfig -a. 이들 중 어느 것도 KB 또는 MB 형식으로 내 응용 프로그램에서 보내고받는 실시간 패킷을 찾는 데 도움이되지 않습니다. 그 이유는 압축이 올바른지 확인 해야하는 응용 프로그램을 작성하고 있지만 테스트를 진행할 수 없기 때문입니다.

매우 구체적이고 정확한 실시간 네트워크 통계를 추적하기 위해 무엇을 사용할 수 있습니까?

여기에 이미지 설명을 입력하십시오

답변:


27

응용 프로그램이 특정 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를 눌러 1 분 후에 중단했습니다.

당신은 끝에 적절한 필터 식을 추가해야 할 것입니다 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;
    }
  }
}

그것은 단지 예일뿐입니다.


많은 감사, 나는 당신의 작업 예를 기다릴 것입니다. 내 목표는 인터페이스별로 비트로 출력을 표시하지만 lo를 제외하고 인터페이스를 사용하면 실패하는 $ bwm-ng -o plain -N -d로 수행 한 것과 같습니다. 반면 IPtraf는 실시간으로 우수한 바이트를 보여줍니다. 그러나 특정 인터페이스 또는 인터페이스 등을 위해 RX / TX에서 실시간으로 비트 및 바이트처럼 말할 수있는 도구는 없습니다. 누락되었습니다 :-(
YumYumYum

@ Yuumum : 답변이 업데이트되었습니다.
RedGrittyBrick

1
@RedGrittyBrick 당신은 절대 전설입니다! 대본! 공유해 주셔서 감사합니다. 이것은 superuser.com/questions/395226/
Eamorr

이것은 내장 라우터의 busybox bash에서 작동해야합니다. gist.github.com/dagelf/8a842ed755354b31e79214042a4a4695
Dagelf

이것은 또한 달성한다vnstat -tr
St0rM

14

동일한 폴더에서 아래와 같이 사용법 :

인터페이스 당 패커를 확인하려면 ./netpps.sh eth0

인터페이스 당 속도를 확인하려면 ./netspeed.sh eth0

파일 이름으로 인터페이스 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

6

연속 로깅을 위해 사용하기 쉽고 출력을 제어하고 파일로 리디렉션하기가 가장 쉽습니다.

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>있으므로 시작 이후 응용 프로그램을 즉시 읽을 수 있습니다. 초당 실시간 통계를 보려면 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 / <PID> / 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의 시작 부분에 두 문장을 추가하는 것이 었습니다. 나머지는 동일하게 보입니다. 그리고이 두 문장은 게시 된대로 원래 답변에 없었으므로 자동으로 중복 답변으로 표시되었습니다.
DavidPostill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.