Как получить текущую статистику пропускной способности сетевого интерфейса в Linux/UNIX?

Инструменты, такие как MRTG, предоставляют графики пропускной способности/пропускной способности сети для текущего использования сети на определенных интерфейсах, таких как eth0. Как я могу вернуть эту информацию в командной строке в Linux/UNIX?

Предпочтительно, это было бы без установки чего-либо, кроме того, что доступно в системе в качестве стандартного.

Ответ 1

Вы можете анализировать вывод ifconfig

Ответ 2

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

Я не знаю, как "стандартный" iftop, но я смог установить его с помощью yum install iftop в Fedora.

Ответ 3

Получил сэр? Вероятно, да, если вы используете RHEL/CentOS.

Нет необходимости в приватных двоичных файлах, hacky-скриптах, libpcap и т.д. 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

Ответ 4

Я написал этот немой script давным-давно, это зависит только от Perl и Linux & ge; 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 @_ = <>;
    @_;
}

Он просто читает от /sys/class/net/$dev/statistics каждую секунду и печатает текущие цифры и среднюю скорость изменения:

$ ./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

Вы можете разобрать /proc/net/dev.

Ответ 6

  • dstat - объединяет vmstat, iostat, ifstat, информацию netstat и многое другое
  • iftop - Удивительная утилита пропускной способности сети для анализа того, что на самом деле происходит на вашем уровне
  • netio - измеряет пропускную способность сети через TCP/IP
  • inq - утилита для устранения неполадок CLI, отображающая информацию о хранилище, обычно Symmetrix. По умолчанию INQ возвращает имя устройства, Symmetrix ID, Symmetrix LUN и емкость.
  • send_arp - Отправляет трансляцию arp на указанное сетевое устройство (по умолчанию eth0), сообщая о старом и новом сопоставлении IP-адресов на MAC-адрес.
  • EtherApe - это графический сетевой монитор для Unix, смоделированный после etherman. Благодаря режиму уровня канала, IP и TCP он графически отображает сетевую активность.
  • iptraf - монитор трафика IP, который показывает информацию о трафике IP, проходящем через вашу сеть.

Подробнее: http://felipeferreira.net/?p=1194

Ответ 7

nload - отличный инструмент для мониторинга пропускной способности в реальном времени и легко устанавливается в Ubuntu или Debian с помощью 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

Еще один отличный инструмент - iftop, также легко apt-get'able:

             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

Не забывайте о классических и мощных утилитах sar и netstat на старых * nix!

Ответ 9

Я получил еще один quick'n'dirty bash script для этого:

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

Учитывая, что sleep 1 будет длиться ровно одну секунду, что неверно, но достаточно хорошо для оценки приблизительной полосы пропускания.

Благодаря @ephemient для /sys/class/net/<interface>!:)

Ответ 10

Мне нравится iptraf, но вам, вероятно, придется его установить и, похоже, он больше не поддерживается.

Ответ 11

Если вы хотите просто получить значение, вы можете использовать простой shell oneliner следующим образом:

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

Он покажет вам средние "полученные байты в секунду" в течение 10 секунд (вы можете изменить период, изменив параметр S=10, и вы можете измерять переданные BPS вместо полученных BPS, используя tx_bytes вместо rx_bytes). Не забудьте изменить eth0 на сетевое устройство, которое вы хотите контролировать.

Конечно, вы не ограничены отображением средней скорости (как упоминалось в других ответах, есть и другие инструменты, которые покажут вам гораздо более приятный результат), но это решение легко может быть написано сценарием для других целей.

Например, следующая оболочка script (разделенная на несколько строк для удобочитаемости) будет выполнять процесс offlineimap только в том случае, если средняя скорость передачи в 5 минут падает ниже 10 кБП (предположительно, когда заканчивается какой-то другой процесс с полосой пропускания):

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

Обратите внимание, что /sys/class/... является специфичным для Linux (это нормально, поскольку отправитель выбрал тег linux) и нуждается в неархаичном ядре. Код оболочки сам по себе совместим с /bin/sh (поэтому не только bash, но и тире и другие /bin/sh реализаций), а /bin/sh - это то, что действительно установлено всегда.

Ответ 12

Я считаю, что это неплохо. Должен быть установлен, хотя. Предоставляет вам больше информации, чем вам нужно. Netstat предоставит вам пакетные тарифы, но не будет также с полосой пропускания. netstat -s

Ответ 14

Я не смог получить синтаксический анализ ifconfig script для работы на AMI, чтобы заставить его работать, измеряя полученный трафик, усредненный за 10 секунд

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"

Извините, это так дешево и противно, но это сработало!

Ответ 15

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

Если вы хотите вывод (ifconfig -a) в формате json, вы можете использовать this (python)