Làm cách nào để lấy thống kê thông lượng giao diện mạng hiện tại trên Linux / UNIX? [đóng cửa]


94

Các công cụ như MRTG cung cấp đồ thị thông lượng / băng thông mạng cho việc sử dụng mạng hiện tại trên các giao diện cụ thể, chẳng hạn như eth0. Làm cách nào để trả lại thông tin đó tại dòng lệnh trên Linux / UNIX?

Tốt hơn là điều này sẽ không cần cài đặt bất kỳ thứ gì khác ngoài những gì có sẵn trên hệ thống theo tiêu chuẩn.


Cân nhắc chuyển đổi câu trả lời của bạn với các chi tiết iftop.
Grey

Thật tệ là câu hỏi này đã bị đóng, bởi vì tôi muốn thêm câu bmonnào hữu ích. github.com/tgraf/bmon#screenshots
Daniel F

Câu trả lời:


18

Bạn có thể phân tích cú pháp đầu ra của ifconfig


Điều này giả định có quyền truy cập root
Lionel

20
(thường) Bạn không cần phải được root để chạy này ...
confiq

3
Một bash xấu một liner thực hiện chính xác này (và làm cho tôi dài cho BSD netstat (1) hành vi):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
Phân tích cú pháp đầu ra ifconfig dễ xảy ra lỗi, ví dụ: một dòng chữ ở trên dẫn đến ghi -bash: export: đè: 0 ': không phải là số nhận dạng hợp lệ` đối với tôi trên RHEL6. Phân tích cú pháp /sys/class/net/$dev/statistics(xem tập lệnh perl trong câu trả lời @ephemient) trực tiếp hoạt động tốt hơn nhiều.
Nickolay

1
không nên là câu trả lời được chấp nhận vì nó dễ xảy ra lỗi và không thực tế. có những tiện ích làm công việc tốt hơn nhiều, Cuộn xuống để tìm hiểu.
Eric

156

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

Tôi không biết iftop "tiêu chuẩn" như thế nào, nhưng tôi đã có thể cài đặt nó yum install iftoptrên Fedora.


13
iftopcó thể được cài đặt trên một Ubuntu sạch sẽ cài đặt một cách dễ dàng cũng như: apt-get install iftop.
Tom Marthenal

1
và trên Arch Linux vớipacman -S iftop
Benjamin Kaiser

3
thở dài Chà, tôi đoán điều này có nghĩa là tôi đang ngừng học phân tích cú pháp tcpdumpđầu ra một lần nữa. Cảm ơn bạn iftopwiresharkvì đã cho phép tôi lười biếng như thế này.
Parthian Shot

1
Lưu ý rằng câu hỏi yêu cầu thống kê trên mỗi giao diện, nhưng iftopchi tiết hơn và cung cấp thống kê cho mỗi kết nối.
Joachim Breitner,

1
Đối với những người không có quyền quản trị, hãy lưu ý rằng iftopyêu cầu cài đặt (bạn thậm chí sẽ không thể xây dựng nó mà không libpcapcài đặt) và trang chủ của nó cho biết nó phải được chạy dưới root.
Nickolay,

109

Có sar? Có thể có nếu bạn đang sử dụng RHEL / CentOS.

Không cần priv, mã nhị phân dorky, tập lệnh hacky, libpcap, v.v. Giành chiến thắng.

$ 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
Đối với kB / s Truyền và Nhận: sar -n DEV 1 3 | grep $ IFACE | đuôi -n1 | awk '{print $ 5, $ 6}'
Lionel

2
@Lionel - nit nhỏ: ý bạn là Nhận và Truyền, theo thứ tự đó. :-)
lacinato

Sar là một công cụ cũ đáng yêu. Nó nó khác nhị phân hoặc bốn và các loại cronjobs cho việc thu thập, mặc dù :)
XTL

1
Chạy Centos7, không có sar.
Josh Usre

google.com/webhp?q=sar%20centos%207 ... tìm kiếm nhanh trên Google sẽ cho ra rất nhiều thông tin.
Mike S

44

