如何写一个脚本流量监控

wen 实用脚本 2

从零到一:如何编写一个高效的服务器流量监控脚本(附完整代码与避坑指南)


目录导读

  1. 为什么你需要一个自定义流量监控脚本?(场景与痛点)
  2. 核心设计思路:监控脚本的三大支柱(采集、存储、告警)
  3. 实战代码拆解:基于Bash + Python的混合方案
  4. 进阶技巧:如何处理高并发与历史数据趋势分析
  5. 常见坑点与性能优化(含iptables误用、时区问题等)
  6. 专家问答:关于流量监控脚本的5个高频疑问

为什么你需要一个自定义流量监控脚本?

市面上的监控工具(如Zabbix、Prometheus)虽强大,但对于轻量级服务器或特定业务场景(如临时端口监控、按IP段统计流量)往往显得笨重。自己写脚本的优势在于:

如何写一个脚本流量监控

  • 精准控制:只采集你关心的数据(如特定进程的流量)。
  • 零依赖:无需安装重量级Agent,适合容器或边缘设备。
  • 成本透明:可精确计算每次请求产生的流量费用(如云厂商按流量计费)。

核心设计思路:监控脚本的三大支柱

一个合格的流量监控脚本必须解决三个问题:

  • 采集:从哪读数据?Linux下首选 /proc/net/dev(实时字节数)或 tcpdump(抓包分析)。
  • 存储:数据存哪里?轻量用 RRDtool 或直接追加到 SQLite/CSV
  • 告警:何时通知?通过阈值触发邮件、钉钉或Webhook。

实战代码拆解:基于Bash + Python的混合方案

以下脚本结合Bash的轻量采集与Python的计算/告警,实现每10秒统计一次指定网卡(如eth0)的实时速率:

#!/bin/bash
# 采集部分:读取/proc/net/dev,输出到临时文件
INTERFACE="eth0"
while true; do
  RX1=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $2}')
  TX1=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $10}')
  sleep 10
  RX2=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $2}')
  TX2=$(cat /proc/net/dev | grep $INTERFACE | awk '{print $10}')
  echo "$(date +%s) $(( (RX2-RX1)*8/10 )) $(( (TX2-TX1)*8/10 ))" >> /tmp/net_flow.log
  # 调用Python分析(阈值告警)
  python3 /opt/check_alert.py
done

Python分析模块(check_alert.py)核心逻辑:

import time
threshold = 100 * 1024 * 1024  # 100Mbps
with open('/tmp/net_flow.log') as f:
    line = f.readlines()[-1].split()
    rx_rate = int(line[1])  # 单位:bps
    if rx_rate > threshold:
        print(f"ALERT: Inbound rate {rx_rate/1024/1024:.2f} Mbps exceeded!")
        # 此处可调用requests.post()发送Webhook

关键点: 脚本使用 /proc/net/dev 获取的是累计字节数,必须通过两次采样差值计算速率,单位换算(bit vs byte)和休眠时间(10秒)决定了数据的精度。


进阶技巧:如何处理高并发与历史数据趋势分析

  • 并发瓶颈:若监控多个网卡或服务器,建议用多线程(Python threading)或直接改用 psutil 库(psutil.net_io_counters(pernic=True))简化采集。
  • 趋势分析:利用 pandas 读取CSV,通过滑动平均(rolling(window=30).mean())过滤瞬时尖峰,再画图(matplotlib)或导出给Grafana。

常见坑点与性能优化

坑点 解决方案
CPU占用高 避免频繁调用tcpdump,改为读取内核计数文件。
时区错乱 时间戳用 time.time()(UTC),展示时再转换。
重启后数据丢失 使用 systemd 服务或 supervisor 守护脚本。
IPv6流量统计缺失 检查 /proc/net/deveth0 是否包含IPv6计数(通常包含)。

专家问答:关于流量监控脚本的5个高频疑问

问1:为什么我用 ifconfig 看到的流量和 /proc/net/dev 不一致? 答:ifconfig 显示的是历史累计值,而监控脚本计算的是增量,若你修改了网卡MAC或重启网络服务,计数器会清零。

问2:监控脚本需要root权限吗? 答:读取 /proc/net/dev 不需要root,但若用 tcpdump 抓包必须root,建议以普通用户运行,通过 setcap 赋予抓包能力。

问3:如何限制脚本只监控某个进程(如Nginx)的流量? 答:使用 nethogs 工具,或通过 iptables -A OUTPUT -m owner --uid-owner nginx 配合计数获取。

问4:脚本写入文件会不会耗尽磁盘? 答:务必添加日志轮转(logrotate),或改用 round-robin 数据库(如RRDtool)。

问5:是否有现成库比纯Bash更快? 答:对于复杂逻辑,用 Python + psutil 更高效,代码量减少50%且跨平台。


监控脚本的核心不在于代码多复杂,而在于采样精度告警时效性的平衡,建议先从最小可用版本(MVD)开始,逐步加入历史回溯与自动发现功能,希望本文提供的思路能帮助你构建出适配业务场景的流量监控利器——毕竟,没有监控的生产环境,就像蒙眼开车,而一个10行脚本,往往比装一套沉重的监控平台更实用。

抱歉,评论功能暂时关闭!