2014年1月15日 星期三

如何量測高速網卡每秒封包量或流量

  Linux 己經有很多可以量測網路流量相關的工具,並且用相當清楚的介面來顯示,大部份這類的工具(例如ntopng, iftop)都是利用libpcap,這是一套用於監聽網路的封包補捉元件庫,雖然,利用libpcap發展出的這些工具提供所提供的功能相當多,它們卻無法同時處理多張Gigabit高速網卡。

  在這篇教學,我們將介紹如何用簡單的script來監看網卡的流量且不透過libpcap套件。這程式執行快速可應付多張高速網卡的流量,但前提是,您必須能適應這種文字介面的統計數據格式。

  程式的秘訣,在於它利用了sysfs虛擬檔案系統,這種檔案系統是Linux kernel開機時所匯出所有硬體相關的資訊,其中,網卡相關的統計資訊就在/sys/class/net/<ethX>/statistics

    例如,eth0網卡的統計資訊可以在下方位置找到:
ls -l /sys/class/net/eth0/statistics/
total 0
-r--r--r--. 1 root root 4096 Jan 15 08:46 collisions
-r--r--r--. 1 root root 4096 Jan 15 08:46 multicast
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_bytes
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_compressed
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_crc_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_dropped
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_fifo_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_frame_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_length_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_missed_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_over_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 rx_packets
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_aborted_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_bytes
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_carrier_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_compressed
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_dropped
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_fifo_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_heartbeat_errors
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_packets
-r--r--r--. 1 root root 4096 Jan 15 08:46 tx_window_errors

  其中,rx_packets指的是封包的接收數量,tx_packets是傳送數量,rx_bytes是接收的bytes數,tx_bytes是傳送的bytes數,rx_dropped是接收後丟棄的封包數量,tx_dropped是傳送時丟棄的封包數量。

    這些儲存在檔案系統的數據會即時自動的被kernel更新,因此,我們可以寫一些scripts利用這些資訊來統計流量。

    下方是兩個範例(作者:joemiller https://gist.github.com/joemiller/4069513);第一個範例計算某張網卡每秒處理的封包數(TX和RX),第二個範例可用來評量某張網卡進出的頻寬;只要好好利用這兩支程式,你就不再需要其它的工具了。(你會發現這兩個範例程式相當簡單,只是將內容簡單的擷取後取出要用的部份而已。)

測量某張網卡每秒封包處理數
#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        echo shows packets-per-second
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_packets`
        T1=`cat /sys/class/net/$1/statistics/tx_packets`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_packets`
        T2=`cat /sys/class/net/$1/statistics/tx_packets`
        TXPPS=`expr $T2 - $T1`
        RXPPS=`expr $R2 - $R1`
        echo "TX $1: $TXPPS pkts/s RX $1: $RXPPS pkts/s"
done

執行範例:
TX eth0: 538 pkts/s RX eth0: 405 pkts/s
TX eth0: 393 pkts/s RX eth0: 354 pkts/s
TX eth0: 661 pkts/s RX eth0: 673 pkts/s
TX eth0: 555 pkts/s RX eth0: 731 pkts/s
TX eth0: 1453 pkts/s RX eth0: 1605 pkts/s
TX eth0: 2343 pkts/s RX eth0: 1071 pkts/s
TX eth0: 676 pkts/s RX eth0: 594 pkts/s
TX eth0: 1127 pkts/s RX eth0: 1109 pkts/s
TX eth0: 1420 pkts/s RX eth0: 1046 pkts/s
TX eth0: 332 pkts/s RX eth0: 214 pkts/s
TX eth0: 472 pkts/s RX eth0: 431 pkts/s


測量某張網卡的頻寬
#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_bytes`
        T1=`cat /sys/class/net/$1/statistics/tx_bytes`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_bytes`
        T2=`cat /sys/class/net/$1/statistics/tx_bytes`
        TBPS=`expr $T2 - $T1`
        RBPS=`expr $R2 - $R1`
        TKBPS=`expr $TBPS / 1024`
        RKBPS=`expr $RBPS / 1024`
        echo "TX $1: $TKBPS kb/s RX $1: $RKBPS kb/s"
done

執行範例:
TX eth0: 335 kb/s RX eth0: 624 kb/s
TX eth0: 877 kb/s RX eth0: 538 kb/s
TX eth0: 368 kb/s RX eth0: 421 kb/s
TX eth0: 540 kb/s RX eth0: 469 kb/s
TX eth0: 430 kb/s RX eth0: 422 kb/s
TX eth0: 220 kb/s RX eth0: 216 kb/s
TX eth0: 85 kb/s RX eth0: 103 kb/s
TX eth0: 374 kb/s RX eth0: 434 kb/s
TX eth0: 186 kb/s RX eth0: 93 kb/s
TX eth0: 84 kb/s RX eth0: 140 kb/s
TX eth0: 187 kb/s RX eth0: 124 kb/s
TX eth0: 88 kb/s RX eth0: 85 kb/s

沒有留言:

張貼留言