令牌桶算法理解学习(限流算法)

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

用简单的话语来说就是限制流量,将其控制到某一平均值稳定输出,并可以在短时间内应对高额流量(短时高速率流量)的一种方法。

需要注意的是,限速只是让他尽可能速率一致,是存在速率不稳定的情况的,只有在长期来看速率才是恒定的,而当令牌桶应对突发流量时会进行令牌桶内令牌的小号,理论上的峰值速率=令牌桶的容量+恒定速率,举个例子,令牌桶的容量 为100MB,限制的速率为10MB/s,峰值速率则可以达到100+10=110MB/s。

 

 b为桶的容量,r为单位时间内放入的令牌数量,以下图为例:

在r=10,b=5时,即表明每1/r=0.1,每0.1秒投入一个令牌,而在到0.5秒时达到桶的极限容量5,在此刻继续投入令牌则无法维持,这些令牌将会被废弃,同时在此时若有5个指令同时想要去走令牌则可以同时取走令牌桶内的所有令牌,即为取走b=5个。

注意

  1. 当b>1时(桶的大小大于1个令牌时),任意1/r秒内最多可以取走b个令牌;
  2. 而当b=1时(桶的大小就是1),每秒钟最多可以被取走r个令牌。

综上,令牌桶算法的总体流程大致分为如下三步:

  1. 将令牌放入桶内:按照固定的速率放入令牌桶内,例如r=10,20,100等;
  2. 获取令牌:任意请求只有在取得可用令牌才会被接收处理;
  3. 令牌桶已满:当桶内令牌已满时,新加入的令牌会被丢弃或者拒绝接收。

与网络带宽分配相结合,可在一定程度上减少资源的浪费,同时可以根据不同优先级的业务来进行基于令牌桶的带宽分配改进方式,针对不同优先级的业务设定不同的业务权值,以此来自适应业务速率的变化,可通过业务权值的占用比例进行动态分配令牌资源,利用令牌桶嵌入漏桶机制实现对业务占用的带宽进行二次分配,根据业务优先级的高低对溢出的令牌实现依次填充,从而减少资源浪费。(源自论文:基于动态令牌桶的卫星网络带宽分配方法)

卫星网络模型:一个GEO卫星,若干地面终端和网络控制中心NCC(Network Control Center)组成,地面终端则是经由SG(Satallite Gateway)连接到Internet网络。通过网络控制中心NCC来进行处理各个SG发来的带宽申请和分配新的贷款,上行链路由各个SG提供,下行链路则是数据流共享的信道。

GEO卫星网络 

令牌桶方法实现:令牌桶的填充速率R,令牌桶容量S(令牌桶所能容纳的最大令牌数),令牌桶的当前状态为x,表示当前对应令牌桶的深度,工作流程如下图:

工作流程上,GEO卫星上的带宽资源被定义为n个令牌桶,当有业务传达到时,NCC处理由SG为每个业务发送的带宽请求并为其分配带宽,哥哥令牌桶为每个业务分配基本保证带宽,即为R1,R2,R3......Rn。调整R1,R2,R3......Rn的大小可以设定各个业务的保证带宽,需要注意,各个令牌桶的尺寸小于链路的信道容量,各个业务到达相应令牌桶后,根据数据包长度与令牌桶内数量来进行分配,若数据包长度小于令牌数,业务传送出去,令牌桶内令牌相应减少。而高优先级的业务将会优先进行放入。而由于令牌桶间仙姑独立,令牌桶无法动态借用空闲令牌,即空闲带宽无法进行有效利用,且令牌桶在填充过程中,令牌个数不会大于令牌桶容量,溢出令牌会丢失,也进一步造成了带宽资源的浪费

改进方法:将漏桶嵌入到令牌桶中,即每一个令牌桶连接一个漏桶,有几个优先级就有几个令牌桶。这样可以保证优先级为n的最小带宽,溢出桶用来存储溢出的令牌,借用令牌桶的动态带宽分配算法(Dynamic Bandwidth Allocation Algorithm with Token Bucket,DBAATB),原理下图:

 代码实现

acquire获取令牌的操作中,使用锁保护数据正确性,使用条件等待令牌足够才继续往下执行。

bool CountSemaphore::acquire(unsigned long long count)
{std::unique_lock<std::mutex> lck(m_mtx);if (count > m_maxCount){return false;}m_cv.wait(lck, [&]() -> bool { return m_updateCount >= count; });m_updateCount -= count;return true;
}

release增加令牌数量,并通知其他等待条件的线程继续执行。

