如何获得Linux / UNIX上的当前网络接口吞吐量统计信息?[关闭]


94

诸如MRTG之类的工具提供了特定接口(例如eth0)上当前网络利用率的网络吞吐量/带宽图。如何在Linux / UNIX上的命令行中返回该信息?

优选地,除了标准系统上没有可用的东西外,不需要安装其他东西。


考虑使用iftop详细信息来切换答案。
灰色

遗憾的是,此问题已关闭,因为我想添加bmon一个有用的问题。github.com/tgraf/bmon#screenshots
Daniel F

Answers:


18

您可以解析输出 ifconfig


假设可以使用根访问权限
Lionel

20
(通常)您无需root就可以运行此程序
confiq 2012年

3
一个糟糕的bash单行代码正是这样做的(并且让我渴望BSD netstat(1)的行为):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
Jashank Jeremy

4
解析ifconfig输出是容易出错的,例如,上面的单行代码会导致-bash: export: 溢出:0':在RHEL6上对我来说不是有效的标识符。解析/sys/class/net/$dev/statistics(请参阅@ephemient答案中的perl脚本)直接好得多。
Nickolay '16

1
不应被接受,因为它容易出错且不切实际。有一些实用工具可以更好地完成这项工作,请向下滚动以找出答案。
埃里克(Eric)

156

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

我不知道iftop有多“标准”,但是我能够yum install iftop在Fedora上安装它。


13
iftop也可以轻松地在干净的Ubuntu安装上安装:apt-get install iftop
汤姆·马瑟纳尔

1
并在Arch Linux上使用pacman -S iftop
Benjamin Kaiser

3
叹息唉,我想这意味着我将先学习解析tcpdump再次输出。谢谢您iftopwireshark,让我变得如此懒惰。
Parthian Shot

1
请注意,该问题要求提供每个接口的统计信息,但iftop更为详细,并提供了每个连接的统计信息。
Joachim Breitner,2015年

1
对于没有管理员权限的用户,请注意iftop需要安装(如果没有安装,甚至无法构建它libpcap),并且其主页上说必须在下运行root
Nickolay '16

109

有sar吗?如果您使用RHEL / CentOS,则可能是。

不需要priv,笨拙的二进制文件,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

11
对于kB / s发送和接收:sar -n DEV 1 3 | grep $ IFACE | 尾-n1 | awk'{print $ 5,$ 6}'
Lionel

2
@Lionel-未成年人:您的意思是按该顺序接收和发送。:-)
lacinato

Sar是一个不错的老工具。它是另一个二进制或四个及各种cronjobs来收集,但:)
XTL

1
运行Centos7,无需sar。
Josh Usre '16

google.com/webhp?q=sar%20centos%207 ...快速的Google搜索将显示大量信息。
Mike S

44

我很久以前写了这个愚蠢的脚本,它只依赖于Perl和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 @_ = <>;
    @_;
}

/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
那真是个很棒的小脚本,谢谢大家!
Gui13 2012年

1
我必须将“ 8s”和“ 8.8s”替换为“ 16s”和“ 16.16s”,以使数字适合。
Nickolay '16

如果我理解正确,那么为了使最终结果准确(例如实时统计数据),它必须/proc/net/dev每秒运行一次或以每秒基本速度计算数据吗?
伊利亚·罗斯托夫采夫

31

nload是实时监控带宽的好工具,可使用sudo apt-get install nload轻松安装在Ubuntu或Debian中。

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,也很容易获得:

             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

不要忘记旧版* nix上经典而强大的sar和netstat实用程序!


2
这应该是公认的答案
Eric


25
  • dstat -结合了vmstat,iostat,ifstat,netstat信息等
  • iftop -惊人的网络带宽实用程序可以分析您的eth实际发生的情况
  • netio -通过TCP / IP测量网络的净吞吐量
  • inq-CLI故障排除实用程序,可显示有关存储的信息,通常是Symmetrix。默认情况下,INQ返回设备名称,Symmetrix ID,Symmetrix LUN和容量。
  • send_arp -在指定的网络设备上发送arp广播(默认为eth0),报告新旧IP地址到MAC地址的映射。
  • EtherApe-是仿照etherman的Unix图形网络监视器。具有链接层,IP和TCP模式,它以图形方式显示网络活动。
  • iptraf -IP流量监视器,显示有关通过网络传递的IP流量的信息。

更多详细信息:http : //felipeferreira.net/?p=1194


1
感谢您提供的简单列表,这些大多数都是默认实用程序。特别是,我无需安装任何东西就能从iftop获得非常好的峰值带宽。
Foliovision '16

16

我得到了另一个快速的'肮脏的bash脚本:

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


3
如果要将数字格式化为MB / s,则用以下命令换出“ echo”行:echo $ BWRX $ BWTX | awk'{rx = $ 1/1024/1024; tx = $ 2/1024/1024; 打印“已收到” rx“ MB / s,已发送” tx“ MB / s”}'
MichaelBöckling2014年

1
@BuddyCasino我确定您可以直接在中进行操作let BWRX=($RX-$RXPREV)/1024(尽管我现在没有任何可测试的内容)
Matthieu 2014年

看来您是对的,但由于某种原因,由于某种原因它没有起作用,所以我选择了awk,但我想那只是一个错字。
MichaelBöckling2014年


6

如果只想获取值,可以使用简单的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参数来更改周期,也可以使用tx_bytes代替来测量发送的BPS而不是接收的BPS rx_bytes)。不要忘记更改eth0为要监视的网络设备。

当然,您不仅限于显示平均汇率(如其他答案所述,还有其他工具可以为您显示更好的输出),但是此解决方案很容易编写其他功能。

例如,以下外壳程序脚本(为了提高可读性而分成多行)仅在5分钟的平均传输速度降至10kBPS以下时(大概在其他一些消耗带宽的过程完成时)才执行offlineimap过程:

#!/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的(可以,因为提交者选择了linuxtag),并且需要非古旧的内核。Shell代码本身是/ bin / sh兼容的(因此不仅bash,而且破折号和其他/ bin / sh实现都可以使用),并且/ bin / sh是始终安装的东西。


5

我喜欢,iptraf但是您可能必须安装它,并且它似乎不再处于主动维护状态。


1
有一个iptraf-ng,关于它们之间的区别有什么建议吗?
Felix Yan

1
iptraf-ng是原始项目的分支。它应该具有所有更多的原始功能。
鲁迪·马特拉

2

我发现dstat非常好。虽然必须安装。为您提供比您所需更多的信息。Netstat将为您提供数据包速率,但不会给您带宽。netstat -s



0

我无法解析ifconfig脚本在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"

抱歉,它是如此便宜又讨厌,但它确实有效!


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

如果要以json格式输出(ifconfig -a),则可以使用(python)


这些都没有报告吞吐量统计信息吗?
Dzamo Norton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.