Como posso obter as estatísticas atuais de taxa de transferência da interface de rede no Linux / UNIX? [fechadas]


94

Ferramentas como o MRTG fornecem gráficos de taxa de transferência / largura de banda da rede para a utilização atual da rede em interfaces específicas, como eth0. Como posso retornar essas informações na linha de comando no Linux / UNIX?

De preferência, isso seria feito sem instalar nada além do que está disponível no sistema como padrão.


Considere mudar sua resposta de acordo com os detalhes do iftop.
— Cinza

É uma pena que esta questão tenha sido encerrada, porque gostaria de acrescentar bmonque é útil. github.com/tgraf/bmon#screenshots
— Daniel F

Respostas:


18

Você pode analisar a saída de ifconfig


Isso pressupõe que o acesso root está disponível
— Lionel

20
(normalmente) Você não precisa ser root para executar isto ...
— confiq

3
Um bash one-liner ruim que faz exatamente isso (e me faz while true; do export `ifconfig p1p1 | grep packets | awk '{print $5, $3}' | xargs echo | sed -E -e "s/([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/rx=\1 rxp=\2 tx=\3 txp=\4/"` ; echo $rx $rxp $tx $txp `cat /tmp/netstat` | awk '{print $1-$5, $2-$6, $3-$7, $4-$8}';echo $rx $rxp $tx $txp > /tmp/netstat; sleep 5 ;done
— ansiar pelo

4
A análise da saída do ifconfig está sujeita a erros, por exemplo, o one-liner acima resulta em -bash: export: overruns: 0 ': não é um identificador válido` para mim no RHEL6. A análise /sys/class/net/$dev/statistics(veja o script perl na resposta @ephemient) funciona muito melhor diretamente.
— Nickolay

1
não deve ser a resposta aceita, pois é propensa a erros e não é prática. existem utilitários que fazem o trabalho muito melhor. Role para baixo para descobrir.
— Eric

156

iftop does for network usage what top(1) does for CPU usage- http://www.ex-parrot.com/~pdw/iftop/

Não sei o quão "padrão" o iftop é, mas consegui instalá-lo yum install iftopno Fedora.


13
iftoppode ser instalado em um Ubuntu instalação limpa facilmente, bem como: apt-get install iftop.
— Tom Marthenal,

1
e no Arch Linux compacman -S iftop
— Benjamin Kaiser

3
suspiro Bem, acho que isso significa que estou adiando o aprendizado de analisar a tcpdumpsaída novamente. Obrigado iftope wireshark, por me permitir ser tão preguiçoso.
— Parthian Shot

1
Observe que a pergunta feita para estatísticas por interface, mas iftopé mais detalhada e fornece estatísticas por conexão.
— Joachim Breitner

1
Para aqueles sem direitos de administrador, observe que iftoprequer instalação (você não será capaz de construí-lo sem libpcapinstalado) e sua página inicial diz que ele deve ser executado sob root.
— Nickolay

109

Sar obtido? Provavelmente sim se você estiver usando RHEL / CentOS.

Não há necessidade de binários priv, dorky, scripts hacky, libpcap, etc. Win.

$ sar -n DEV 1 3
Linux 2.6.18-194.el5 (localhost.localdomain)    10/27/2010

02:40:56 PM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s
02:40:57 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:40:57 PM      eth0  10700.00   1705.05 15860765.66 124250.51      0.00      0.00      0.00
02:40:57 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

02:40:57 PM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s
02:40:58 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:40:58 PM      eth0   8051.00   1438.00 11849206.00 105356.00      0.00      0.00      0.00
02:40:58 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

02:40:58 PM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s
02:40:59 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:40:59 PM      eth0   6093.00   1135.00 8970988.00  82942.00      0.00      0.00      0.00
02:40:59 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:        IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:         eth0   8273.24   1425.08 12214833.44 104115.72      0.00      0.00      0.00
Average:         eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00

11
Para kB / s transmitir e receber: sar -n DEV 1 3 | grep $ IFACE | tail -n1 | awk '{print $ 5, $ 6}'
— Lionel

2
@Lionel - menor nit: você quis dizer Receber e Transmitir, nessa ordem. :-)
— lacinato