void CountSemaphore::release(unsigned long long count){std::unique_lock<std::mutex> lck(m_mtx);auto tobeCount = m_updateCount + count;if (tobeCount > m_maxCount){m_updateCount = m_maxCount;}else{m_updateCount = tobeCount;}m_cv.notify_all();
}

TokenSpeedLimiter是令牌桶的封装。包含令牌桶的限速速度,令牌的投递时间间隔和令牌桶的容量。提供开始和结束投递操作和获取令牌的操作。

void TokenSpeedLimiter::workingThread()
{auto lastTime = std::chrono::steady_clock::now();while (m_runing){// 延时定时投递std::this_thread::sleep_for(std::chrono::milliseconds(m_deliveryIntervalMs));// 计算投递时间差auto curTime = std::chrono::steady_clock::now();auto elapsedMs = std::chrono::duration<double, std::milli>(curTime - lastTime).count();lastTime = curTime;// 根据时间差计算投递令牌的数量(除以1000换算成毫秒投递数量,然后再乘以毫秒时间差)auto tokens = m_limitSpeed * elapsedMs / 1000;// 投递令牌m_semaphore.release((unsigned long long)tokens);}
}

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

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

相关文章

【媒体开发】利用FFMPEG进行推拉流

1. 下载并启动媒体服务 MediaMTX&#xff0c;也即之前的rtsp-simple-server&#xff0c;是一个即用型、零依赖的实时媒体服务器和媒体代理&#xff0c;允许发布、读取、代理和记录视频和音频流。 从Releases bluenviron/mediamtx GitHub找到最新版&#xff0c;下载对应平台…

FPGA高端项目:UltraScale GTH + SDI 视频解码,SDI转DP输出,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 GT 高速接口解决方案我目前已有的SDI编解码方案 3、详细设计方案设计框图3G-SDI摄像头LMH0384均衡EQUltraScale GTH 的SDI模式应用UltraScale GTH 基本结构参考时钟的选择和分配UltraScale GTH 发送和接收处理流程UltraScale…

Windows汇编调用printf

VS2022 汇编 项目右键 生成依赖项 生成自定义 勾选masm 链接器 高级 入口点 main X86 .686 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.libEXTERN printf:proc.data szFormat db %s,0 szStr db hello,0.code main…

[LeetCode周赛复盘] 第 375 场周赛20231210

[LeetCode周赛复盘] 第 375 场周赛20231210 一、本周周赛总结100143. 统计已测试设备1. 题目描述2. 思路分析3. 代码实现 100155. 双模幂运算1. 题目描述2. 思路分析3. 代码实现 100137. 统计最大元素出现至少 K 次的子数组1. 题目描述2. 思路分析3. 代码实现 100136. 统计好分…

仿交易猫转转闲鱼链接三合一源码+独立后台生成链接

高仿交易猫转转闲鱼源码 搭建教程:添加网站→上传源码→解压源码→导入数据库→修改数据库路径config/Conn.php 不用设置什么伪静态 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

Nacos源码解读12——Nacos中长连接的实现

短连接 VS 长连接 什么是短连接 客户端和服务器每进行一次HTTP操作&#xff0c;就建立一次连接&#xff0c;任务结束就中断连接。 长连接 客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭&#xff0c;客户端再次访问这个服务器时&#xff0c;会继续使用这一条已经建立…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

STM32F103时钟树

STM32芯片时钟来源 RCC时钟树简图 RCC时钟树详细图 1&#xff0e;当HSI被用于作为PLL时钟的输入时&#xff0c;系统时钟能得到的最大频率是64MHz。 2&#xff0e;用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和 APB2域的最大频率是72MHz。APB1域…

智能优化算法应用:基于樽海鞘群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于樽海鞘群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于樽海鞘群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.樽海鞘群算法4.实验参数设定5.算法结果6.…

Flutter自定义下拉选择框dropDownMenu

利用PopupMenuButton和PopupMenuItem写了个下拉选择框&#xff0c;之所以不采用系统的&#xff0c;是因为自定义的更能适配项目需求&#xff0c;话不多说&#xff0c;直接看效果 下面直接贴出代码、代码中注释写的都很清楚&#xff0c;使用起来应该很方便&#xff0c;如果有任何…

Diffusion Models: A Comprehensive Survey of Methods and Applications

摘要 扩散模型作为一个强大的新的深度生成模型系列出现&#xff0c;在许多应用中具有破纪录的性能&#xff0c;包括图像合成、视频生成和分子设计。在这项调查中&#xff0c;我们对迅速扩大的扩散模型的工作进行了概述&#xff0c;将研究分为三个关键领域&#xff1a;有效采样…