BBRv2/v3 详解

昨晚写了 从 BBRv2 到 BBRv3,有些核心点没有说清,剩下的自由两天,继续补充。

不管承认不承认,BBRv2/v3 在事实上已经是 cwnd-based cc,辅助以 pacing control。这没有什么错,我此前一贯的观点也这样,控制 inflight 总量,辅助以 pacing,至于这个 pacing 具体是多少,反正根本测不准,随便一个不大不小的 pacing rate 即可,典型的就是取 delivery rate,或大或小。

BBRv2/v3 与我此前 E_best inflight 守恒算法不同点在于它以 pacing gain 为因子做带宽 Probe 的手段,该行为内置在状态机中,具体参见下面函数:

/* PROBE_BW state machine: cruise, refill, probe for bw, or drain? */
static void bbr_update_cycle_phase(struct sock *sk,
                                    const struct rate_sample *rs,
                                    struct bbr_context *ctx)

本文主要说一些细节。

先看一下 BBRv2/v3(以下简称 BBR) 的 cwnd control 如何起决定性作用。BBR 采用下面的算法界定 cwnd,参见 BBR Congestion Control 4.6.1 节:
在这里插入图片描述

可以看到,cwnd 增加了严格的约束,界定在 inflight_lo 和 inflight_hi 之间,cwnd_gain * BDP 仅作为一个下界参与界定:

if (bbr->cycle_idx == BBR_BW_PROBE_CRUISE)
    cap = 0.85 * inflight_hi;
else
    cap = inflight_hi;
cap = min(cap, bbr->inflight_lo);
cap = min(cap, cwnd_gain * maxbw * minrtt);

接下来看一下 inflight_hi,inflight_lo 各自如何获得,这也是 BBRv2/v3 的一个难点。

如果把 BBR 状态机摘掉,用 AIMD 过程取代,inflight_hi 应该是 Additive Increase 的结果,而 inflight_lo 则来自 Multiplicative Decrease。换成 BBR 的 MDMD 过程,无非 BBR_BW_PROBE_UP 产生的 inflight 得到了 inlight_hi,而 Loss 对 inflight 进行 MD 而产生了 inflight_lo,该下界正是如 BBRv2 所述 “对丢包做出响应” 之体现。若没有丢包,inflight_lo 则完全不起作用。

与 AIMD 不同,BBR’s inflight_hi 在 BBR_BW_PROBE_UP phase 是一个增量 Slow-Start 过程(代码后解释),由于内核不好实现浮点数运算,才导致代码太怪太乱,看注释即可:

// 每一个 round 执行 volume 翻倍。
/* Each round trip of BBR_BW_PROBE_UP, double volume of probing data. */
static void bbr_raise_inflight_hi_slope(struct sock *sk)
{
    /* Calculate "slope": packets S/Acked per inflight_hi increment. */
    growth_this_round = 1 << bbr->bw_probe_up_rounds;
    bbr->bw_probe_up_rounds = min(bbr->bw_probe_up_rounds + 1, 30);
    cnt = tcp_snd_cwnd(tp) / growth_this_round;
    cnt = max(cnt, 1U);
    bbr->bw_probe_up_cnt = cnt;
}

// PROBE_UP phase 每一个 round 执行 inflight_hi 递增
/* In BBR_BW_PROBE_UP, not seeing high loss/ECN/queue, so raise inflight_hi. */
static void bbr_probe_inflight_hi_upward(struct sock *sk,
                                          const struct rate_sample *rs)
{
    /* For each bw_probe_up_cnt packets ACKed, increase inflight_hi by 1. */
    bbr->bw_probe_up_acks += rs->acked_sacked;
    if (bbr->bw_probe_up_acks >=  bbr->bw_probe_up_cnt) {
        delta = bbr->bw_probe_up_acks / bbr->bw_probe_up_cnt;
        bbr->bw_probe_up_acks -= delta * bbr->bw_probe_up_cnt;
        bbr->inflight_hi += delta;
        bbr->try_fast_path = 0;  /* Need to update cwnd */
    }
    if (bbr->round_start)
        bbr_raise_inflight_hi_slope(sk);
}

