KB / MB / Bayt biçimiyle ve belirli bağlantı noktası veya uygulama işlem kimliği için Linux'ta gerçek zamanlı ağ istatistiklerini nasıl alabilirim?


22

Kullandığım IPTraf, Iftop, vnstat, bwm-ng, ifconfig -a. Hiçbiri, uygulamamdan KB veya MB formatında gönderilen / alınan gerçek zamanlı paketleri bulmama yardım etmiyor. Bunun nedeni, sıkıştırma işlemimin doğru olduğundan çok emin olmam gereken bir uygulama yazıyorum, ancak ilerlemek için test yapamıyorum.

Çok özel ve doğru gerçek zamanlı ağ istatistiklerini izlemek için ne kullanabilirim?

resim açıklamasını buraya girin

Yanıtlar:


27

Uygulamanız muhtemelen belirli bir UDP veya TCP bağlantı noktası numarasına veya belirli bir IP adresine paket gönderiyor.

Bu nedenle, bu trafiği yakalamak için TCPdump gibi bir şey kullanabilirsiniz.

TCPdump size istediğiniz gerçek zamanlı istatistikleri vermez, ancak çıktısını yapan bir şeyle besleyebilirsiniz (bu cevabı daha sonra bir cevapla güncellemeye çalışacağım).


Güncelleme:

$ 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

Bir dakika sonra Ctrl + C tuşlarına basarak bunu kestim.

tcpdumpYalnızca uygulamanız tarafından oluşturulan trafiği dahil etmek için komutun sonuna uygun bir filtre ifadesi eklemeniz gerekir (ör. port 123)

Program netbpsşudur:

#!/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;
    }
  }
}

Bu sadece bir örnek, zevkinize göre ayarlayın.


Çok teşekkürler, çalışma örneğinizi bekleyeceğim. Amacım çıktıları arabirimler tarafından bit olarak gösteren ancak lo dışında arabirim kullanıldığında başarısız olan $ bwm-ng -o düz -N -d ile yaptığım gibiydi. Diğer yandan IPtraf mükemmel bayt gerçek zamanlı gösterir. Ama belirli bir arayüz veya toplam vb herhangi bir arabirim için RX / TX bitleri ve bayt gerçek zamanlı gibi söyleyebilir hiçbir araç yoktur. Ben eksik :-(
YumYumYum 13:05

@YYYum: cevap güncellendi.
RedGrittyBrick

1
@RedGrittyBrick Mutlak efsane! Harika senaryo! Paylaştığınız için çok teşekkürler. Bu, superuser.com/questions/395226/…
Eamorr

Bu, gömülü yönlendiricilerde meşgul kutusu bashında
Dagelf

Bu ayrıcavnstat -tr
St0rM

14

Aynı klasörden aşağıdaki gibi kullanım:

Arayüz başına paketleyiciyi kontrol etmek için: ./netpps.sh eth0

Arayüz başına hızı kontrol etmek için: ./netspeed.sh eth0

Arabirimdeki Paket Başına Paket Adını dosya adı olarak netpps.sh ölçün

#!/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

Bir arabirimdeki Ağ Bant Genişliğini dosya adı olarak ölçme 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

Daha fazla bilgi için lütfen bu siteye bakın http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html


Bu, yalnızca belirli bağlantı noktası veya uygulama süreç kimliği için uygun bir çözüm değildir, çünkü yalnızca arabirim başına hızı verir.
Mene

6

Kullanımı en kolay ve çıktıyı kontrol etmek ve sürekli günlük kaydı için dosyaya yönlendirmek en kolayı:

ifstat

Muhtemelen çoğu linux dağıtımıyla birlikte gelir ve Mac'te demleme ile kurulabilir


bunun için teşekkürler. diğerleri Mac ile nasıl adil olur? İfstat'ı kurmaya ve nasıl gittiğini görmeye çalışacağım. Biraz daha bilgi kesinlikle yararlı olurdu.
nyxee

3

İhtiyacınız olan bilgileri almak için proc arayüzünü kullanabileceğinizi düşünüyorum. Ben rt_traf.sh adlı bu küçük kabuk komut dosyası oluşturdum:

#!/bin/bash

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

Bu, bir sekme ile ayrılmış giriş ve çıkış sekizliklerini yazdırır. 8 ile çarpılan ekeller size bit / saniye verir ve sonra 10 ^ 6'ya bölünerek size megabit / saniye verir. Tabii bunu çıktıyı istediğiniz gibi biçimlendirmek için kabuk komut dosyasına ekleyebilirsiniz. Bunu, uygulamanızın PID'si ile başlatabilirsiniz, böylece ./rt_traf.sh <PID>başlangıçtan beri uygulamanızın anında okunmasını sağlar. Saniyede gerçek zamanlı istatistikleri izlemek için shell komut dosyasını watch komutuna sarabilirsiniz:

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

-nParametresi, bir saniyenin onda biri kadar bütün yol ayarlanabilir. Zaman içinde bir hesaplama yapmak için böyle bir şey yapardım:

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"

Yine matematik ihtiyacınız olan boyut / zamanlar için ayarlanabilir. En zarif veya küçültülmüş sarılmış çözüm değil, ancak bir çimdik içinde çalışmalıdır.


3
Bu yanlış. / proc / <PID> / net / netstat işlem başına veri içermiyor.
nab

Nab'ın yorumunu genişletmek için: örn. İle /proc/<pid>/net/netstataynı verileri döndürür proc/net/netstat. herhangi bir / tüm işlemler için aynı verileri alırsınız.
EML

2

Ben sadece perl düzgün çalışmadığı eski bir sistemde ne kadar mysql trafik girip çıktığını ölçmek gerekiyordu, bu yüzden tcpdump tarafından görülen toplam trafiği ölçmek aynı hedefe hizmet veren awk birkaç satır yazmaya karşı koyamadım:

# 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

Ve eğer tek gömlekleri daha çok seviyorsanız, işte size bir tane:

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;}'

