IDC业务带宽监控,每个客户实例独立带宽统计报表
IDC 业务带宽监控和单台机器监控最大的区别,在于必须按客户实例独立统计流量,而不是只看整机总带宽。
很多运维初次部署时,只做了交换机端口流量采集,结果客户对账时拿不出每一台 VPS 或独立服务器的带宽报表,问题就出在监控粒度不够细。
本文直接给出可在真实 IDC 环境中落地的方案:通过 vNIC 流量采集、SNMP 与 NetFlow/sFlow 配合、再经过数据库归并生成每个客户实例的带宽统计报表。
适合零基础运维照做,也适合已有基础监控、需要补全独立计费报表的场景。
先分清三种带宽统计口径
开始配置之前,先确认你要的是哪种报表:
- 接口实时速率:单位 Mbps,表示当前带宽占用,主要用于实时告警。
- 累计流量:单位 GB 或 TB,表示一段时间内实际传输的数据量,用于流量计费。
- 95 计费带宽:按 5 分钟粒度采样,去掉最高 5% 的点后取最大值,是常见商业计费口径。
每客户实例独立统计报表一般同时需要第 1 和第 3 种。
如果只采集端口流量,无法区分同一物理机上多个云主机实例各自的用量,因此需要配合虚拟化层或网络设备流量采样。
采集层:三种主流数据来源
1. 虚拟化平台 vNIC 计数器
如果客户实例运行在 KVM、VMware 或 Hyper-V 上,直接读取虚拟网卡计数器最准确。
以 Libvirt 为例,一条命令就能拿到某个域名的网卡流量:
virsh domifstat <实例名> vnet0
输出类似:
vnet0 rx_bytes 1234567890
tx_bytes 987654321
把 rx_bytes 和 tx_bytes 定期抓取并计算差值,就是该实例的实时流量速率和累计流量。
在 VMware vCenter 中可通过 esxtop 或 API 的 net.usage 获取每台虚拟机的网络使用量。
2. 网卡镜像或 Tap 采集
如果实例跑在 Docker 或自定义网桥上,可以给宿主机物理网卡做镜像,用抓包工具按 IP 或 MAC 拆分流量。
这种方式不依赖虚拟化平台 API,但实现成本较高,适合没有平台权限时的备选。
3. 交换机 NetFlow/sFlow
如果客户实例直接绑定独立 IP(比如独立服务器租用),无需在宿主机上统计,直接在接入交换机或核心交换机上开启 sFlow/NetFlow,按源目 IP 聚合即可。
Cisco 交换机开启 sFlow 示例:
sflow flow-sampling 1000
sflow polling-interval 30
sflow collector-ip 192.0.2.10 collector-port 6343
华为交换机对应命令为 sflow collector ip 和 sflow flow-sampler,不同版本命令差异较大,建议先在测试端口验证。
数据归并:把原始流量变成客户实例报表
原始数据只是网卡计数或流记录,还需要按客户实例维度归并。
推荐用 Prometheus + SNMP Exporter 直接采集 vNIC 计数器,也可以通过脚本定期把 domifstat 结果写入 MySQL/InfluxDB。
归并逻辑如下:
- 每 60 秒抓一次每个实例的
rx_bytes/tx_bytes。 - 计算两次差值,得到 60 秒内的字节数。
- 乘以 8 再除以 60,得到当前 Mbps 速率。
- 按客户 ID 聚合到小时表 / 日报表。
示例 Python 伪代码片段:
current = get_rx_tx(instance_id)
rate_mbps = (current - last[instance_id]) * 8 / interval_seconds / 1000000
save_to_db(instance_id, time_bucket, rate_mbps)
注意:所有实例的采集频率必须统一。
如果有实例每隔 10 分钟才采一次,和每分钟采集的实例比较,峰值会被平均掉,统计结果就不公平。
报表输出:选现成工具还是自己开发
现成监控工具中,Zabbix 可以通过自定义 key 采集 vNIC 流量,然后按主机分组生成带宽图表,适合实例数量不多的场景。
Grafana 可以连接 Prometheus 数据源,直接按 instance 标签筛选不同客户。
需要商业报表时,可以考虑自研:后端用 InfluxDB 存储流量序列,前端用 Grafana 或 ECharts 生成每客户实例的日流量曲线和月汇总表。
输出报表时至少包含以下字段:
- 客户名称 / 客户 ID
- 实例 ID / IP
- 统计周期(实时、小时、日、月)
- 入方向峰值 / 出方向峰值
- 总流量(GB)
- 95 计费带宽值(如有需要)
四个容易踩的坑
- 只统计物理网卡,不分虚拟网卡:会导致所有实例共享同一份流量,无法区分到具体客户。务必从虚拟化层读取 vNIC 数据。
- 采样间隔不一致:不同实例采样频率不同,导致流量峰值被人为拉低或拉高。统一用相同采集周期,推荐 60 秒或更短。
- 忽略广播和多播流量:某些交换机 sFlow 不采样广播包,而虚拟化计数器一般包含,报表会和交换机统计对不上。对账时以虚拟化层数据为准,或明确注明统计口径。
- 不保留原始累计值:只存速率不存累计字节数,出现问题后无法回溯。建议同时保存
rx_bytes/tx_bytes原始计数。
如何验证报表准确
配置完成后,选一个测试实例持续下载大文件,对比监控报表中的入方向速率和客户端实际下载速度。
再登录宿主机执行 vnstat -i vnet0 或 sar -n DEV 1,检查系统层统计是否一致。
如果报表比实际速度低很多,优先检查采集间隔是否过大,或虚拟网卡名称是否正确。
如果比实际速度高,检查是否把交换机端口镜像和 BPDU 等控制流量也算进了客户实例,必要时在采集侧过滤非客户 IP 的流量。
常见疑问
问:监控很多客户实例时,轮询 vNIC 会不会影响宿主机性能?
正常影响很小。
Libvirt 的 domifstat 读取的是内核计数器,不占用数据面。
但如果实例数量超过 200 且采集频率低于 30 秒,建议改用 virt-manager 导出的 XML 批量获取,或直接读取 /sys/class/net/vnet*/statistics/ 下的文件,减少 libvirt 连接开销。
问:NetFlow 按源 IP 聚合能区分同一实例的多个 IP 吗?
可以。
为每个客户实例建立 IP 与客户 ID 的映射表,聚合时先按 IP 分组,再映射到客户实例。
如果实例有浮动 IP,需要把浮动 IP 也加入映射关系,否则会漏计。
问:和第三方流量监控平台对接,一般用哪种接口?
大多数平台支持 SNMP、sFlow、NetFlow 或 Prometheus API。
建议优先提供 Prometheus 指标接口,社区生态最丰富,Grafana 和云厂商都能直接拉取。
本文覆盖的配置方法适用于多数主流虚拟化和交换机环境。
如果你搭建完成后发现报表数据始终对不上,建议先从采样间隔入手,再看是否漏了虚拟网卡名称映射。
稳定运行一周后,再逐步增加 95 计费、峰值排名等附加功能。