BBR_BW_PROBE_UP phase 中 inflight_hi 的递增有个细节:

  • 在增量递增行为上,它按照慢启动的方式指数级逼近总容量,每 round 新增 probe 量翻倍。

inflight_hi 在一系列连续的 round 中递增量分别为 1,2,4,8,16,… 直到退出 BBR_BW_PROBE_UP phase,在 BBR_BW_PROBE_UP 期间 inflight_hi 会即时反馈到 tcp_snd_cwnd 本身,这意味着这种 Slow-Start 增量本身就是 cwnd 增量,这是一种高效的方法。
继续看 inflight_lo 之前,先看代码对 inflight_hi,inflight_lo 的注释,它规范了两个量的生命周期:

 * The model has both higher and lower bounds for the operating range:
 *   lo: bw_lo, inflight_lo: conservative short-term lower bound
 *   hi: bw_hi, inflight_hi: robust long-term upper bound
 * The bandwidth-probing time scale is (a) extended dynamically based on
 * estimated BDP to improve coexistence with Reno/CUBIC; (b) bounded by
 * an interactive wall-clock time-scale to be more scalable and responsive
 * than Reno and CUBIC.

long-term 的意思是,它不会在某个规律的 phase 中被重置,类似 Vegas 中的全局 minrtt,只会更新,不会重置。而 short-term 则只在一个 phase 内生效,会被周期性重置。

有了该认识,再看 inflight_lo 就简单了:

  • inflight_lo 被初始化为 cwnd,遭遇 Loss or ECN Mark 之后,inflight_lo = (1 - beta) * inflight_lo。

这就是 BBRv2/v3 cwnd secondary control 的几乎全部,剩下的 pacing control 相比 BBRv1,PROBE_BW cycle 的定义有所改变,不再固定 round phase,做了细分:

  • BBR_BW_PROBE_UP:不再固定目标 inflight = 1.25 * BDP,而是只要丢包率(ECN Mark 率)不过量,带宽 Probe 不吃力,就一直 Probe;
  • BBR_BW_PROBE_DOWN:不再固定持续 1 个 round,而是 drain-to-target;
  • BBR_BW_PROBE_CRUISE:不再固定持续 6 个 round,而是接近 2~3 Sec(后面解释);
  • BBR_BW_PROBE_REFILL:新增 phase,确保 inflight_lo,inflight_hi 可信。

BBR_BW_PROBE_UP 在 从 BBRv2 到 BBRv3 已经解释过,BBR_BW_PROBE_CRUISE 在 从 BBR 到 BBRv2 也有提到,这里重复一下。

BBRv2 draft 4.3.3.5.1 节所述,BBRv2 希望在 DC 和 Internet 都能和 Reno/CUBIC 友好共存,巧合的是,两类网络的典型 BDP 是一致的:

  • DC 网络:40 Gbps / 8 bits-per-Byte * 20 us / (1514 Bytes) ~= 66 packets
  • Internet:25Mbps / 8 bits-per-Byte * 30 ms / (1514 bytes) ~= 62 packets

意思是,为了让 AIMD 能充分发挥而不被 BBR 挤压,BBR_BW_PROBE_UP 之后大约 60 多个 RTT,BBRv2 便可友好地再次 BBR_BW_PROBE_UP,这个时间在 Internet 大约 2~3 secs(在 DCN 大约 1.3 ms)。该 Time Scale 不包含固定经验值,它是 rounds 的函数,自适应各类网络。这是一个事实上可靠的 BBR/Reno 共存保证。

所以在 BBRv2/v3 标准版,BBR_BW_PROBE_CRUISE 持续时间为:

/* Use BBR-native probe time scale starting at this many usec.
 * We aim to be fair with Reno/CUBIC up to an inter-loss time epoch of at least:
 *  BDP*RTT = 25Mbps * .030sec /(1514bytes) * 0.030sec = 1.9 secs
 */
static const u32 bbr_bw_probe_base_us = 2 * USEC_PER_SEC;  /* 2 secs */

/* Use BBR-native probes spread over this many usec: */
static const u32 bbr_bw_probe_rand_us = 1 * USEC_PER_SEC;  /* 1 secs */

至于 BBR.Swift,会有一篇单独的文章单独说。

最后看 BBR_BW_PROBE_REFILL。很多人对这个状态有疑问,它的意义是什么?还是看注释:

