Bagaimana cara mendapatkan statistik jaringan waktu nyata di Linux dengan format KB / MB / Bytes dan untuk port tertentu atau proses aplikasiID?

22

Saya menggunakan IPTraf, Iftop, vnstat, bwm-ng, ifconfig -a. Tidak satu pun dari mereka yang membantu saya menemukan paket waktu-nyata yang dikirim / diterima dari aplikasi saya dalam format KB atau MB. Alasannya adalah saya sedang menulis aplikasi, di mana saya harus sangat yakin kompresi saya sudah benar, tetapi saya tidak dapat menguji untuk bergerak maju.

Apa yang dapat saya gunakan untuk melacak statistik jaringan real-time yang sangat spesifik dan akurat?

masukkan deskripsi gambar di sini

YumYumYum
sumber

Jawaban:

27

Aplikasi Anda mungkin mengirim paket ke nomor port UDP atau TCP tertentu atau ke alamat IP tertentu.

Karena itu Anda dapat menggunakan sesuatu seperti TCPdump untuk menangkap lalu lintas itu.

TCPdump tidak memberi Anda statistik waktu nyata yang Anda inginkan, tetapi Anda dapat memberi makan keluarannya ke sesuatu yang berfungsi (saya akan mencoba memperbarui jawaban ini dengan jawaban nanti).


Memperbarui:

$ 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

Saya menyela setelah satu menit dengan menekan Ctrl + C.

Anda harus menambahkan ekspresi filter yang sesuai di akhir tcpdumpperintah untuk hanya menyertakan lalu lintas yang dihasilkan oleh aplikasi Anda (mis. port 123)

Programnya netbpsadalah ini:

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

Itu hanya contoh, sesuaikan dengan selera.

RedGrittyBrick
sumber
Terima kasih banyak, saya akan menunggu contoh kerja Anda. Tujuan saya adalah seperti yang saya lakukan dengan $ bwm-ng -o plain -N -d yang menampilkan output sebagai sedikit demi sedikit tetapi gagal jika antarmuka digunakan kecuali lo. Di sisi lain IPtraf menunjukkan byte yang sangat baik secara realtime. Tetapi tidak ada alat yang dapat memberitahu saya seperti bit dan byte realtime di RX / TX untuk interface tertentu atau antarmuka seperti Total dll saya hilang itu :-(
YumYumYum
@YumYum: jawaban diperbarui.
RedGrittyBrick
1
@RedGrittyBrick Anda benar-benar legenda! Naskah yang bagus! Terima kasih banyak sudah berbagi. Ini menjawab pertanyaan saya di superuser.com/questions/395226/…
Eamorr
Yang ini harus bekerja di bash busybox pada router tertanam: gist.github.com/dagelf/8a842ed755354b31e79214042a4a4695
Dagelf
Ini juga dicapai denganvnstat -tr
St0rM
14

Penggunaan seperti di bawah ini dari folder yang sama:

Untuk memeriksa pengepak per antarmuka: ./netpps.sh eth0

Untuk memeriksa kecepatan per antarmuka: ./netspeed.sh eth0

Ukur Paket per Detik pada Interface netpps.sh sebagai nama file

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

Ukur Bandwidth Jaringan pada Antarmuka netspeed.sh sebagai nama file

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

Silakan merujuk situs ini untuk info lebih lanjut http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html

Muthukumar Anbalagan
sumber
Ini bukan solusi yang layak untuk "port spesifik atau proses aplikasiID" karena hanya memberi Anda tingkat per antarmuka.
Mene
6

Cara termudah untuk digunakan dan termudah untuk mengontrol output dan mengarahkan ke file untuk pencatatan terus menerus:

ifstat

Mungkin dilengkapi dengan sebagian besar distribusi linux, dan dapat diinstal dengan minuman di mac

samthebest
sumber
Terima kasih untuk itu. bagaimana yang lain adil dengan Mac? Saya akan mencoba menginstal ifstat dan melihat bagaimana hasilnya. Beberapa info lebih lanjut pasti akan berguna.
nyxee
3

Saya pikir Anda dapat menggunakan antarmuka proc untuk mendapatkan informasi yang Anda butuhkan. Saya membuat skrip shell kecil ini bernama rt_traf.sh:

#!/bin/bash

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

Ini akan mencetak oktet masuk dan keluar yang dipisahkan oleh tab. Oktet dikalikan dengan 8 akan memberi Anda bit / detik dan kemudian dibagi 10 ^ 6 akan memberi Anda megabit / detik. Tentu saja Anda dapat menambahkan ini ke skrip shell untuk memformat output sesuai keinginan Anda. Anda dapat menyebutnya dengan PID aplikasi Anda seperti ./rt_traf.sh <PID>yang akan memberi Anda pembacaan instan aplikasi Anda sejak startup. Untuk menonton statistik waktu nyata per detik Anda dapat membungkus skrip shell dalam perintah arloji:

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

The -nparameter dapat disesuaikan semua jalan ke persepuluh detik. Untuk melakukan perhitungan dari waktu ke waktu saya akan melakukan sesuatu seperti ini:

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"

Sekali lagi matematika dapat disesuaikan dengan ukuran / waktu yang Anda butuhkan. Bukan solusi yang paling elegan atau menyusut dibungkus tetapi harus bekerja dalam keadaan darurat.

d34dh0r53
sumber
3
Ini salah. / proc / <PID> / net / netstat tidak mengandung per data proses.
nab
Untuk memperluas komentar nab: /proc/<pid>/net/netstatmengembalikan data yang sama dengan proc/net/netstat, yaitu. Anda mendapatkan data yang sama untuk setiap / semua proses.
EML
2

Saya hanya perlu mengukur seberapa banyak lalu lintas mysql masuk dan keluar pada sistem lama di mana perl tidak berfungsi dengan baik, jadi saya tidak bisa menahan penulisan beberapa baris awk yang melayani tujuan yang sama untuk mengukur total lalu lintas yang dilihat oleh tcpdump:

# 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

Dan jika Anda lebih suka one-liners, ini satu untuk Anda:

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;}'
Aurimas Mikalauskas
sumber
The elsePernyataan harus dihapus jika garis akan dilewati, dan sumtidak akan akurat. 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

