rate-based 拥塞控制吞吐测量

news2024/11/19 19:27:20

要点:一个方法无法精确刻画链路画像,就用多种方法组合刻画,设计一个 “自定义平均”。

当前 Linux kernel TCP 实现的 TCP delivery rate 测量机制(BBR 有使用到)如下图:
在这里插入图片描述

简略后可展示为下图:
在这里插入图片描述

详见 net/ipv4/tcp_rate.c(重点看 C 文件前面的注释,可省去看代码)。

这种方法有几个问题:

  1. 粒度为一个 round 滚动,在大 RTT 场景下无法观测到 round 内 RTT 细节。
  2. (如下图所示)很难捕捉流侵入瞬间的指标变化。

下图是一个良性流侵入前后的 case,流侵入后自觉排空 queue,RTT 重新收敛到传播时延,两条流均分带宽。但当前 Linux kernel TCP 的测量方法对待该 case 还是粒度过粗。
在这里插入图片描述
就更别提非良性流的侵入以及 incast 了。

在 漫谈拥塞控制: a Decade of Wasted Bandwidth? 一文中,我提到精确测量 delivery rate 的必要,要一个刻画 delivery rate 本身以及其变化的函数,而不仅是一种测量方法,换句话说,最终需要的是一幅链路画像。

上面提到的 Linux kernel 方法仅刻画一个 round 内的积累 delivery rate,记为 f(x),此处 x 为 kernel 函数 tcp_rate_gen 所需,除此之外还需要两类(暂时想到的,后续可能会更新)刻画手段一起做功。

刻画 round 内趋势的 g(x),如下图:
在这里插入图片描述
相当于在一个 or 几个 round 内做积累平均。

另外,还需要刻画 delivery date 瞬时变化的 h(x),如下图:
在这里插入图片描述
h(x) 体现的是 delivery rate or rtt 的梯度或者变化率。

最终的函数表达式如下:

T = alpha * f(x) + beta * g(x) + gamma * h(x)

其中 alpha + beta + gamma = 1 且 gamma > beta > alpha,gamma < alpha + beta。

f(x) 以 round 为粒度向前平滑滚动,g(x) 在一个或者几个 round 内平滑滚动,h(x) 间隔固定的足够小但又不至于样本不够的 delta(time) or delta(delivered) 捕捉细节,比如类似 bbr 那般 x rounds 的 win,三者合力刻画链路画像。

如果在稳定状态,f(x) = g(x) = h(x),T = f(x),与当前 Linux kernel 无异。

如果有侵入流变化导致 RTT 变化,h(x) 会迅速捕捉到,由于 gamma 比重大,h(x) 会迅速反应到 T 上。

如果 RTT 上下剧烈波动,由于 gamma < alpha + beta,f(x) 和 g(x) 会联合平滑 h(x),使 T 趋于平稳。

如果 RTT 在 round 内部发生持续变化且 RTT 较大,g(x) 会有所体现,且跨越 round 的变化又会被 f(x) 平滑。

总之,对结果做算术,不对过程做算术。

Linux kernel TCP 测量方式对测量过程做了 round 滚动平均的过程,这不合适,合适的做法是先把尽量采集精确样本,再采用算术方式计算结果。本文所示的 T 表达式只是我能想到的一种,换句话说,有没有能力处理样本是策略问题,能不能采集到精确样本是机制问题,机制先确定了,策略可以慢慢磨。

rate-based 算法主要目标是测量 delivery rate,识别拥塞并主导 pacing rate 而不是计算 cwnd,cwnd 仅作限制 in-flight,因此再精细的计算粒度也不足为过,也就不用纠结非整数的计算结果(比如 42.37 个 cwnd 的处理)了。

与传统 loss-based 算法不同,rate-based 算法实际的 delivery rate 测量结果无法作为一个边沿触发的 event,它更像一种水平触发的数据输出,而非一种状态。对 delivery rate 的反应是连续的过程而非一个固定的动作,如何设计这个连续的过程是 rate-based 算法的难点,好的算法应既能敏锐识别拥塞,又能过滤噪声,二者的矛盾本质意味着算法注定要在一个 buffer 上展开,为误判保留回退余地,BBR 状态机便是这样一个实例。

皮鞋没有蹬上,露着白袜子。

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

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

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

相关文章

unity3d:功能验证,收集开源项目的工程合集

unity3d功能验证&#xff0c;和收集开源项目的工程合集 目录持续更新地址 【腾讯文档】UnityForTest目录 https://docs.qq.com/doc/DWm9HSkVhTGdyUUVo 源码 https://github.com/luoyikun/UnityForTest 动画 创建骨骼动画 BoneAnimation场景 代码创建Mesh&#xff0c;骨骼…

疑问:相同Service ID、不同Instance ID的SOME/IP服务如何被使用?

这是我的一个疑问&#xff0c;向各位朋友请教&#xff0c;请帮忙留意回复一下&#xff0c;感谢&#xff01; 在SOME/IP中&#xff0c;Service ID是用来识别和标记哪个服务&#xff0c;Instance ID是用来识别和标记某个服务的哪个实例。 既然是相同的服务&#xff0c;这个服务…

【vue2第八章】工程化开发和使用脚手架和文件结构

vue工程化开发 & 使用脚手架VUE CLI&#xff1a; 1&#xff0c;核心包传统开发模式&#xff1a;基于js/html/css直接引入核心包开发vue。 2&#xff0c;工程化开发。基于构建工具如(webpack)的环境中开发vue。 vue cli是什么&#xff1a; vue cli是一个vue官方提供的一个…

解决springboot项目中的groupId、package或路径的混淆问题