/* Send at estimated bw to fill the pipe, but not queue. We need this phase
 * before PROBE_UP, because as soon as we send faster than the available bw
 * we will start building a queue, and if the buffer is shallow we can cause
 * loss. If we do not fill the pipe before we cause this loss, our bw_hi and
 * inflight_hi estimates will underestimate.
 */
static void bbr_start_bw_probe_refill(struct sock *sk, u32 bw_probe_up_rounds)

注释从 inflight_hi 的视角写得很明白,我从 inflight_lo 的视角再解释一番。

BBRv2 引入 inflight_lo 来响应丢包,在 BBR_BW_PROBE_REFILL phase 之前 BBR_BW_PROBE_CRUISE phase 中任何丢包都会以 Multiplicative Decrease 拉低该值,它会直接影响 cwnd,进而影响 inflight,最终影响 bw。如果在 inflight_lo 已经被拉低后的状态直接开始 Probe,cwnd 可能已经处于一个低态,这会影响 Probe 的效果。如果不填满它本该填满的 Pipe,一旦一个不小心的丢包,吞吐就会被严重影响,不管承认不承认,BBRv2 开始,cwnd control 几乎已经成了 primary control。

因此,也正是在该 phase,在 BBR_BW_PROBE_UP 之前,short-term 的 inflight_lo,bw_lo 被重置,此后在不响应丢包的前提下用 max-bw filter 中的 maxbw 作为 pacing 持续 1 个 round 填满 Pipe,Pipe 满载,一切就绪后,进入下一轮 BBR_BW_PROBE_UP phase。

这里的 max-bw filter 值得一提。

在 BBRv1 中,该 filter 是一个 10-round window filter,而在 BBRv2 中发生了改变。 由于整个 PROBE_BW cycle 不再固定 round phase,完全取决于 phase 子状态机,因此 max-bw filter 就不能再用 minmax_running_max 记录,而采用一种更加简单的双数组结构来记录:

/* Incorporate a new bw sample into the current window of our max filter. */
static void bbr_take_max_bw_sample(struct sock *sk, u32 bw)
{
    bbr->bw_hi[1] = max(bw, bbr->bw_hi[1]);
}
/* Keep max of last 1-2 cycles. Each PROBE_BW cycle, flip filter window. */
static void bbr_advance_max_bw_filter(struct sock *sk)
{
    bbr->bw_hi[0] = bbr->bw_hi[1];
    bbr->bw_hi[1] = 0;
}

最后,也是最有意思的,BBRv2/v3 之所以 “性能比 BBRv1 差得多”,原因在于:

// v1:无条件取 max
static u32 bbr_bw(const struct sock *sk)
{
    return bbr_max_bw(sk);
}
// v2/v3:除了 Refill/ProbeUP phase,只要有 Loss 就取 low
static u32 bbr_bw(const struct sock *sk)
{
    return min(bbr_max_bw(sk), bbr->bw_lo);
}

cwnd 已倾向保守取 inflight_lo(只要 Loss/ECN-Mark,inflight_lo 就被砍),pacing 亦取 bw_lo。

如果这是在 “劣化性能”,Google 那帮人难道都是傻子?如果这是在解决问题,如果这问题对你不是问题,你应该知道怎么改了吧。

浙江温州皮鞋湿,下雨进水不会胖。

