贵港网站制作,wordpress数据库文件导入,建网站的目的是什么,网站怎么换域名令牌桶算法是网络流量整形#xff08;Traffic Shaping#xff09;和速率限制#xff08;Rate Limiting#xff09;中最常使用的一种算法。典型情况下#xff0c;令牌桶算法用来控制发送到网络上的数据的数目#xff0c;并允许突发数据的发送。
用简单的话语来说就是限制…令牌桶算法是网络流量整形Traffic Shaping和速率限制Rate Limiting中最常使用的一种算法。典型情况下令牌桶算法用来控制发送到网络上的数据的数目并允许突发数据的发送。
用简单的话语来说就是限制流量将其控制到某一平均值稳定输出并可以在短时间内应对高额流量短时高速率流量的一种方法。
需要注意的是限速只是让他尽可能速率一致是存在速率不稳定的情况的只有在长期来看速率才是恒定的而当令牌桶应对突发流量时会进行令牌桶内令牌的小号理论上的峰值速率令牌桶的容量恒定速率举个例子令牌桶的容量 为100MB限制的速率为10MB/s峰值速率则可以达到10010110MB/s。 b为桶的容量r为单位时间内放入的令牌数量以下图为例 在r10b5时即表明每1/r0.1每0.1秒投入一个令牌而在到0.5秒时达到桶的极限容量5在此刻继续投入令牌则无法维持这些令牌将会被废弃同时在此时若有5个指令同时想要去走令牌则可以同时取走令牌桶内的所有令牌即为取走b5个。 注意 当b1时桶的大小大于1个令牌时任意1/r秒内最多可以取走b个令牌而当b1时桶的大小就是1每秒钟最多可以被取走r个令牌。 综上令牌桶算法的总体流程大致分为如下三步
将令牌放入桶内按照固定的速率放入令牌桶内例如r1020100等获取令牌任意请求只有在取得可用令牌才会被接收处理令牌桶已满当桶内令牌已满时新加入的令牌会被丢弃或者拒绝接收。 与网络带宽分配相结合可在一定程度上减少资源的浪费同时可以根据不同优先级的业务来进行基于令牌桶的带宽分配改进方式针对不同优先级的业务设定不同的业务权值以此来自适应业务速率的变化可通过业务权值的占用比例进行动态分配令牌资源利用令牌桶嵌入漏桶机制实现对业务占用的带宽进行二次分配,根据业务优先级的高低对溢出的令牌实现依次填充,从而减少资源浪费。源自论文基于动态令牌桶的卫星网络带宽分配方法 卫星网络模型一个GEO卫星若干地面终端和网络控制中心NCCNetwork Control Center组成地面终端则是经由SGSatallite 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_lockstd::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_lockstd::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::durationdouble, std::milli(curTime - lastTime).count();lastTime curTime;// 根据时间差计算投递令牌的数量(除以1000换算成毫秒投递数量然后再乘以毫秒时间差)auto tokens m_limitSpeed * elapsedMs / 1000;// 投递令牌m_semaphore.release((unsigned long long)tokens);}
}