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

Posted

技术标签:

【中文标题】如何获取 Linux/UNIX 上当前的网络接口吞吐量统计信息? [关闭]【英文标题】:How can I get the current network interface throughput statistics on Linux/UNIX? [closed] 【发布时间】:2010-10-10 10:36:57 【问题描述】:

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

最好不要安装系统上可用的标准以外的任何东西。

【问题讨论】:

鉴于 iftop 详细信息,请考虑切换您的答案。 太糟糕了,这个问题已经关闭,因为我想添加 bmon 这很有帮助。 github.com/tgraf/bmon#screenshots 【参考方案1】:

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

我不知道 iftop 有多“标准”,但我可以在 Fedora 上使用 yum install iftop 安装它。

【讨论】:

iftop 也可以轻松安装在干净的 Ubuntu 上:apt-get install iftop 在 Arch Linux 上使用 pacman -S iftop sigh 好吧,我想这意味着我正在推迟学习再次解析tcpdump 输出。谢谢iftopwireshark,让我这么懒。 请注意,该问题要求提供每个接口的统计信息,但iftop 更详细,并提供每个连接的统计信息。 对于那些没有管理员权限的人,请注意iftop 需要安装(如果没有安装libpcap,您甚至无法构建它)并且它的主页说它必须在root 下运行.【参考方案2】:

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

不需要 priv、dorky 二进制文件、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

【讨论】:

对于 kB/s 传输和接收:sar -n DEV 1 3 | grep $IFACE |尾-n1 | awk '打印 $5, $6' @Lionel - 次要的 nit:您的意思是按顺序接收和发送。 :-) Sar 是一个可爱的老工具。不过,它是另一个二进制或四个和各种 cronjobs 来收集:) 运行 Centos7,没有 sar。 google.com/webhp?q=sar%20centos%207 ...快速的 Google 搜索会找到大量信息。【参考方案3】:

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

【讨论】:

这是一个很棒的小脚本,谢谢! 我不得不将“8s”和“8.8s”替换为“16s”和“16.16s”以适应数字。 如果我理解正确,为了使最终结果准确(例如在实时统计中),它必须在/proc/net/dev 上每秒运行一次,或者以其他方式计算每秒基本数据?跨度> 【参考方案4】:

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'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            => ***.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 实用程序!

【讨论】:

这应该是公认的答案【参考方案5】:

你可以解析/proc/net/dev。

【讨论】:

/proc 并非在每个 UNIX 上都存在。 没错,只是假设由于 Linux 标签,OP 只对 Linux 感兴趣。 3.17内核上没有这样的文件 似乎相当于解析/sys/class/net/$dev/statistics在ephemient的脚本中。【参考方案6】: 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 - 是一个仿照 etherman 的 Unix 图形网络监视器。它具有链路层、IP 和 TCP 模式,以图形方式显示网络活动。 iptraf - IP 流量监视器,显示有关通过您的网络传输的 IP 流量的信息。

更多详情: http://felipeferreira.net/?p=1194

【讨论】:

感谢您提供的简单列表,这些大多是默认实用程序。特别是我能够在不安装任何东西的情况下从 iftop 中获得非常好的峰值带宽。【参考方案7】:

为此,我得到了另一个快速的 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/&lt;interface&gt;! :)

【讨论】:

如果您想将数字格式化为 MB/s,请将“echo”行替换为:echo $BWRX $BWTX | awk ' rx = $1 / 1024 / 1024 ;交易 = $2 / 1024 / 1024; print "Received " rx "MB/s, Sent " tx "MB/s" ' @BuddyCasino 我相信你可以直接在let BWRX=($RX-$RXPREV)/1024 中进行操作(虽然我现在没有任何东西可以测试) 看来你是对的,当我尝试这样做时由于某种原因它不起作用,所以我选择了 awk,但我想这只是一个错字。【参考方案8】:

可以解析ifconfig的输出

【讨论】:

这假设 root 访问是可用的 (通常)你不需要是 root 来运行这个...... 一个糟糕的 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 &gt; /tmp/netstat; sleep 5 ;done 解析 ifconfig 输出很容易出错,例如,上面的单行代码在 RHEL6 上对我来说会导致 -bash: export: overruns:0': not a valid identifier`。直接解析/sys/class/net/$dev/statistics(参见@ephemient 答案中的perl 脚本)效果更好。 不应该是公认的答案,因为它容易出错且不实用。有些实用程序可以更好地完成这项工作,向下滚动即可了解。【参考方案9】:

除了 iftop 和 iptraf,还要检查:

bwm-ng(下一代带宽监视器)

和/或

cbm(彩色带宽计)

参考:http://www.powercram.com/2010/01/bandwidth-monitoring-tools-for-ubuntu.html

【讨论】:

bwm-ng Rocks:不需要任何特殊权限即可运行。 我已经使用它多年了,在大多数用例中,我发现它的界面比 iftop 的更清晰。【参考方案10】:

如果你只想获得价值,你可以像这样使用简单的 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 987654324@)。不要忘记将eth0 更改为您要监控的网络设备。

当然,您不仅限于显示平均速率(如其他答案中所述,还有其他工具可以显示更好的输出),但是此解决方案很容易编写脚本来执行其他操作。

例如,以下 shell 脚本(为了便于阅读,拆分为多行)仅在 5 分钟平均传输速度降至 10kBPS 以下时(可能是其他一些消耗带宽的进程完成时)才会执行离线 imap 进程:

#!/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 是真正始终安装的东西。

【讨论】:

【参考方案11】:

我喜欢iptraf,但你可能必须安装它,而且它似乎不再被积极维护了。

【讨论】:

有一个iptraf-ng,有什么不同的建议吗? iptraf-ng 是原始项目的一个分支。它应该具有更多的所有原始功能。【参考方案12】:

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

【讨论】:

【参考方案13】:

您可以使用 iperf 对网络性能进行基准测试(最大可能吞吐量)。 详情见以下链接:

http://en.wikipedia.org/wiki/Iperf

https://iperf.fr/

https://code.google.com/p/iperf/

【讨论】:

【参考方案14】:

我无法让解析 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"

抱歉,它曾经如此便宜和讨厌,但它确实有效!

【讨论】:

【参考方案15】:
ifconfig -a
ip -d link
ls -l /sys/class/net/ (physical and virtual devices)
route -n

如果你想以 json 格式输出 (ifconfig -a) 你可以使用this (python)

【讨论】:

这些都没有报告吞吐量统计数据?

以上是关于如何获取 Linux/UNIX 上当前的网络接口吞吐量统计信息? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Windows IPC 模拟 Linux Unix 域和 Netlink 套接字

吞异常

如何获取页面加载前的状态码

节)

常用linux下网络相关命令

如何在 Linux/Unix/Windows 中发现隐藏的进程和端口