Sar é uma ferramenta adorável e antiga. É outro binário ou quatro cronjobs variados para coletar, embora :)
— XTL

1
Executando Centos7, sem sar.
— Josh Usre

google.com/webhp?q=sar%20centos%207 ... uma rápida pesquisa no Google irá revelar muitas informações.
— Mike S

44

Escrevi este script idiota há muito tempo, ele não depende de nada além de Perl e Linux≥2,6:

#!/usr/bin/perl

use strict;
use warnings;

use POSIX qw(strftime);
use Time::HiRes qw(gettimeofday usleep);

my $dev = @ARGV ? shift : 'eth0';
my $dir = "/sys/class/net/$dev/statistics";
my %stats = do {
    opendir +(my $dh), $dir;
    local @_ = readdir $dh;
    closedir $dh;
    map +($_, []), grep !/^\.\.?$/, @_;
};

if (-t STDOUT) {
    while (1) {
        print "\033[H\033[J", run();
        my ($time, $us) = gettimeofday();
        my ($sec, $min, $hour) = localtime $time;
        {
            local $| = 1;
            printf '%-31.31s: %02d:%02d:%02d.%06d%8s%8s%8s%8s',
            $dev, $hour, $min, $sec, $us, qw(1s 5s 15s 60s)
        }
        usleep($us ? 1000000 - $us : 1000000);
    }
}
else {print run()}

sub run {
    map {
        chomp (my ($stat) = slurp("$dir/$_"));
        my $line = sprintf '%-31.31s:%16.16s', $_, $stat;
        $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[0]) / 1)
            if @{$stats{$_}} > 0;
        $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[4]) / 5)
            if @{$stats{$_}} > 4;
        $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[14]) / 15)
            if @{$stats{$_}} > 14;
        $line .= sprintf '%8.8s', int (($stat - $stats{$_}->[59]) / 60)
            if @{$stats{$_}} > 59;
        unshift @{$stats{$_}}, $stat;
        pop @{$stats{$_}} if @{$stats{$_}} > 60;
        "$line\n";
    } sort keys %stats;
}

sub slurp {
    local @ARGV = @_;
    local @_ = <>;
    @_;
}

Ele apenas lê a /sys/class/net/$dev/statisticscada segundo e imprime os números atuais e a taxa média de mudança:

$ ./net_stats.pl eth0
rx_bytes                       :  74457040115259 4369093 4797875 4206554 364088
rx_packets                     :     91215713193   23120   23502   23234  17616
...
tx_bytes                       :  90798990376725 8117924 7047762 7472650 319330
tx_packets                     :     93139479736   23401   22953   23216  23171
...
eth0                           : 15:22:09.002216      1s      5s     15s     60s

                                ^ current reading  ^-------- averages ---------^

5
Esse é um pequeno roteiro incrível, obrigado cara!
— Gui13,

1
Tive de substituir "8s" e "8,8s" por "16s" e "16,16s" para que os números se ajustassem.
— Nickolay

Se bem entendi, para tornar o resultado final preciso (por exemplo, em estatísticas ao vivo), ele tem que ser executado a cada segundo /proc/net/devou calcular dados por / segundo básicos de alguma outra forma?
— Ilia Rostovtsev

31

nload é uma ótima ferramenta para monitorar largura de banda em tempo real e facilmente instalado no Ubuntu ou Debian com sudo apt-get install nload.

Device eth0 [10.10.10.5] (1/2):
=====================================================================================
Incoming:


                               .         ...|    
                               #         ####|   
                           .. |#|  ...   #####.         ..          Curr: 2.07 MBit/s
                          ###.###  #### #######|.     . ##      |   Avg: 1.41 MBit/s
                         ########|#########################.   ###  Min: 1.12 kBit/s
             ........    ###################################  .###  Max: 4.49 MBit/s
           .##########. |###################################|#####  Ttl: 1.94 GByte
