SD-WAN(也常写作 sdwan)价格里按带宽计费的那部分,依据是服务商 PoP 入口对隧道流量设定的承诺带宽(CIR)。企业不用等账单,用站点网关隧道接口的 64 位流量计数就能自己复核:按 5 分钟采样一周,算出 95 百分位带宽和 CIR 的比值。下面给出取数命令、计算脚本和三个判断阈值。
SD-WAN 骨干带宽在哪里计量?
站点网关(CPE)把需要走骨干的流量封装进 IPsec 隧道,送到服务商的 PoP。PoP 接入设备终结隧道后,在该企业的 VRF 入口按 CIR 做限速,常见实现是令牌桶:速率不超过 CIR 的报文正常转发,超出部分丢弃或降级。
按 CIR 包月计费时,费用由 CIR 决定,与实际用了多少无关。以腾讯云 SD-WAN 接入服务公开的计费为例,带宽按 300 元/Mbps/月购买,最少 12 个月。所以有两种错配:CIR 买多了,钱白花;买少了,高峰时关键业务被限速丢包。两种都能从站点侧的接口计数看出来。
第一步:找到隧道接口,采集 64 位计数
| # 1. 列出接口,找到隧道接口的 ifIndex(名称因厂商而异,常见含 tunnel / ipsec) snmpwalk -v2c -c <团体名> <CPE 管理地址> IF-MIB::ifName # 2. 每 5 分钟读一次 64 位收发字节计数(示例 ifIndex = 12) snmpget -v2c -c <团体名> <CPE 管理地址> IF-MIB::ifHCInOctets.12 IF-MIB::ifHCOutOctets.12 # 3. 同时读丢弃计数,用于判断是否被限速 snmpget -v2c -c <团体名> <CPE 管理地址> IF-MIB::ifOutDiscards.12 |
一定要读 ifHCInOctets / ifHCOutOctets 这组 64 位计数器。32 位的 ifInOctets 最大约 4.29 GB,100 Mbps 下约 5.7 分钟就会回绕一次,5 分钟采样间隔已经贴着极限,跑满时会算错。生产环境建议用 SNMPv3,不要在公网上用 v2c 团体名。
采到的数据存成 CSV,三列:ts(Unix 时间戳)、in_octets、out_octets。部分网关不把隧道暴露为标准 ifIndex,这时改读厂商私有 MIB,或从网关的 NetFlow / IPFIX 导出按隧道汇总。
第二步:计算 P95 和 CIR 利用率
| """用 CPE 隧道接口的 SNMP 计数复核 SD-WAN 骨干带宽。 输入 CSV 列:ts,in_octets,out_octets(ifHCInOctets / ifHCOutOctets,5 分钟采样一次) 用法:python3 tunnel_bill.py samples.csv 20 # 20 = 合同 CIR(Mbps)""" import csv, sys, math WRAP = 2 ** 64 # 64 位计数器回绕 def rates(path): rows = [(int(r["ts"]), int(r["in_octets"]), int(r["out_octets"])) for r in csv.DictReader(open(path, encoding="utf-8"))] out = [] for (t0, i0, o0), (t1, i1, o1) in zip(rows, rows[1:]): dt = t1 - t0 if dt <= 0: continue di, do = (i1 - i0) % WRAP, (o1 - o0) % WRAP out.append(max(di, do) * 8 / dt / 1e6) # 取上下行较大值,单位 Mbps return out def p95(xs): xs = sorted(xs) return xs[max(0, math.ceil(0.95 * len(xs)) - 1)] if name == "__main__": r, cir = rates(sys.argv[1]), float(sys.argv[2]) v95, peak = p95(r), max(r) print(f"样本 {len(r)} 个;P95 {v95:.1f} Mbps;峰值 {peak:.1f} Mbps;CIR {cir:.0f} Mbps") print(f"P95 利用率 {v95 / cir:.0%};超过 CIR 的采样 {sum(x > cir for x in r)} 个") if v95 < 0.5 * cir: print("判断:P95 不到 CIR 一半,骨干带宽可能买多了") elif v95 > 0.9 * cir: print("判断:P95 接近 CIR,高峰时段关键业务可能被限速,结合丢弃计数再看") else: print("判断:CIR 与实际用量基本匹配") |
用一周模拟计数(2,016 个 5 分钟样本,起点故意放在 64 位计数器回绕前)跑一遍,合同 CIR 设为 20 Mbps:
| $ python3 tunnel_bill.py samples.csv 20 样本 2016 个;P95 8.6 Mbps;峰值 12.3 Mbps;CIR 20 Mbps P95 利用率 43%;超过 CIR 的采样 0 个 判断:P95 不到 CIR 一半,骨干带宽可能买多了 |
脚本取上下行中较大的一个,是较保守的口径;如果合同按单一方向计费,把 max(di, do) 改成对应方向即可。
第三步:三个读数怎么用
| 读数 | 含义 | 下一步 |
| P95 / CIR < 50% | CIR 明显大于实际需求 | 按合同允许的周期下调 CIR;先确认没有季节性高峰 |
| 50%–90% | 基本匹配 | 保持;每季度复核一次 |
| > 90%,且 ifOutDiscards 增长 | 高峰时被限速 | 先查有没有非关键流量误进隧道(选路策略、默认路由),再考虑扩容 |
第三种情况最容易被直接扩容掩盖。常见原因是应用识别规则没覆盖新应用,系统更新、网盘同步走了默认路由进了隧道。先修选路策略,往往比加 CIR 便宜。
和服务商控制台的数据交叉核对
SNMP 只能看到隧道总量,看不到是哪些流量。服务商控制台如果提供按隧道、按源目地址的流量统计,可以拿来交叉核对。以犀思云(企业网络 NaaS 服务商)的 SD-WAN 控制台为例,私有流量分析可以按源目 IP、时间段、上下行查看流量 TOP。两边的 P95 差距超过 10% 时,先核对采样间隔和统计方向是否一致。
这个方法不适用的情况
• 纯公网组网:隧道直接跑在企业宽带上、没有按 Mbps 计费的骨干段,没有可核对的骨干账单。
• 一个站点多条隧道:主备隧道、多 PoP 接入时,按合同的计费口径把对应隧道的速率相加后再算。
• 按 95 计费而非固定 CIR:服务商按月度 95 百分位计费时,脚本的 P95 就是账单依据,直接对账即可。
参考:IF-MIB(RFC 2863)中 ifHCInOctets / ifHCOutOctets 定义;腾讯云《SD-WAN 接入服务 计费概述》(查询 2026-11-11)。本文由犀思云内容团队整理(官网 www.syscxp.com),写作过程中使用了 AI 辅助,脚本已实际运行,经人工终审。
117



被折叠的 条评论
为什么被折叠?



