如何在Linux/UNIX上获取当前网络接口的吞吐量统计信息?

112

像 MRTG 这样的工具可以为特定接口(例如 eth0)提供当前网络利用率的吞吐量 / 带宽图表。如何在 Linux/UNIX 命令行上返回该信息?

最好不要安装除系统标准软件外的任何其他软件。

Translated text with preserved HTML tags:
```

像 MRTG 这样的工具可以为特定接口(例如 eth0)提供当前网络利用率的吞吐量 / 带宽图表。如何在 Linux/UNIX 命令行上返回该信息?

最好不要安装除系统标准软件外的任何其他软件。

```

考虑根据iftop的详细信息更改您的答案。 - Gray
很遗憾,这个问题已经关闭了,因为我想添加 bmon,它非常有用。https://github.com/tgraf/bmon#screenshots - Daniel F
15个回答

164

iftop 的作用类似于 top(1) 对于 CPU 使用情况的监控,只不过是对于网络使用情况的监控。 -- http://www.ex-parrot.com/~pdw/iftop/

我不知道 iftop 是否算是“标准”的工具,但我能够在 Fedora 上通过命令 yum install iftop 安装它。


哇!哇哇哇!这个工具可以生成顶级主机的实时条形图。您可以在实时中观察所有OpenVPN客户端的争夺。非常酷。谢谢。 - artfulrobot
14
iftop 也可以在干净的 Ubuntu 安装上轻松安装:apt-get install iftop - Tom Marthenal
1
在 Arch Linux 上使用 pacman -S iftop - Benjamin Kaiser
3
呼,好吧,我想这意味着我又在拖延学习解析tcpdump的输出了。感谢iftopwireshark,让我可以这么懒惰。 - Parthian Shot
3
请注意,问题要求每个接口的统计信息,但 iftop 更详细,并提供每个连接的统计信息。 - Joachim Breitner
1
对于没有管理员权限的用户,请注意iftop需要安装(如果没有安装libpcap,甚至无法构建它),并且其主页上指出必须在root下运行。 - Nickolay

114

有使用RHEL/CentOS的话,很可能已经拥有sar。

无需特权、奇怪的二进制文件、繁琐的脚本、libpcap等。胜利!

$ 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 | tail -n1 | awk '{print $5, $6}'。 - Lionel
2
@Lionel - 小问题:你的意思是先接收再发送。 :-) - lacinato
Sar是一个可爱的老工具。它是另一个二进制文件,还有一些用于收集的cronjobs :) - XTL
1
运行Centos7,没有sar。 - Josh Usre
一个快速的谷歌搜索将会找到大量关于sar centos 7的信息。 - Mike S

46

我很久以前写了这个愚蠢的脚本,它只依赖于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 ---------^

6
那是一个很棒的小脚本,谢谢你! - Gui13
1
我必须将“8s”和“8.8s”替换为“16s”和“16.16s”,以使数字适合。 - Nickolay
如果我理解正确,为了使最终结果准确(例如在实时统计中),它必须每秒运行一次 /proc/net/dev 或以其他方式按每秒基础计算数据? - Ilia

38

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,也很容易用apt-get安装:

             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

32

3
并非所有的UNIX系统都有/proc目录。 - Mehrdad Afshari
33
明白了,由于有“Linux”标签,我只是假设楼主只关心Linux。 - codelogic
3.17内核上没有这个文件。 - Tomas Tomecek
5
似乎等价于ephemient脚本中解析/sys/class/net/$dev/statistics的过程。 - Nickolay

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

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


1
感谢提供简单的清单,这些大都是默认工具。特别是我能够在没有安装任何东西的情况下获得非常好的iftop峰值带宽。 - Foliovision

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 ; print "接收速度 " rx "MB/s, 发送速度 " tx "MB/s" }' - Michael Böckling
1
@BuddyCasino 我相信你可以直接在 let BWRX=($RX-$RXPREV)/1024 中完成它(尽管我现在没有任何测试工具)。 - Matthieu
看起来你是对的,当我尝试那种方式时它没有工作,所以我选择了awk,但我猜那只是一个打字错误。 - Michael Böckling

16
您可以解析ifconfig的输出结果。

假设已经有root访问权限。 - Lionel
22
通常情况下,你不需要使用root权限来运行这个…… - confiq
3
一个糟糕的bash one-liner做了完全一样的事情(并让我想念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输出是容易出错的,例如上面这一行在我使用RHEL6时会导致-bash: export: overruns:0': not a valid identifier错误。直接解析/sys/class/net/$dev/statistics`(参见@ephemient答案中的perl脚本)则更为可靠。 - Nickolay
2
不应将其作为可接受的答案,因为它容易出错且不实用。有更好的工具可以完成这项工作,请向下滚动查看。 - Eric
回答不是很有用。请提供更详细的信息(如何解析?哪些信息是相关的?) - Koby

15

2
bwm-ng非常棒:它不需要任何特殊权限即可运行。 - Rudy Matela
我已经使用它多年了,在大多数情况下,我发现它的界面比iftop等工具更清晰。 - Dr. Jan-Philip Gehrcke

8
如果您只想获取值,可以使用简单的shell一行代码,就像这样:
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”而不是“rx_bytes”来测量传输BPS)。不要忘记将“eth0”更改为您要监视的网络设备。
当然,您不仅限于显示平均速率(正如其他答案中提到的,有其他工具可以显示更好的输出),但此解决方案易于编写脚本以执行其他操作。
例如,以下Shell脚本(为了可读性而拆分为多行)仅在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特有的(由于提交者选择了linux标签,这是可以接受的),需要使用现代化的内核。Shell代码本身与/bin/sh兼容(因此不仅bash,而且dash和其他/bin/sh实现也可以工作),而/bin/sh则是一种始终安装的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接