Outgoing:
            ##########  ###########    ###########################
            ##########  ###########    ###########################
            ##########. ###########   .###########################
            ########### ###########  #############################
            ########### ###########..#############################
           ############ ##########################################
           ############ ##########################################
           ############ ##########################################  Curr: 63.88 MBit/s
           ############ ##########################################  Avg: 32.04 MBit/s
           ############ ##########################################  Min: 0.00 Bit/s
           ############ ##########################################  Max: 93.23 MBit/s
         ############## ##########################################  Ttl: 2.49 GByte

Outra ferramenta excelente é o iftop , também facilmente adaptável:

             191Mb      381Mb                 572Mb       763Mb             954Mb     
└────────────┴──────────┴─────────────────────┴───────────┴──────────────────────
box4.local            => box-2.local                      91.0Mb  27.0Mb  15.1Mb
                      <=                                  1.59Mb   761kb   452kb
box4.local            => box.local                         560b   26.8kb  27.7kb
                      <=                                   880b   31.3kb  32.1kb
box4.local            => userify.com                         0b   11.4kb  8.01kb
                      <=                                  1.17kb  2.39kb  1.75kb
box4.local            => b.resolvers.Level3.net              0b     58b    168b
                      <=                                     0b     83b    288b
box4.local            => stackoverflow.com                   0b     42b     21b
                      <=                                     0b     42b     21b
box4.local            => 224.0.0.251                         0b      0b    179b
                      <=                                     0b      0b      0b
224.0.0.251           => box-2.local                         0b      0b      0b
                      <=                                     0b      0b     36b
224.0.0.251           => box.local                           0b      0b      0b
                      <=                                     0b      0b     35b


─────────────────────────────────────────────────────────────────────────────────
TX:           cum:   37.9MB   peak:   91.0Mb     rates:   91.0Mb  27.1Mb  15.2Mb
RX:                  1.19MB           1.89Mb              1.59Mb   795kb   486kb
TOTAL:               39.1MB           92.6Mb              92.6Mb  27.9Mb  15.6Mb

Não se esqueça dos utilitários sar e netstat clássicos e poderosos nos * nix mais antigos!


2
esta deve ser a resposta aceita
— Eric


25
  • dstat - Combina informações de vmstat, iostat, ifstat, netstat e muito mais
  • iftop - Incrível utilitário de largura de banda de rede para analisar o que realmente está acontecendo no seu computador
  • netio - Mede a taxa de transferência de rede de uma rede via TCP / IP
  • inq- Utilitário de solução de problemas CLI que exibe informações sobre armazenamento, normalmente Symmetrix. Por padrão, INQ retorna o nome do dispositivo, Symmetrix ID, Symmetrix LUN e capacidade.
  • send_arp - Envia uma transmissão ARP no dispositivo de rede especificado (o padrão é eth0), relatando um mapeamento de endereço IP antigo e novo para um endereço MAC.
  • EtherApe- é um monitor gráfico de rede para Unix modelado após etherman. Apresentando camada de link, modos IP e TCP, ele exibe a atividade de rede graficamente.
  • iptraf - Um monitor de tráfego IP que mostra informações sobre o tráfego IP que passa pela rede.

Mais detalhes: http://felipeferreira.net/?p=1194


1
Obrigado pela lista simples e que estes são utilitários principalmente padrão. Em particular, consegui obter um pico de largura de banda muito bom do iftop sem instalar nada.
— Foliovision

16

Eu tenho outro script bash rápido para isso:

#!/bin/bash
IF=$1
if [ -z "$IF" ]; then
        IF=`ls -1 /sys/class/net/ | head -1`
fi
RXPREV=-1
TXPREV=-1
echo "Listening $IF..."
while [ 1 == 1 ] ; do
        RX=`cat /sys/class/net/${IF}/statistics/rx_bytes`
        TX=`cat /sys/class/net/${IF}/statistics/tx_bytes`
        if [ $RXPREV -ne -1 ] ; then
                let BWRX=$RX-$RXPREV
                let BWTX=$TX-$TXPREV
                echo "Received: $BWRX B/s    Sent: $BWTX B/s"
        fi
        RXPREV=$RX
        TXPREV=$TX
        sleep 1
done

