使用 K 线图分析 BBR 拥塞控制算法
一、概述
1. 问题背景
在网络性能分析中,当只有一个吞吐率散点图需要分析链路带宽走势时,传统的分析方法存在局限性。移动平均线会随时间依次平滑掉所有细节,因此它是滞后的。而蜡烛图(即 K 线图)同时保留峰谷起始,更多细节被保留,通过按阶段绘制四点包络线又同时会显示移动平均的趋势。
2. 核心思想
通过蜡烛图分析 BBR 带宽变化,可以识别多种网络状态:
- 随机波动和随机噪声
- 微突发流量
- 持续拥塞和逐渐拥塞
- 新流侵入和退出
- 探测比例和公平比例
3. 技术价值
蜡烛图通过实体长度、上影线、下影线长度等特征,能够刻画很多细节并得到很多结论。通过大阳线、大阴线、锤头、十字星、吊颈线等固有模式及其组合分析,可以深入理解 BBR 拥塞控制算法的运行状态。
二、蜡烛图基础
1. 起源与定义
蜡烛图(日本称为「けいせん」,Kei-sen)始于日本,早期用于统计米价走势,如今普遍用于金融领域。只有中国等少数国家叫「K 线图」,其余多称为「蜡烛图」。Kei-sen 发音也包括「线」的发音,疑似源于粤语音读。
2. 基本组成
一个标准的蜡烛图包含四个关键价格点:
- 开盘价(Open):周期开始时的价格
- 最高价(High):周期内的最高价格
- 最低价(Low):周期内的最低价格
- 收盘价(Close):周期结束时的价格
3. 形态特征
- 实体:收盘价与开盘价之间的部分,反映价格变动幅度
- 上影线:实体上方的细线,代表最高价与实体顶端(开盘价或收盘价)的距离
- 下影线:实体下方的细线,代表最低价与实体底端(开盘价或收盘价)的距离
4. 常见模式
- 大阳线:收盘价远高于开盘价,实体较长,表示强势上涨
- 大阴线:收盘价远低于开盘价,实体较长,表示强势下跌
- 锤头:下影线较长,实体较小,表示反转信号
- 十字星:开盘价与收盘价接近,实体很小,表示市场犹豫
- 吊颈线:上影线较长,实体较小,表示可能的反转
三、BBR 算法简介
1. 核心概念
BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 推出的一种 TCP 拥塞控制算法。与传统的基于丢包的拥塞控制算法(如 CUBIC)不同,BBR 基于带宽和 RTT(往返时间)进行拥塞控制。
2. 工作原理
BBR 通过测量网络路径的瓶颈带宽和最小 RTT,动态调整发送速率。其主要状态包括:
graph LR
A[Startup] -->|探测带宽| B[Drain]
B -->|排空队列| C[ProbeBW]
C -->|周期探测| D[ProbeRTT]
D -->|测量 RTT| C3. 关键参数
- BtlBw(Bottleneck Bandwidth):瓶颈带宽
- RtProp(Round-trip propagation time):最小往返时间
- Delivery Rate:实际交付速率
- Inflight:在途数据量
四、BBR 模拟场景分析
1. 场景设定
以下是一个典型的 BBR 模拟场景:
- t < 100:单流正常
- 100 < t < 200:随机突发
- t = 250:新流侵入
- 300 < t < 350:随机突发
- t = 500:新流侵入
- 600 < t < 650:持续拥塞
- 750 < t < 900:逐渐拥塞
- t = 1050:带宽加倍
- 1050 < t < 1250:带宽随机波动
- 1300 < t < 1450:突发波动
- 1450 < t < 1550:突发波动
2. 带宽变化识别
通过蜡烛图分析 BBR 带宽变化:
A. 随机波动
特征:实体较小,上下影线长度接近,表示带宽在较小范围内波动。
B. 微突发
特征:下影线较长或上影线较长,实体较小,表示短时间内带宽的突然变化。
C. 持续拥塞
特征:连续的大阴线,实体较长,表示带宽持续下降。
D. 逐渐拥塞
特征:实体逐渐变长且呈阴线趋势,表示带宽逐渐恶化。
E. 新流侵入
特征:突然的大阴线,下影线较长,表示带宽被新流抢占。
F. 退出
特征:突然的大阳线,上影线较长,表示流退出后带宽释放。
3. 分析优势
对移动平均而言,不同 alpha 的平滑细节不同,即便和算术平均放一起也看不出任何趋势,几乎无法分析。而蜡烛图能够:
- 保留峰谷起始信息
- 显示阶段内的最大值和最小值
- 同时展示趋势和细节
- 通过形态识别各种网络状态
五、Python 实现蜡烛图绘制
1. 环境准备
A. 安装依赖
pip3 install virtualenv
virtualenv py3env
source py3env/bin/activate
pip3 install mplfinanceB. 所需库
- mplfinance:专门用于金融数据可视化的 Python 库
- numpy:数值计算库
- pandas:数据处理库
2. 基础示例
A. 数据准备
import mplfinance as mpf
import numpy as np
import pandas as pd
data_list = []
data_list.append((100, 104, 98, 102))
data_list.append((102, 108, 88, 96))
data_list.append((96, 100, 85, 93))
data_list.append((93, 115, 93, 105))
data = np.array(data_list).reshape(-1, 4)
df = pd.DataFrame(data, columns=['Open', 'High', 'Low', 'Close'])
dates = pd.date_range(start='2023-01-01', periods=len(df), freq='D')
df.index = datesB. 图表绘制
market_colors = mpf.make_marketcolors(up='g', down='r')
style = mpf.make_mpf_style(marketcolors=market_colors)
mpf.plot(df, type='candle')C. 输出结果
绘制完成后,将生成标准的蜡烛图,其中:
- 绿色实体表示收盘价高于开盘价(阳线)
- 红色实体表示收盘价低于开盘价(阴线)
3. BBR 数据处理
A. 数据转换
将 BBR 的吞吐率数据转换为蜡烛图格式:
- Open:周期开始时的带宽
- High:周期内的最大带宽
- Low:周期内的最小带宽
- Close:周期结束时的带宽
B. 时间窗口选择
选择合适的时间窗口对数据分组:
- 过短:细节过多,难以识别趋势
- 过长:细节丢失,类似移动平均
建议根据实际场景调整,通常可以设置为 RTT 的整数倍。
六、扩展应用
1. Sigmoid 函数预处理
当有多个指标可以分析时,可以使用 sigmoid 函数进行特征预处理。Sigmoid 函数普遍运用于 AI 大模型,将值域映射到固定区间(一般 0 到 1),通过设定激发阈值来获得输出或不输出。
但在只有一个指标(如吞吐率散点图)的情况下,蜡烛图是更直观的分析方法。
2. 与其他方法对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 移动平均 | 平滑噪声,显示趋势 | 滞后,丢失细节 | 长期趋势分析 |
| 算术平均 | 计算简单 | 丢失所有波动信息 | 静态统计 |
| 蜡烛图 | 保留细节,显示趋势 | 需要人工识别模式 | 动态性能分析 |
3. 实际应用场景
- 网络性能监控:实时分析链路带宽变化
- 故障诊断:识别拥塞原因和类型
- 容量规划:分析带宽使用趋势
- 算法优化:评估 BBR 参数调整效果
七、总结
蜡烛图为 BBR 拥塞控制算法的性能分析提供了一种直观且信息丰富的方法。相比传统的移动平均或算术平均,蜡烛图能够同时保留趋势和细节,通过实体长度、上下影线等特征识别各种网络状态。
结合 Python 的 mplfinance 库,可以轻松实现 BBR 数据的蜡烛图可视化,为网络性能分析和故障排查提供有力工具。