elseDeyim hatları atlanacak aksi kaldırılmalı ve sumdoğru olmayacaktır. 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

Uygulama başına xtables ve aşağıdakilerin değiştirilmesi kullanılarak bir güvenlik duvarı kuralı ile yapılabilir.

Bu, "uygulama başına" sorusunu değil, yalnızca "arabirim başına" sorusunu yanıtlar.

Aşağıda Ubiquiti ve OpenWRT uyumlu olanlar gibi çoğu gömülü Linux yönlendiricisinde çalışan ve ayrıntılarını / proc / net / dev'den alan bir komut dosyasıdır.

(Ve paketler vb. Değiştirmek kolaydır)

#!/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;

Yukarıdakileri panonuza ve ardından yönlendiricinizdeki bir terminal oturumuna kopyalayın:

$ cat > /tmp/n.sh

sonra: Ctrl + V (veya sağ tık / Yapıştır)

sonra: Ctrl + D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

Ayrıca bir not defterine yapıştırabilir, ardından düzenlemeniz gerekirse yukarıdaki işlemleri tekrarlayabilirsiniz - tüm yerleşik yönlendiricilerin bir editörü yoktur! Her şeyi en üstteki # 'den bitmişe kopyaladığınızdan emin olun; altta.

Yukarıdaki netpps örneği harika BTW'dir - ancak tüm cihazların bağlı / sys dosya sistemi yoktur. Ayrıca / bin / bash değerini / bin / sh olarak veya tam tersini değiştirmeniz gerekebilir.

Kaynak: https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549


Lütfen aynı cevabı birden fazla soruya göndermeyin. Aynı bilgi gerçekten her iki soruyu da cevaplıyorsa, bir soru (genellikle daha yeni olan) diğerinin kopyası olarak kapatılmalıdır. Bunu bir kopya olarak kapatmak için oy vererek veya bunun için yeterli bir itibara sahip değilseniz , bunun bir kopya olduğunu belirtmek için bir bayrak kaldırın . Aksi takdirde cevabınızı bu soruya uyarlayın ve aynı cevabı birden fazla yere yapıştırmayın.
DavidPostill

Diğer yazıma da tam olarak aynı yorumu gönderdiniz ... bu arada özelleştirildi ... Bu tür bir yanıt bana burada neden katkıda bulunmak için zaman ayırdığımı merak ediyor.
Dagelf

Özelleştirildiyse, mesajlar sistem tarafından otomatik olarak alevlendikten sonra oldu. Özel olup olmadıklarını görmek için her kelimeyi okuyacak vaktim yok.
DavidPostill

1
Yaptığınız tek özelleştirme, anserinizin başına iki cümle eklemekti. Geri kalan kısım aynı görünüyor. Ve bu iki cümle asıldıkları gibi orijinal cevapta değildi - bu yüzden otomatik olarak yinelenen bir cevap olarak işaretlendi.
DavidPostill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.