对于像我一样喜欢跳跃着学习的聪明人来说&#xff0c;肯定要学springboot&#xff0c;什么sevlet、maven、java基础&#xff0c;都太老土了&#xff0c;用不到就不学。所以古代的聪明人有句话叫“书到用时方恨少”&#xff0c;测试开源项目时&#xff0c;编译总是报错&#xff…

PCFE-GNNs

计算数据预训练后再用实验数据微调&#xff0c;预测 logD7.4&#xff0c;代码&#xff1a;PCFE-GNNs&#xff0c;原文&#xff1a;Improved GNNs for Log D7.4 Prediction by Transferring Knowledge from Low-Fidelity Data&#xff0c;代码解析继续downstream_task。模型框架…

Redis之bigkey问题解读

目录 什么是bigkey&#xff1f; bigkey引发的问题 如何查找bigkey redis-cli --bigkeys MEMORY USAGE bigKey如何删除 渐进式删除 unlink bigKey生产调优 什么是bigkey&#xff1f; bigkey简单来说就是存储本身的key值空间太大&#xff0c;或者hash&#xff0c;list&…

如何排查 Flink Checkpoint 失败问题?

分析&回答 这是 Flink 相关工作中最常出现的问题&#xff0c;值得大家搞明白。 1. 先找到超时的subtask序号 图有点问题&#xff0c;因为都是成功没失败的&#xff0c;尴尬了。 借图&#xff1a; 2. 找到对应的机器和任务 方法很多&#xff0c;这里看自己习惯和公司提供…

小白学Go 基础02-了解Go语言的诞生与演进

Go语言诞生于何时&#xff1f;它的最初设计者是谁&#xff1f;它为什么被命名为Go&#xff1f;它的设计目标是什么&#xff1f;它如今发展得怎么样&#xff1f;带着这些问题&#xff0c;我们一起穿越时空&#xff0c;回到2007年9月Go语言诞生的那一历史时刻吧。 Go语言的诞生 …

视频集中存储/云存储/磁盘阵列/视频监控管理平台EasyCVR接入海康SDK后视频播放崩溃的问题排查

视频集中存储/云存储/磁盘阵列/视频监控管理平台EasyCVR可支持海量视频的轻量化接入与汇聚管理。在视频能力上&#xff0c;EasyCVR可实现视频直播、云端录像、检索与回放、云存储、告警上报、语音对讲、电子地图、H.265视频自动转码、服务器集群、AI智能分析接入以及平台级联等…

视频监控/视频汇聚/安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?

视频监控/视频汇聚/安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频云存储EasyCVR平台能在复…

Leetcode19 删除链表指定节点

思路&#xff1a;用列表保存链表&#xff0c;然后分情况讨论。 class Solution:def removeNthFromEnd(self, head, n: int):node_list[head]while head.next:headhead.nextnode_list.append(head)remove_loclen(node_list)-n#要移除的位置if len(node_list)1:return Noneif re…

【Unity】URP屏幕后处理UI模糊效果实现

这里Canvas(1)设置为Overlay能渲染出指定UI高清&#xff0c;其他UI模糊&#xff0c;然而这做法非常不好&#xff0c;如果此时再打开UI 以及 关闭模糊效果 要将这些置顶UI 恢复到原本Canvas里&#xff0c;也就是要管理2套Canvas using System; using System.Collections; using…

Flink 如何处理反压?

分析&回答 什么是反压&#xff08;backpressure&#xff09; 反压通常是从某个节点传导至数据源并降低数据源&#xff08;比如 Kafka consumer&#xff09;的摄入速率。反压意味着数据管道中某个节点成为瓶颈&#xff0c;处理速率跟不上上游发送数据的速率&#xff0c;而…

15种下载文件的方法文件下载方法汇总超大文件下载

15种下载文件的方法&文件下载方法汇总&超大文件下载 15种下载文件的方法Pentesters经常将文件上传到受感染的盒子以帮助进行权限提升&#xff0c;或者保持在计算机上的存在。本博客将介绍将文件从您的计算机移动到受感染系统的15种不同方法。对于那些在盒子上存在且需要…

【java】解决sprintboot项目开发遇到的问题

目录 一、java: 程序包org.junit.jupiter.api不存在 二、Cannot resolve com.mysql:mysql-connector-j:unknown 三、Unsatisfied dependency expressed through bean property sqlSessionFactory; nested exception is org.springframework 四、org.apache.ibatis.binding…

SpringCloudAlibaba常用操作

SpringCloudAlibaba常用操作 微服务概念 1.1 单体、分布式、集群 单体 ⼀个系统业务量很⼩的时候所有的代码都放在⼀个项⽬中就好了&#xff0c;然后这个项⽬部署在⼀台服务器上就 好了。整个项⽬所有的服务都由这台服务器提供。这就是单机结构。 单体应⽤开发简单,部署测试…

mvc 异常处理源码解析(3)

目录 准备源码跟踪ExceptionHandlerExceptionResolver初始化ExceptionHandlerExceptionResolver注入ExceptionHandlerExceptionResolver中exceptionHandlerAdviceCache初始化ExceptionHandlerMethodResolver中mappedMethods初始化 结尾 准备 准备一个controller类, 里面抛出一…

Revit SDK 介绍:CreateAirHandler 创建户式风管机

前言 这个例子介绍如何通过 API 创建一个户式风管机族的内容&#xff0c;包含几何和接头。 内容 效果 核心逻辑 必须打开机械设备的族模板创建几何实体来表示风管机创建风机的接头 创建几何实体来表示风管机 例子中创建了多个拉伸&#xff0c;下面仅截取一段代码&#xff…

OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色

glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法&#xff1a; void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *da…

LeetCode——字母异位词分组(中等)

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&quo…