萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux Shell 腳本監控高速網卡流量:基於 /sys/class/net 統計介面實現 Gbps 級精準統計

傳統 ifconfig、netstat、vnstat 依賴 libpcap 或輪詢 /proc/net/dev,在 10Gbps+ 高速介面上採樣頻率不足、CPU 佔用高。直接讀取 /sys/class/net/<iface>/statistics/ 由核心即時更新的計數器,可實現極低開銷的高頻採樣,支援 Gbps/Tbps 級流量統計。

sysfs 網路統計介面

核心統計檔案

/sys/class/net/eth0/statistics/
├── rx_bytes        # 接收位元組
├── tx_bytes        # 傳送位元組
├── rx_packets      # 接收封包數
├── tx_packets      # 傳送封包數
├── rx_errors       # 接收錯誤
├── tx_errors       # 傳送錯誤
├── rx_dropped      # 接收丟包
├── tx_dropped      # 傳送丟包
├── rx_fifo_errors  # FIFO 溢位
├── tx_fifo_errors
├── rx_crc_errors
├── rx_frame_errors
├── multicast       # 多播接收
└── collisions      # 碰撞(半雙工)

腳本一:每秒封包率 (PPS)

#!/bin/bash
# pps_monitor.sh 
INTERVAL=1
IF=${1:?Usage: $0 }

while true; do
  R1=$(cat /sys/class/net/$IF/statistics/rx_packets)
  T1=$(cat /sys/class/net/$IF/statistics/tx_packets)
  sleep $INTERVAL
  R2=$(cat /sys/class/net/$IF/statistics/rx_packets)
  T2=$(cat /sys/class/net/$IF/statistics/tx_packets)
  echo "TX $IF: $((T2-T1)) pkts/s  RX $IF: $((R2-R1)) pkts/s"
done

腳本二:頻寬利用率

#!/bin/bash
# bw_monitor.sh  [interval]
INTERVAL=${2:-1}
IF=${1:?Usage: $0  [interval]}

while true; do
  R1=$(cat /sys/class/net/$IF/statistics/rx_bytes)
  T1=$(cat /sys/class/net/$IF/statistics/tx_bytes)
  sleep $INTERVAL
  R2=$(cat /sys/class/net/$IF/statistics/rx_bytes)
  T2=$(cat /sys/class/net/$IF/statistics/tx_bytes)
  RX_KB=$(( (R2-R1) / 1024 / INTERVAL ))
  TX_KB=$(( (T2-T1) / 1024 / INTERVAL ))
  printf "TX %s: %d KB/s  RX %s: %d KB/s\n" $IF $TX_KB $IF $RX_KB
done

腳本輸出範例

進階增強版(支援多介面、JSON 輸出、Prometheus 推送)

#!/bin/bash
# netstat_exporter.sh - 兼容 Prometheus text 格式
IFACES=("eth0" "eth1" "bond0")
INTERVAL=5

while true; do
  for IF in "${IFACES[@]}"; do
    RX_B=$(cat /sys/class/net/$IF/statistics/rx_bytes 2>/dev/null || echo 0)
    TX_B=$(cat /sys/class/net/$IF/statistics/tx_bytes 2>/dev/null || echo 0)
    RX_P=$(cat /sys/class/net/$IF/statistics/rx_packets 2>/dev/null || echo 0)
    TX_P=$(cat /sys/class/net/$IF/statistics/tx_packets 2>/dev/null || echo 0)
    echo "node_network_receive_bytes_total{device=\"$IF\"} $RX_B"
    echo "node_network_transmit_bytes_total{device=\"$IF\"} $TX_B"
    echo "node_network_receive_packets_total{device=\"$IF\"} $RX_P"
    echo "node_network_transmit_packets_total{device=\"$IF\"} $TX_P"
  done
  sleep $INTERVAL
done

優勢對比

方法開銷最高採樣率適用速率依賴
/sys/class/net 讀取極低(純記憶體讀取)1ms+(受限 shell sleep)10Gbps~Tbps無
/proc/net/dev低~10ms1Gbps無
libpcap (tcpdump)高(複製封包)封包級深度分析libpcap
eBPF (bcc/bpftrace)極低事件驅動全速率Kernel 4.1+

生產部署建議

  • 使用 sleep 0.1 達 10Hz 採樣(需 bash 4.2+ 支援小數睡眠)。
  • 寫入 systemd service,標準輸出導向 journald 或推送至 VictoriaMetrics/InfluxDB。
  • 搭配 ethtool -S 獲取驅動級計數器(queue 級流量、錯誤細分)。
  • 容器環境掛載 /sys/class/net:/sys/class/net:ro 讓容器監控宿主介面。

直接讀取 sysfs 統計介面,是構建高效能網路可觀測體系的基石,無需重磅代理即可實現生產級流量監控。

copyright © 萬盛學電腦網 all rights reserved