É considerando que sleep 1na verdade vai durar exatamente um segundo, o que não é verdade, mas bom o suficiente para uma avaliação aproximada da largura de banda.

Agradecimentos a @ephemient pelo /sys/class/net/<interface>! :)


3
Se você deseja formatar seus números em MB / s, troque a linha "echo" por esta: echo $ BWRX $ BWTX | awk '{rx = $ 1/1024/1024; tx = $ 2/1024/1024; imprimir "Recebido" rx "MB / s, Enviado" tx "MB / s"} '
— Michael Böckling

1
@BuddyCasino Tenho certeza de que você poderia fazer isso diretamente no let BWRX=($RX-$RXPREV)/1024(embora eu não tenha nada para testar agora)
— Matthieu

Parece que você está certo, por algum motivo não funcionou quando tentei fazer dessa forma, então me conformei com o awk, mas acho que foi apenas um erro de digitação.
— Michael Böckling


6

Se você deseja apenas obter o valor, pode usar um shell simples como este:

S=10; F=/sys/class/net/eth0/statistics/rx_bytes; X=`cat $F`; sleep $S; Y=`cat $F`; BPS="$(((Y-X)/S))"; echo $BPS

Ele mostrará a média de "bytes recebidos por segundo" por um período de 10 segundos (você pode alterar o período alterando o S=10parâmetro e pode medir o BPS transmitido em vez do BPS recebido usando em tx_bytesvez de rx_bytes). Não se esqueça de mudar eth0para o dispositivo de rede que deseja monitorar.

Claro, você não está limitado a exibir a taxa média (como mencionado em outras respostas, existem outras ferramentas que irão mostrar uma saída muito melhor), mas esta solução é facilmente programável para fazer outras coisas.

Por exemplo, o seguinte script de shell (dividido em várias linhas para facilitar a leitura) executará o processo offline do mapa apenas quando a velocidade de transmissão média de 5 minutos cair abaixo de 10kBPS (presumivelmente, quando algum outro processo que consome largura de banda terminar):

#!/bin/sh
S=300; F=/sys/class/net/eth0/statistics/tx_bytes
BPS=999999
while [ $BPS -gt 10000 ]
do
  X=`cat $F`; sleep $S; Y=`cat $F`; BPS="$(((Y-X)/S))";
  echo BPS is currently $BPS
done
offlineimap

Observe que /sys/class/...é específico do Linux (o que está ok, pois o remetente escolheu a linuxtag) e precisa de um kernel não arcaico. O código do shell em si é compatível com / bin / sh (portanto, não apenas bash, mas dash e outras implementações de / bin / sh funcionarão) e / bin / sh é algo que realmente está sempre instalado.


5

Eu gosto, iptrafmas você provavelmente terá que instalá-lo e ele parece não ser mais mantido ativamente.


1
Existe um iptraf-ng, alguma sugestão sobre as diferenças entre eles?
— Felix Yan

1
iptraf-ng é um fork do projeto original. Deve ter todas as características originais com mais.
— Rudy Matela

2

Acho que dstat é muito bom. No entanto, deve ser instalado. Fornece muito mais informações do que você precisa. O Netstat fornecerá taxas de pacotes, mas não a largura de banda também. netstat -s



0

Não consegui fazer com que o script de análise ifconfig funcionasse para mim em um AMI, então coloquei isso para funcionar medindo o tráfego recebido em uma média de 10 segundos

date && rxstart=`ifconfig eth0 | grep bytes | awk '{print $2}' | cut -d : -f 2` && sleep 10 && rxend=`ifconfig eth0 | grep bytes | awk '{print $2}' | cut -d : -f 2` && difference=`expr $rxend - $rxstart` && echo "Received `expr $difference / 10` bytes per sec"

Desculpe, é sempre tão barato e desagradável, mas funcionou!


0
ifconfig -a
ip -d link
ls -l /sys/class/net/ (physical and virtual devices)
route -n

Se você quiser a saída de (ifconfig -a) no formato json, você pode usar isto (python)


Nenhuma dessas estatísticas de rendimento do relatório?
— Dzamo Norton de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.