多路径 bbr mpbbr 公平性推演

news2024/11/22 19:03:58

mptcp 推出很久了,先看 rfc6356 三原则:

  • 对自己,mptcp 的吞吐不能比用 sp(single path)tcp 时更差;
  • 对它者,mptcp 子流对资源的占用不能侵害其它 sptcp 流量;
  • 负载分担,要将孬 subflow 流量分担到好 subflow 上。

若精心实现这三者,过犹不及:

  • 负载均匀分担到所有 subflow 需精确计算,但 tcp 的信息精度不支持;
  • 目标执着于 mp,有时吞吐还不如 sp,且乱序,重传导致时延增加;
  • 挑选最优路径,意味着次优等其它路径被放弃;

这些问题本质原因还是 tcp 乃至所有传输层协议信息精度不足以支撑 mp 传输,我认可 mp,但我不认可 mptcp。

说到底就是 tcp/ip 网络传输缺乏一种模糊逻辑和概率路由的机制,这一点我在前面谈到图论最大流最小割时有说过,若 ip 路由不以最短路径为基,而以排序最小割最大流为概率进行传输,网络天然就 mp,其上的 tcp 天然就 mp,若有一日有人发现最短路径可解放保序业务主机算力,那他会提出 sptcp,即单路径 tcp 协议,也能有一篇论文当经理。事情正反都合理,事情正着做,逻辑要反着想。

说说 mpbbr。

昨天有朋友问我 bbr 多路径问题,如果每条 subflow 都跑 bbr,n 条子流就是 n 倍嗨,这违反 rfc6356 原则二。我就着这问题简单推演了一个 bbr 的多路径模型。

先提出问题,然后推演模型,再然后调参,最后仿真,最最后上线灰度,但显然最最后也没得机会。

mptcp 拥塞控制核心是耦合,即所有子流不再独立进行拥塞控制,而彼此影响,比如在控制 cwnd 总量的前提下针对性调整某条子流的 cwnd。这在 aimd 算法中很容易实现,当前主流 mptcp 拥塞控制的耦合算法基本都是 aimd,不再赘述。但对 bbr 而言,由于它是 rate-based,而 rate 作为矢量不存在耦合,便无法采用 aimd 的方法,便需要一个新方法来保证 mpbbr 不侵害其它 sptcp 流量。

何谈侵害?有交互才能侵害,如果两个流量走不同路径便井水不犯河水谈不上侵害,因此只有经过相同瓶颈的流量才需要确保公平性,mptcp 也不例外。

bbr subflow 共享瓶颈识别非常简单,同步 probertt 意味着同时进入 probertt 的 subflow 共享瓶颈,同时还可辅助一些别的手段加以确认减少误判,比如单独 subflow probe 时 rtt 同时升高的 subflow 共享瓶颈,将共享瓶颈的 subflow 们加入集合 S,目标是 “集合 S 内的所有 subflow 不能联合起来侵害共享同一瓶颈的其它 sptcp 流”

由于 bbr 独立测量 maxbw 和 minrtt,若不对这个过程加以干涉,bbr 默认会独自与其它流共享资源,将它们耦合在一起的方式就是提供一个作用力,让集合 S 中的 subflow 们一起往里收,最终每个 subflow 收到 1 / n 的力道。

先看标准 bbr 的动力学方程,以 3 条流为例:

d x d t = C ⋅ g ⋅ x ⋅ R g ⋅ x ⋅ R + y ⋅ R + z ⋅ R − x \dfrac{dx}{dt}=C\cdot \dfrac{g\cdot x\cdot R}{g\cdot x\cdot R+y\cdot R+z\cdot R}-x dtdx=CgxR+yR+zRgxRx

y d t = C ⋅ g ⋅ y ⋅ R g ⋅ y ⋅ R + x ⋅ R + z ⋅ R − y \dfrac{y}{dt}=C\cdot \dfrac{g\cdot y\cdot R}{g\cdot y\cdot R+x\cdot R+z\cdot R}-y dty=CgyR+xR+zRgyRy

z d t = C ⋅ g ⋅ z ⋅ R g ⋅ z ⋅ R + x ⋅ R + y ⋅ R − z \dfrac{z}{dt}=C\cdot \dfrac{g\cdot z\cdot R}{g\cdot z\cdot R+x\cdot R+y\cdot R}-z dtz=CgzR+xR+yRgzRz

