24 votes

Comment obtenir des statistiques réseau en temps réel sous Linux au format KB/MB/Bytes et pour un port ou un processID d'application spécifique ?

J'ai utilisé IPTraf , Iftop , vnstat , bwm-ng , ifconfig -a . Aucun d'entre eux ne m'aide à trouver les paquets en temps réel qui sont envoyés/reçus de mon application au format KB ou MB. La raison en est que je suis en train d'écrire une application où j'ai besoin d'être très sûr que ma compression est correcte, mais je ne peux pas tester pour avancer.

Qu'est-ce que je peux utiliser pour suivre des statistiques très spécifiques et précises sur le réseau en temps réel ?

enter image description here

32voto

RedGrittyBrick Points 78148

Votre application envoie probablement des paquets à un numéro de port UDP ou TCP spécifique ou à une adresse IP spécifique.

Vous pouvez donc utiliser quelque chose comme TCPdump pour capturer ce trafic.

TCPdump ne vous donne pas les statistiques en temps réel que vous souhaitez mais vous pouvez alimenter sa sortie vers quelque chose qui le fait (j'essaierai de mettre à jour cette réponse avec une réponse plus tard).


Mise à jour :

$ 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

J'ai interrompu cela après une minute en appuyant sur Ctrl+C.

Vous devez ajouter une expression de filtrage appropriée à la fin de l'expression de filtrage. tcpdump pour n'inclure que le trafic généré par votre application (ex. port 123 )

Le programme netbps c'est ça :

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

Ce n'est qu'un exemple, ajustez selon vos goûts.

0 votes

Merci beaucoup, je vais attendre votre exemple de travail. Mon but était comme je l'ai fait avec $ bwm-ng -o plain -N -d qui montre la sortie en bits par interfaces mais qui échoue si l'interface est utilisée sauf lo. D'un autre côté, l'IPtraf montre d'excellents octets en temps réel. Mais il n'y a pas d'outils qui peuvent me dire comme les bits et les octets en temps réel dans RX/TX pour une interface spécifique ou n'importe quelle interface comme total, etc. C'est ce qui me manque :-(

0 votes

@YumYum : réponse mise à jour.

1 votes

@RedGrittyBrick Tu es une légende absolue ! Super script ! Merci beaucoup pour ce partage. Cela répond à ma question superuser.com/questions/395226/

15voto

Utilisation comme ci-dessous à partir du même dossier :

Pour vérifier le packer par interface : ./netpps.sh eth0

Pour vérifier la vitesse par interface : ./netspeed.sh eth0

Mesurer les paquets par seconde sur une interface netpps.sh comme nom de fichier

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

Mesurer la bande passante du réseau sur une interface netspeed.sh comme nom de fichier

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

Veuillez consulter ce site pour plus d'informations http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html

0 votes

Ce n'est pas une solution réalisable pour le "port spécifique ou l'application processID" car elle ne vous donne que le taux par interface.

7voto

Marco Points 1827

Le plus simple à utiliser et le plus facile à contrôler la sortie et à rediriger vers un fichier pour une journalisation continue :

ifstat

Il est probablement fourni avec la plupart des distributions linux, et peut être installé avec brew sur mac.

0 votes

Merci pour ça. Comment les autres se débrouillent-ils avec Mac ? Je vais essayer d'installer ifstat et voir comment ça se passe. Un peu plus d'informations auraient certainement été utiles.

0 votes

Il ne semble pas que cet outil permette de discriminer par port

4voto

d34dh0r53 Points 381

Je pense que vous pouvez utiliser l'interface proc pour obtenir les informations dont vous avez besoin. J'ai créé ce petit Shell Shell appelé rt_traf.sh :

#!/bin/bash

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

Ceci imprimera les octets d'entrée et de sortie séparés par une tabulation. Les octets multipliés par 8 donneront des bits/seconde et ensuite divisés par 10^6 donneront des mégabits/seconde. Bien sûr, vous pouvez ajouter ceci au Shell Shell pour formater la sortie comme vous le souhaitez. Vous pouvez l'appeler avec le PID de votre application comme suit ./rt_traf.sh <PID> qui vous donnera une lecture instantanée de votre application depuis le démarrage. Pour regarder les statistiques en temps réel par seconde, vous pouvez envelopper le Shell Shell dans la commande watch :

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

El -n Le paramètre peut être ajusté jusqu'aux dixièmes de seconde. Pour faire un calcul dans le temps, je ferais quelque chose comme ceci :

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"

Là encore, les calculs peuvent être ajustés en fonction de la taille et du temps dont vous avez besoin. Ce n'est pas la solution la plus élégante ou la plus compacte, mais elle devrait fonctionner en cas de besoin.

3 votes

C'est faux. /proc/<PID>/net/netstat ne contient pas de données par processus.

0 votes

Pour développer le commentaire de Nab : /proc/<pid>/net/netstat renvoie les mêmes données que proc/net/netstat c'est-à-dire que vous obtenez les mêmes données pour tous les processus.

3voto

Mahesh Points 20994

J'avais juste besoin de mesurer le trafic mysql entrant et sortant sur un vieux système où perl ne fonctionnait pas correctement, donc je n'ai pas pu résister à l'envie d'écrire quelques lignes d'awk qui servent le même objectif de mesurer le trafic total vu par 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

Et si vous préférez les répliques, en voici une pour vous :

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

1 votes

Le site else doit être supprimée sinon des lignes seront sautées, et sum ne seront pas exactes. tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){pri‌​nt t,sum;sum=0;};sum+=n;pt=t;}

0 votes

@david la commande dans votre commentaire n'a pas de ' de fermeture.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X