Tôi đã viết tập lệnh ngu ngốc này cách đây rất lâu, nó không phụ thuộc vào gì ngoài Perl và 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 @_ = <>;
    @_;
}

Nó chỉ đọc từ /sys/class/net/$dev/statisticsmỗi giây và in ra các con số hiện tại và tốc độ thay đổi trung bình:

$ ./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
Đó là một kịch bản nhỏ tuyệt vời, cảm ơn anh bạn!
Gui 13

1
Tôi đã phải thay thế "8s" và "8,8s" bằng "16s" và "16,16s" để các số phù hợp.
Nickolay

Nếu tôi hiểu đúng, để làm cho kết quả cuối cùng chính xác (ví dụ: trong số liệu thống kê trực tiếp), nó phải chạy mỗi giây /proc/net/devhoặc tính toán dữ liệu trên mỗi giây cơ bản bằng cách nào khác?
Ilia Rostovtsev

31

nload là một công cụ tuyệt vời để theo dõi băng thông trong thời gian thực và dễ dàng cài đặt trong Ubuntu hoặc Debian với 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

Một công cụ tuyệt vời khác là iftop , cũng dễ dàng 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

Đừng quên về các tiện ích sar và netstat cổ điển và mạnh mẽ trên * nix cũ hơn!


2
đây phải là câu trả lời được chấp nhận
Eric

28

Bạn có thể phân tích cú pháp / proc / net / dev .


3
/ proc không tồn tại trên mọi UNIX.
Mehrdad Afshari

31
Đúng, chỉ được giả định là do thẻ Linux, rằng OP chỉ quan tâm đến Linux.
codelogic

không có tệp nào như vậy trên hạt nhân 3.17
Tomas Tomecek

4
Có vẻ tương đương với phân tích cú pháp /sys/class/net/$dev/statisticsnhư trong kịch bản của ephemient.
Nickolay

25
  • dstat - Kết hợp thông tin vmstat, iostat, ifstat, netstat và hơn thế nữa
  • iftop - Tiện ích băng thông mạng tuyệt vời để phân tích những gì đang thực sự xảy ra trên eth của bạn
  • netio - Đo thông lượng ròng của mạng qua TCP / IP
  • inq- Tiện ích khắc phục sự cố CLI hiển thị thông tin về bộ nhớ, điển hình là Symmetrix. Theo mặc định, INQ trả về tên thiết bị, ID Symmetrix, Symmetrix LUN và dung lượng.
  • send_arp - Gửi một quảng bá arp trên thiết bị mạng được chỉ định (mặc định là eth0), báo cáo ánh xạ địa chỉ IP cũ và mới tới địa chỉ MAC.
  • EtherApe- là một màn hình mạng đồ họa cho Unix được mô hình hóa theo etherman. Với các chế độ lớp liên kết, IP và TCP, nó hiển thị hoạt động mạng bằng đồ thị.
  • iptraf - Một bộ giám sát lưu lượng IP hiển thị thông tin về lưu lượng IP đi qua mạng của bạn.

Thêm chi tiết: http://felipeferreira.net/?p=1194


1
Cảm ơn vì danh sách đơn giản và đây hầu hết là các tiện ích mặc định. Đặc biệt, tôi đã có thể nhận được băng thông cực đại rất tốt từ iftop mà không cần cài đặt bất cứ thứ gì.
Foliovision

16

Tôi có một tập lệnh bash nhanh chóng khác cho điều đó:

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

Nó đang xem xét rằng nó sleep 1sẽ thực sự kéo dài đúng một giây, điều này không đúng, nhưng đủ tốt để đánh giá băng thông sơ bộ.

Cảm ơn @ephemient vì /sys/class/net/<interface>! :)


3
Nếu bạn muốn định dạng các số của mình dưới dạng MB / s, hãy hoán đổi dòng "echo" bằng dòng này: echo $ BWRX $ BWTX | awk '{rx = $ 1/1024/1024; tx = $ 2/1024/1024; print "Đã nhận" rx "MB / s, Đã gửi" tx "MB / s"} '
Michael Böckling