我以 probe 之后为收力点,若 probe 到带宽 c,我将其缩放为 c = c * (1/c),缩放系数为 d = 1 / n,即在上面方程组右边第一项后面再乘以一个系数 d 即可。

若设计独立的拥塞控制算法,公平性最大的难点在于共享瓶颈的流量彼此独立互不知情,我经常卡顿于不知道 n 的尴尬,若知道了 n,一切就迎刃而解。幸运的是 mpbbr 中,sender 知道 n,知道集合 S 的一切信息。

但事情并没有这么简单。如果某条流直接缩放 1 / n,腾出的资源会被同在 S 中的其它 subflow 拿去,公平性动力会浪费在 subflow 彼此交互之上,因此需要走 “绝对值越小加速比越大” 的路子,即选择系数 d > 1 / n。或另一个路子,分批次慢缩放。

微分方程改为下:

d x d t = C ⋅ g ⋅ x ⋅ R g ⋅ x ⋅ R + y ⋅ R + z ⋅ R ⋅ D − x \dfrac{dx}{dt}=C\cdot \dfrac{g\cdot x\cdot R}{g\cdot x\cdot R+y\cdot R+z\cdot R}\cdot D-x dtdx=CgxR+yR+zRgxRDx【D > 1 / n】

接下来模拟调参。先给出下面的数值解:

a, b = 1.25, 0
C, R = 20, 0.1
x0, y0, z0, w0, q0, k0 = 1, 3, 5, 8, 9, 2
u0 = 0
T, dt = 380, 0.01
...
# 调节 b
b =...
for n in range(1, len(times)):
    x[n] = x[n-1] + dt * (C*a*R*x[n-1]/(R*(k[n-1] + a*x[n-1] + y[n-1] + z[n-1] + w[n-1] + q[n-1]))*b - x[n-1])
    y[n] = y[n-1] + dt * (C*a*R*y[n-1]/(R*(k[n-1] + a*y[n-1] + x[n-1] + z[n-1] + w[n-1] + q[n-1]))*b - y[n-1])
    z[n] = z[n-1] + dt * (C*a*R*z[n-1]/(R*(k[n-1] + a*z[n-1] + x[n-1] + y[n-1] + w[n-1] + q[n-1]))*b - z[n-1])
    w[n] = w[n-1] + dt * (C*a*R*w[n-1]/(R*(k[n-1] + a*w[n-1] + x[n-1] + y[n-1] + z[n-1] + q[n-1]))*b - w[n-1])
    q[n] = q[n-1] + dt * (C*a*R*q[n-1]/(R*(k[n-1] + a*q[n-1] + x[n-1] + y[n-1] + z[n-1] + w[n-1]))*b - q[n-1])
    k[n] = k[n-1] + dt * (C*a*R*k[n-1]/(R*(q[n-1] + a*k[n-1] + x[n-1] + y[n-1] + z[n-1] + w[n-1])) - k[n-1])

    u[n] = (x[n] + y[n] + z[n] + w[n] + q[n])

集合 S 中有 x,y,z,w,q 一共 5 条 subflow,与共享瓶颈的另一条标准 bbr 流 k 参与公平收敛,目标是 k 线和 u 线重合。为简化调参过程,我用另一种方式模拟 k,即让其固定 inflight-in-buffer。

既然 C * R = 2,若公平共享,k 的 inflight-in-buffer 应为 1,于是用 B = 1 替换 k[…] * R:

x[n] = x[n-1] + dt * (C*a*R*x[n-1]/(B + R*(a*x[n-1] + y[n-1] + z[n-1] + w[n-1] + q[n-1]))*b-x[n-1])
...
k[n] = C*B / (R*(x[n] + y[n] + z[n] + w[n]) + B)

n = 2 时,b = 0.998,n = 5 时,b = 0.911,效果如下:

在这里插入图片描述

这意味着 D 随着 n 的增大在减小,需要设计一个减函数 0 < D(n) <= 1,但这是另一件事,方法也简单,先给出 n = 1,2,3,4,…,m 时得到的最佳 D,然后用一个函数拟合这些点即可,如果要空间换时间,就存储为静态表,以 n 为键查表。

具体到代码的修改,只需要修改一下以下片段:

