多路径 bbr mpbbr 公平性推演

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.rhkb.cn/news/389264.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SX_初识GitLab_1

1、对GitLab的理解&#xff1a; 目前对GitLab的理解是其本质是一个远程代码托管平台&#xff0c;上面托管多个项目&#xff0c;每个项目都有一个master主分支和若干其他分支&#xff0c;远程代码能下载到本机&#xff0c;本机代码也能上传到远程平台 1.分支的作用&#xff1a…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…

JAVA基础 - 反射

目录 一. 简介 二. java.lang.Class类 三. java.lang.reflect包 四. 创建对象 五. 调用方法 六. 调用成员变量 一. 简介 反射是 Java 语言中的一种强大机制&#xff0c;允许程序在运行时动态地获取类的信息、访问类的成员&#xff08;包括字段、方法和构造函数&#xff…

Tomato靶机攻略

1、启动靶机 2、通过nmap -sA 192.168.168.0/24得到靶机IP 3、扫描目录 用dirb http://192.168.49.128扫描敏感目录 4、访问敏感目录 5、通过查看源码&#xff0c;发现其存在文件包含漏洞&#xff0c;利用该漏洞查看日志文件 http://192.168.168.131/antibot_image/antibots/…

gitee的fork

通过fork操作&#xff0c;可以复制小组队长的库。通过复制出一模一样的库&#xff0c;先在自己的库修改&#xff0c;最后提交给队长&#xff0c;队长审核通过就可以把你做的那一份也添加入库 在这fork复制一份到你自己的仓库&#xff0c;一般和这个项目同名 现在你有了自己的库…

vue2以及vue3基于el-table实现表格正则校验功能

常见需求&#xff1a; 在项目中&#xff0c;通常会在表格中添加多条数据&#xff0c;并需要对添加的数据进行校验功能&#xff0c;这时候就是很头疼的事了&#xff0c;下面酱酱仔给你们写个示例&#xff0c;你们无脑粘贴复制即可。 注意事项&#xff1a; 1、校验里面用到了正…

【Unity】3D功能开发入门系列(一)

Unity3D功能开发入门系列&#xff08;一&#xff09; 一、开发环境&#xff08;一&#xff09;安装 Unity&#xff08;二&#xff09;创建项目&#xff08;三&#xff09;Unity 窗口布局 二、场景与视图&#xff08;一&#xff09;场景&#xff08;二&#xff09;游戏物体&…

前端日历插件VCalendar

官网地址 API | VCalendar 1.安装 yarn add v-calendarnext popperjs/core 2.全局引入 mian.js //日历插件 import VCalendar from v-calendar; import v-calendar/style.css;app.use(VCalendar); 3.使用 <div><VCalendar reservationTime expanded borderless…

java各种锁有什么区别

Java 虚拟机&#xff08;JVM&#xff09;中有几种不同类型的锁&#xff0c;每种锁都有其特定的用途和性能特点。下面我将为你介绍几种常见的锁&#xff1a; 1.独占锁&#xff08;也称为悲观锁&#xff09;&#xff1a; 1.synchronized&#xff1a;这是 Java 提供的一种内置的独…

股指期货的套利策略存在哪些风险?

股指期货套利的交易策略。它能够纠正市场上不合理的价格偏差&#xff0c;将价格拉回到正常的轨道。套利交易以其稳健的收益吸引着投资者&#xff0c;但同时也容易让人陷入一个误区——认为套利是无风险的。实际上&#xff0c;套利同样存在风险&#xff0c;只是相对于纯粹的投机…

问题易如反掌?5个常用的AI人工智能助手推荐

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 如今的人工智能技术正以惊人的速度改变着我们的生活方式和工作方式。作为这一变革的关键驱动力&#xff0c;人工智能不仅在科技…

短剧CPS分销系统框架+资源对接是怎么对接的?

目录 前言&#xff1a; 一、前端uniapp内容有什么&#xff1f; 二、后台管理 三、搭建CPS需要准备什么&#xff1f; 总结&#xff1a; 前言&#xff1a; 目前短剧目前在国内是非常的热门&#xff0c;观看的人群非常的多。如果希望能够通过推广短剧来做副业的话&#xff0c…

深入理解PreparedStatement

预处理 Overridepublic boolean login(String username, String userpwd) {Connection con DBUtils.getConnection();try {if(con ! null){PreparedStatement pstmt con.prepareStatement("select username,userpwd from " " users where username? and us…

硬核!288页Python核心知识笔记(附思维导图,建议收藏)

不少朋友在学习Python时&#xff0c;都会做大量的笔记&#xff0c;随着学习进度的增加&#xff0c;笔记越来越厚&#xff0c;但有效内容反而越来越少。 今天就给大家分享一份288页Python核心知识笔记&#xff0c;相较于部分朋友乱糟糟的笔记&#xff0c;这份笔记更够系统地总结…

【Vue3】具名插槽

【Vue3】具名插槽 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…

AcWingTrie树

字典树的应用背景&#xff1a; 看以下几个题: 1、给出n个单词和m个询问&#xff0c;每次询问一个单词&#xff0c;回答这个单词是否在单词表中出现过 答:简单!map&#xff0c;短小精悍。 好。下一个 每次询问一个前缀&#xff0c;回答询问是多少个单词的前缀。2、给出n个单词和…

零基础入门转录组数据分析——机器学习算法之boruta(训练模型)

零基础入门转录组数据分析——机器学习算法之boruta&#xff08;训练模型&#xff09; 目录 零基础入门转录组数据分析——机器学习算法之boruta&#xff08;训练模型&#xff09;1. boruta基础知识2. boruta&#xff08;Rstudio&#xff09;——代码实操2. 1 数据处理2. 2 构建…

【SQL Server】默认端口与自定义端口

目录 第4章&#xff1a;默认端口与自定义端口 SQL Server 默认端口号 更改 SQL Server 端口号 使用自定义端口的好处 示例&#xff1a;更改 SQL Server 端口为 1434 示例代码&#xff1a;更新连接字符串 安全注意事项 第4章&#xff1a;默认端口与自定义端口 SQL Serve…