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

/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 # 碰撞(半雙工)
#!/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

#!/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 | 低 | ~10ms | 1Gbps | 無 |
| libpcap (tcpdump) | 高(複製封包) | 封包級 | 深度分析 | libpcap |
| eBPF (bcc/bpftrace) | 極低 | 事件驅動 | 全速率 | Kernel 4.1+ |
sleep 0.1 達 10Hz 採樣(需 bash 4.2+ 支援小數睡眠)。ethtool -S 獲取驅動級計數器(queue 級流量、錯誤細分)。/sys/class/net:/sys/class/net:ro 讓容器監控宿主介面。直接讀取 sysfs 統計介面,是構建高效能網路可觀測體系的基石,無需重磅代理即可實現生產級流量監控。