static const int bbr_pacing_gain[] = {
        BBR_UNIT * 5 / 4,       /* probe for more available bw */
        BBR_UNIT * 3 / 4,       /* drain queue and/or yield bw to other flows */
        BBR_UNIT, BBR_UNIT, BBR_UNIT,   /* cruise at 1.0*bw to utilize pipe, */
        BBR_UNIT, BBR_UNIT, BBR_UNIT    /* without creating excess queue... */
};
...
... D(int n, int idx)
{
    if (idx < 2) return 1;
    ...
}
...
        case BBR_PROBE_BW:
                bbr->pacing_gain = (bbr->lt_use_bw ?
                                    BBR_UNIT :
                                    D(n, bbr->cycle_idx) * bbr_pacing_gain[bbr->cycle_idx]);
                bbr->cwnd_gain   = bbr_cwnd_gain;
                break;

如何将 n 传入 bbr不谈,核心难点是内核中如何处理 0.998,0.827 这种数字。所以我只做了仿真测试,没有真去修改内核的 bbr.c,因为搞不定。至于 bbr3 如何,原理一样。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Rigidbody 踩坑记录

1&#xff1a;两个带有刚体的物体碰撞会一直不停的弹 把被动受力的刚提的 Freeze Position 的勾选 去掉&#xff08;碰到过一次&#xff0c;有一种受力无法释放又返回给目标的 所以一直弹跳的感觉&#xff09; 2&#xff1a;子物体 和父物体 都有刚体的情况下 子物体 Freeze R…

WEB渗透Web突破篇-PHP文件包含下载读取

php任意文件读取/下载 readfile()、file_get_contents()、fopen()等读文件的函数不严谨&#xff0c;读取文件路径可控&#xff0c;输出内容。 下载配置文件 Redis、Weblogic、ftp、mysql、web配置文件、history文件、数据库配置文件 下载log文件 下载web文件 /1.php?f../../e…

C#实现数据采集系统-配置文件化

系统优化-配置 配置信息ip端口,还有点位信息,什么的都是直接在代码里直接写死,添加点位,修改配置,比较麻烦,每次修改都需要重新生成打包。 所以将这些配置都改成配置文件,这样只需要修改配置文件,程序无须修改,即可更新。 配置代码: 如果我们有100个采集,一个个去…

ReactiveStream

消息传递是响应式核心 ReactiveStream规范核心接口 ReactiveStream发布数据 发布者要保存订阅者 发布者要知道谁要拿他的数据&#xff0c;发布者要知道他把数据要给谁 reactive stream发布订阅的写法 subscribe订阅者 publish发布者 subscription 绑定关系 onXXX事件…

MySQL:基础增删查改

MySQL&#xff1a;基础增删查改 插入插入冲突 查询distinctwhereorder bylimit 删除deletetruncate 更新 插入 基本插入语法&#xff1a; insert [into] 表名 (列1, 列2 ...) values (值1, 值2 ...);into可以省略(列1, 列2 ...)与后面的(值1, 值2)一一对应如果插入时数据完全…

药明康德:头顶达摩克利斯之剑

头顶达摩克里斯之剑&#xff0c;CXO龙头——药明康德的日子好过吗&#xff1f; 在行业下行周期、美国法案阴霾压力之下&#xff0c;药明康德交出今年上半年的成绩单&#xff0c;营收净利双双下滑&#xff0c;净利润更是同比减少20.2%。 看起来情况糟糕&#xff0c;但显然让被法…

基于YOLOv8的船舶检测系统

基于YOLOv8的船舶检测系统 (价格85) 包含 【散货船&#xff0c;集装箱船&#xff0c;渔船&#xff0c;杂货船&#xff0c;矿砂船&#xff0c;客船】 6个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该…

【竞技宝】DOTA2雪如意:ame水人逆转 XG力克NAVI

北京时间2024年8月2日,DOTA2雪如意杯在昨天将迎来淘汰赛首个比赛日,本日一共进行四场比赛,第二场比赛由NAVI对阵XG。本场比赛双方前两局战至1-1平,决胜局XG前期局势很劣,但中期拖住局势等到了ame水人装备成型,最终XG2-1击败NAVI。以下是本场比赛的详细战报。 第一局: 首局比赛…

领夹无线麦克风哪个牌子好,麦克风哪个好,2024年无线麦克风推荐

​无论是采访、Vlog还是直播&#xff0c;清晰的音频录制都极为重要。作为一名有经验的自媒体人&#xff0c;我深知哪些无线领夹麦克风能够在不破坏预算的情况下提供出色的录音效果。以下是我个人推荐的几个高性能、低价位的无线领夹麦克风&#xff0c;它们将使你的音频录制更上…