Per aplikasi dapat dilakukan dengan aturan firewall menggunakan xtables dan modifikasi di bawah ini.

Ini tidak menjawab pertanyaan "per aplikasi" tetapi hanya pertanyaan "per antarmuka".

Di bawah ini adalah skrip yang berfungsi pada sebagian besar perute Linux tertanam seperti yang kompatibel dengan Ubiquiti dan OpenWRT dan mendapatkan perinciannya dari / proc / net / dev.

(Dan mudah diubah ke paket dll.)

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

Salin hal di atas ke clipboard Anda dan kemudian dalam sesi terminal di router Anda:

$ cat > /tmp/n.sh

lalu: Ctrl + V (atau klik kanan / Tempel)

lalu: Ctrl + D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

Anda juga dapat menempelkannya di notepad, lalu ulangi saja di atas jika Anda perlu mengeditnya - tidak semua perute tertanam memiliki editor! Pastikan Anda menyalin semuanya dari # di atas hingga selesai; di dasar.

Contoh netpps di atas adalah BTW yang bagus - tetapi tidak semua perangkat memiliki sistem file mount / sys. Anda mungkin juga harus mengubah / bin / bash ke / bin / sh atau sebaliknya.

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

Dagelf
sumber
Tolong jangan posting jawaban yang sama untuk beberapa pertanyaan. Jika informasi yang sama benar-benar menjawab kedua pertanyaan, maka satu pertanyaan (biasanya yang baru) harus ditutup sebagai duplikat dari yang lain. Anda dapat menunjukkan ini dengan memilih untuk menutupnya sebagai duplikat atau, jika Anda tidak memiliki reputasi yang cukup untuk itu, angkat bendera untuk menunjukkan bahwa itu adalah duplikat. Kalau tidak, sesuaikan jawaban Anda untuk pertanyaan ini dan jangan hanya menempelkan jawaban yang sama di banyak tempat.
DavidPostill
Anda memposting komentar yang persis sama pada postingan saya yang lain ... yang secara tidak sengaja disesuaikan ... Respons semacam ini hanya membuat saya bertanya-tanya mengapa saya meluangkan waktu untuk berkontribusi di sini.
Dagelf
Jika itu dikustomisasi maka itu terjadi setelah posting autoflagged oleh sistem. Saya tidak punya waktu untuk membaca setiap kata untuk melihat apakah mereka disesuaikan atau tidak.
DavidPostill
1
Satu-satunya penyesuaian yang Anda lakukan adalah menambahkan dua kalimat di awal server Anda. Sisanya tampak identik. Dan kedua kalimat itu tidak ada dalam jawaban asli seperti yang diposting - itulah sebabnya ia secara otomatis ditandai sebagai jawaban rangkap.
DavidPostill