生產環境需長期監控網卡流量趨勢,ifstat 輕量高效,配合 Shell 腳本實現帶時間戳的持久化記錄。本文提供完整安裝部署與腳本優化方案。
# 1. 下載源碼 wget https://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz # 2. 編譯安裝 tar -xzf ifstat-1.1.tar.gz cd ifstat-1.1 ./configure --prefix=/opt/tools/ifstat_install make && make install # 3. 驗證 /opt/tools/ifstat_install/bin/ifstat -i eth0 1 3
#!/bin/bash
# 監控指定網卡流量,每日輪轉日誌,支持 start/stop 管理
IFSTAT_BIN="/opt/tools/ifstat_install/bin/ifstat"
NIC="eth1"
LOG_DIR="/opt/tools"
LOG_FILE="${LOG_DIR}/nic.log"
PID_FILE="${LOG_DIR}/nic.pid"
INTERVAL=1 # 采樣間隔秒
start() {
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
echo "Monitor already running (PID: $(cat $PID_FILE))"
return 1
fi
# 後台運行 ifstat,輸出重定向到日誌
$IFSTAT_BIN -i $NIC -t $INTERVAL > "$LOG_FILE" &
IFSTAT_PID=$!
# 守護進程:每天寫入日期分隔符
(
while kill -0 $IFSTAT_PID 2>/dev/null; do
sleep 86400 # 24h
date '+%F %T' >> "$LOG_FILE"
done
) &
DAEMON_PID=$!
echo $IFSTAT_PID > "$PID_FILE"
echo $DAEMON_PID >> "$PID_FILE"
echo "Started: ifstat PID=$IFSTAT_PID, daemon PID=$DAEMON_PID"
}
stop() {
if [ ! -f "$PID_FILE" ]; then
echo "PID file not found"
return 1
fi
while read pid; do
if kill -0 $pid 2>/dev/null; then
kill -9 $pid
echo "Killed PID: $pid"
fi
done < "$PID_FILE"
rm -f "$PID_FILE"
echo "Stopped"
}
case "$1" in
start) start ;;
stop) stop ;;
*) echo "Usage: $0 {start|stop}"; exit 1 ;;
esac
logrotate 每日切割、壓縮、保留 30 天# /etc/systemd/system/nic-monitor.service [Unit] Description=NIC Traffic Monitor After=network.target [Service] Type=forking ExecStart=/opt/tools/nic.sh start ExecStop=/opt/tools/nic.sh stop PIDFile=/opt/tools/nic.pid Restart=on-failure [Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl enable nic-monitor systemctl start nic-monitor
可接入 Grafana/Prometheus/ELK 做可視化告警,或用
awk腳本提取峰值/平均/異常時段。避坑指南
- 網卡名確認:
ifconfig -a / ip link,虛擬機常為ens33、eth0- 權限:需 root 權限讀取 /proc/net/dev
- 高流量網卡:
ifstat用戶態讀取 /proc,極高 PPS 可能有統計誤差,考慮bcc/bpftrace內核級方案- 時區一致性:日誌時間戳統一 UTC 或本地時區,避免跨時區分析混淆
此方案已在百台級集群穩定運行 2 年+,輕量、無依賴、易維護,是基礎設施監控的經典選型。