拥塞控制的自适应 AQM 探索

2024-05-27 22:28
文章标签 探索 控制 适应 拥塞 aqm

本文主要是介绍拥塞控制的自适应 AQM 探索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拥塞控制面临的几类问题:

  • 网络拥塞时,大象流如何为微突发让路;
  • 网络拥塞时,如何只惩罚造成拥塞的流量;
  • 网络拥塞时,如何确保小流量不受影响。

既然不想在 host 将流按照大小分类,嫌没意义,麻烦或看不上,那其实交换机一直在做这件事,比如优先级队列,加权公平队列,加权随机早期检测等,不管是物理交换机还是虚拟交换机,这几样肯定跑不了。

但那些队列和调度策略往往配置复杂,实现太重,且无法自适应流量特征的变化。

codel 是个好东西,fq_codel 更有点意思,自适应携带负反馈环,这个我喜欢。

linux 的 fq_codel 实现中在 enqueue 位置有个针对最长队列的 fq_codel_drop 操作,只在队列满载时执行,还是太粗糙。我后来在它基础上修改了一版,改动如下:

  • enqueue 队列长度超限后,在所有长度大于某个预设值的足够 fat 的 flow 中分担删除报文,flow 长度即分担权重(后面会提到一种预防重传风暴的情况,特意在同一个队列丢包,而不是分担)。

再后来,我增加了 dequeue 逻辑,就成了一个虚拟交换机的框架,它的原理如下:
在这里插入图片描述

在 dequeue 而不在 enqueue 做的理由如下:

  • enqueue 由不同的 ingress 端口(物理 or 虚拟)执行,执行复杂逻辑涉及 lock 过久问题;
  • enqueue 逻辑对大象流丢包会导致队列中的流长度反转,误伤中等流量。
  • dequeue 位置是个一致的并行 check 点。

另一个点,在每一次 dequeue 报文时,按概率删除报文追求的不仅仅是平滑,另一种看起来更简单的方式反而会造成颠簸,误伤良性流量,与上述不在 enqueue 做此逻辑的理由 2 一样。简单分析一下 why:
在这里插入图片描述

最后,谈谈该 aqm 的算法细节。

这种自适应策略可以逐渐让各 hash list 长度趋向一致,迫使各流量收敛到公平(如果端到端算法不主动收敛,aqm 会迫使它们收敛),但如果所有 hash list 长度都快速增加,且长度趋向一致,那就是遇到 incast 了,应尽力缓存而不是丢包,因此应该夹带以下逻辑:

  • 以均匀方差做指标切换策略,方差越大,越趋向丢包,方差越小,越趋向缓存;
  • 趋向缓存,但 buffer 不足,必须丢包时,尽量在同一个队列丢,防止重传 incast。

所以,这一切能否自适应?答案是肯定的。保存一个系数 a = (max_len - min_len) * (mid_len - avg_len) * avg_len:

  • 丢包概率计算时乘以 a 即可,hash 队列越畸变,丢包率越高,反之越平坦,丢包率越低;
  • enqueue 逻辑的队列 limit 改为动态计算,a 越小,说明有 incast 微突发,limit 就要越大,limit 做成 a 的负相关函数即可;
  • limit 越大,越倾向于在一个队列丢包,计算每队列丢包数量是要乘以 a 的负相关函数,a 越小,每队列丢包数量越多。

简单数学函数的威力无穷。

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

这篇关于拥塞控制的自适应 AQM 探索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008761

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中__new__()方法适应及注意事项详解

《Python中__new__()方法适应及注意事项详解》:本文主要介绍Python中__new__()方法适应及注意事项的相关资料,new()方法是Python中的一个特殊构造方法,用于在创建对... 目录前言基本用法返回值单例模式自定义对象创建注意事项总结前言new() 方法在 python 中是一个

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个