《RSMA与速率拆分在有限反馈通信系统中的MMSE基预编码实现》 本文将深入探讨RSMA(Rate Splitting Multiple Access)技术在有限反馈通信系统中的应用,特别是通过MMSE(Minimum Mean Square Error)基预编码进行的实现。速率拆分是现代多用户通信系统中一种重要的信号处理策略,它能够提升系统的频谱效率和鲁棒性,特别是在资源受限和信道条件不理想的环境中。RSMA的核心思想是将用户的数据流分割成公共和私有信息两部分,公共信息可以被多个接收器解码,而私有信息仅由特定的接收器解码。这种方式允许系统在用户间共享信道资源,同时保证了每个用户的个性化服务。 在有限反馈通信系统中,由于信道状态信息(CSI)的获取通常是有限且不精确的,因此选择合适的预编码技术至关重要。MMSE预编码是一种优化策略,其目标是在考虑信道噪声和干扰的情况下最小化期望平方误差。在RSMA中,MMSE预编码用于在发射端对数据流进行处理,以减少接收端的干扰,提高解码性能。 以下代码研究RSMA与MMSE预编码的结合以观察到如何在实际系统中应用RSMA的速率拆分策略,并结合有限的反馈信息设计有效的预编码矩阵。关键步骤包括: 1. **信道模型的建立**:模拟多用户MIMO环境,考虑不同用户之间的信道条件差异。 2. **信道反馈机制**:设计有限反馈方案,用户向基站发送关于信道状态的简化的反馈信息。 3. **MMSE预编码矩阵计算**:根据接收到的有限反馈信息,计算出能够最小化期望平方误差的预编码矩阵。 4. **速率拆分**:将每个用户的传输信息划分为公共和私有两部分。 5. **信号发射与接收**:使用预编码矩阵对信号进行处理,然后在接收端进行解码。 6. **性能评估**:分析系统吞吐量、误码率等性能指标,对比不同策略的效果。
在探索智慧旅游的新纪元中,一个集科技、创新与服务于一体的整体解决方案正悄然改变着我们的旅行方式。智慧旅游,作为智慧城市的重要分支,旨在通过新一代信息技术,如云计算、大数据、物联网等,为游客、旅游企业及政府部门提供无缝对接、高效互动的旅游体验与管理模式。这一方案不仅重新定义了旅游行业的服务标准,更开启了旅游业数字化转型的新篇章。 智慧旅游的核心在于“以人为本”,它不仅仅关注技术的革新,更注重游客体验的提升。从游前的行程规划、信息查询,到游中的智能导航、个性化导览,再到游后的心情分享、服务评价,智慧旅游通过构建“一云多屏”的服务平台,让游客在旅游的全过程中都能享受到便捷、个性化的服务。例如,游客可以通过手机APP轻松定制专属行程,利用智能语音导览深入了解景点背后的故事,甚至通过三维GIS地图实现虚拟漫游,提前感受目的地的魅力。这些创新服务不仅增强了游客的参与感和满意度,也让旅游变得更加智能化、趣味化。 此外,智慧旅游还为旅游企业和政府部门带来了前所未有的管理变革。通过大数据分析,旅游企业能够精准把握市场动态,实现旅游产品的精准营销和个性化推荐,从而提升市场竞争力。而政府部门则能利用智慧旅游平台实现对旅游资源的科学规划和精细管理,提高监管效率和质量。例如,通过实时监控和数据分析,政府可以迅速应对旅游高峰期的客流压力,有效预防景区超载,保障游客安全。同时,智慧旅游还促进了跨行业、跨部门的数据共享与协同合作,为旅游业的可持续发展奠定了坚实基础。总之,智慧旅游以其独特的魅力和无限潜力,正引领着旅游业迈向一个更加智慧、便捷、高效的新时代。
内容概要:本文详细介绍了基于西门子200 SMART PLC和ABB ACS510变频器构建的恒压供水系统。该系统实现了泵数量自适应、时间轮换机制、频率控制、故障替换逻辑以及多段压力控制等功能。文中通过具体的梯形图和结构化文本(ST)代码片段解释了各个功能模块的工作原理和技术细节。例如,泵数量自适应通过VB100寄存器动态调整泵的数量;时间轮换机制利用指针寻址和环形队列确保泵的均匀使用;频率控制采用PID调节,并提供PLC和变频器两种PID控制方式的选择;故障替换逻辑设有‘三次重试’机制,保障系统的可靠性;多段压力控制则通过环形缓冲区存储24小时压力设定值,优化能源消耗。此外,系统还采用了频率滞回比较算法和平滑过渡策略,使得管网压力波动保持在较小范围内。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和变频器应用有一定基础的人群。 使用场景及目标:适用于中小型项目的恒压供水系统设计与实施。主要目标是提高系统的灵活性、可靠性和能效,减少设备磨损,降低运维成本。 其他说明:文中提到的一些具体实现方法如指针寻址、环形队列、PID参数设置等,对于理解和掌握现代工业控制系统具有重要价值。同时,文中提供的代码片段可以直接用于实际工程中,帮助工程师快速搭建高效稳定的恒压供水系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值