1
@BuddyCasino tôi chắc chắn rằng bạn có thể làm điều đó trực tiếp trong let BWRX=($RX-$RXPREV)/1024(mặc dù tôi không có bất cứ điều gì để kiểm tra nó bây giờ)
Matthieu

Có vẻ như bạn nói đúng, nó không hoạt động vì một số lý do khi tôi cố gắng làm theo cách đó, vì vậy tôi đã giải quyết cho awk, nhưng tôi đoán đó chỉ là lỗi đánh máy.
Michael Böckling

15

Ngoài iftop và iptraf, cũng hãy kiểm tra:

  • bwm-ng (Màn hình băng thông thế hệ tiếp theo)

và / hoặc

  • cbm (Máy đo băng thông màu)

tham khảo: http://www.powercram.com/2010/01/bandwidth-monitoring-tools-for-ubuntu.html


2
bwm-ng stone: nó không cần bất kỳ sự cho phép đặc biệt nào để chạy.
Rudy Matela

Tôi đã sử dụng nó trong nhiều năm và trong hầu hết các trường hợp sử dụng, tôi thấy giao diện của nó rõ ràng hơn nhiều so với ví dụ của iftop.
Tiến sĩ Jan-Philip Gehrcke

6

Nếu bạn chỉ muốn nhận giá trị, bạn có thể sử dụng shell oneliner đơn giản như sau:

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

Nó sẽ hiển thị cho bạn "số byte nhận được mỗi giây" trung bình trong khoảng thời gian 10 giây (bạn có thể thay đổi chu kỳ bằng cách thay đổi S=10tham số và bạn có thể đo BPS đã truyền thay vì BPS đã nhận bằng cách sử dụng tx_bytesthay vì rx_bytes). Đừng quên thay đổi eth0thiết bị mạng mà bạn muốn theo dõi.

Tất nhiên, bạn không bị giới hạn trong việc hiển thị tỷ lệ trung bình (như đã đề cập trong các câu trả lời khác, có những công cụ khác sẽ hiển thị cho bạn kết quả đẹp hơn nhiều), nhưng giải pháp này có thể dễ dàng viết kịch bản để làm những việc khác.

Ví dụ: tập lệnh shell sau (chia thành nhiều dòng để dễ đọc) sẽ chỉ thực thi quy trình bản đồ ngoại tuyến khi tốc độ truyền trung bình trong 5 phút giảm xuống dưới 10kBPS (có lẽ là khi một số quá trình tiêu tốn băng thông khác kết thúc):

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

Lưu ý rằng đó /sys/class/...là Linux cụ thể (được chấp nhận như người gửi đã chọn linuxthẻ) và cần nhân không cổ điển. Bản thân mã Shell cũng tương thích với / bin / sh (vì vậy không chỉ bash, mà dấu gạch ngang và các triển khai / bin / sh khác sẽ hoạt động) và / bin / sh là thứ thực sự luôn được cài đặt.


5

Tôi thích iptrafnhưng bạn có thể phải cài đặt nó và nó dường như không được duy trì tích cực nữa.


1
Có một iptraf-ng, bất kỳ đề xuất nào về sự khác biệt giữa chúng?
Felix Yan

1
iptraf-ng là một nhánh của dự án gốc. Nó sẽ có tất cả các tính năng ban đầu với nhiều hơn nữa.
Rudy Matela

2

Tôi thấy dstat là khá tốt. Phải được cài đặt mặc dù. Cung cấp cho bạn nhiều thông tin hơn bạn cần. Netstat sẽ cung cấp cho bạn tốc độ gói nhưng không cung cấp băng thông. netstat -s



0

Tôi không thể làm cho tập lệnh ifconfig phân tích cú pháp hoạt động cho tôi trên AMI, vì vậy, điều này phải hoạt động để đo lưu lượng nhận được trung bình trên 10 giây

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"

Xin lỗi, nó đã từng rất rẻ và khó chịu nhưng nó đã hoạt động!


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

Nếu bạn muốn đầu ra của (ifconfig -a) ở định dạng json, bạn có thể sử dụng điều này (python)


Không có thống kê thông lượng báo cáo nào?
Dzamo Norton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.