深度学习,机器学习,强化学习

深度学习、机器学习、python、人工智能项目代做和指导答疑&#xff5e;擅长&#xff08;svm、罗辑回归、贝叶斯、决策树、xgboost等&#xff09;机器学习算法、各种opencv图像处理、图像分类模型&#xff08;vgg、resnet、mobilenet、efficientnet、densenet等&#xff09;、人…

协同作战:Axure 团队协作功能全解析

前言 在当今快节奏的数字产品开发领域&#xff0c;团队协作不仅是成功的关键&#xff0c;更是创新的催化剂。 Axure&#xff0c;作为一款领先的原型设计工具&#xff0c;其内置的团队协作功能为设计师、产品经理和开发人员提供了一个无缝的沟通和协作平台。 让我们一起探索这…

每日一题——贪心算法

1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 一开始有点理解错他的意思&#xff0c;以为是i是题目中会给出&#xff0c;所以一开始没有什么思路&#xff0c;然后当看了题解之后&#xff0c;就知道了原来i是自己订的&#xff0c…

【hloc】 项目流程

hloc 项目流程 1. 数据集准备2. 特征提取3. 匹配特征4. 三维重建5. 定位6. 结果评估7. 示例脚本 这个项目涉及到了视觉定位和三维重建的一系列步骤&#xff0c;从特征提取、匹配、三维重建到定位和结果评估。通过提供的脚本文件&#xff0c;用户可以方便地运行整个流程。 1. 数…

PLC-Recorder对于数据采集时间戳偏差的修正功能

目录 一、修正原理 二、使用步骤 1、初始状态&#xff0c;计算修正系数 2、启动和使用 3、修正系数的手动修改 三、修正前后的效果对比 1、修正前的时间偏差曲线 2、修正后的效果曲线 四、注意事项 1、控制器可能的时钟波动 2、平移参数评估 3、参数保存 五、关于…

红酒与夜晚:享受静谧的品酒时光

当夜幕低垂&#xff0c;星光点点&#xff0c;世界仿佛进入了一个宁静而神秘的领域。在这样的夜晚&#xff0c;与一瓶定制红酒洒派红酒&#xff08;Bold & Generous&#xff09;相伴&#xff0c;便是一场令人陶醉的品酒之旅&#xff0c;让人在静谧中感受生活的美好。 一、夜…

【深度学习】【语音TTS】OpenVoice: Versatile Instant Voice Cloning,论文

https://github.com/myshell-ai/OpenVoice https://arxiv.org/abs/2312.01479 文章目录 摘要1 引言2 方法2.1 直观思路2.2 模型结构2.3 训练细节3 结果4 结论摘要 我们介绍了OpenVoice,一种多功能的即时语音克隆方法,只需参考说话者的短音频片段即可复制其声音,并生成多语…

数据结构(7):查找

1 查找的基本概念 概念 常见操作 评价指标 平均查找长度&#xff01;&#xff01;&#xff01;&#xff01; ✖前面表示长度 后边表示个数! 处于的是总共的紫色的个数 总结 2 顺序查找、折半查找、分块查找 2.1 顺序查找 适用于线性表&#xff01; 正常代码 哨兵&#xff…

Java类和对象引入

目录 1.类与对象引入 2.类与对象关系示意图 3.类与对象的区别和联系 4.属性/成员变量 基本介绍 注意事项和细节说明 5.如何创建对象 先声明再创建 直接创建 6.如何访问属性 基本语法 7.类和对象的内存分配机制&#xff08;重要&#xff09; 案例演示&#xff…

string类的模拟实现(C++)

一、前言 想要模拟实现一个库中的类&#xff0c;那就要首先要熟悉如何使用这个类。建议通过下面博客&#xff0c;完成对Cstring类的学习。 C的string类-CSDN博客 二、模拟实现 我们将从string的成员函数即成员变量入手&#xff0c;模拟实现string类。 成员变量 string类的…

Spring Boot项目实现调用腾讯云进行人脸识别

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 背景 随着科技的不断发展&#xff0c;人脸识别技术已经成为了一种日益重要的身份验证和安全监控手段。腾讯云人脸识别功能便是其中之一&#xff0c;而Java语言又是现在最为常用且高效的编程语言之一。本篇论…