QOS令牌桶算法

1.什么是令牌桶算法

当数据流到达设备时首先会根据数据的大小从令牌桶中取出与数据大小相当的令牌数量用来传输数据。也就是说要使数据被传输必须保证令牌桶里有足够多的令牌,如果令牌数量不够,则数据会被丢弃或缓存。这就可以限制报文的流量只能小于等于令牌生成的速度,达到限制流量的目的

2. 令牌桶术语

令牌桶参数

  • CBSCommitted Burst Size):承诺突发尺寸,表示C桶的容量,即C桶瞬间能够通过的承诺突发流量
  • EBS(Extended burst size):超额突发尺寸,表示E桶的容量,即E桶瞬间能够通过的超出突发流量
  • PBS(Peak Burst Size):峰值突发尺寸,表示P桶的容量,即P桶瞬间能够通过的超出突发流量

信息速率

  • CIR (Committed Information Rate):承诺信息速率,向C桶中注入令牌的速率,同时也是C桶允许传输或转发数据的平均速率,单位bit/s
  • PIR(peak Information Rate):峰值信息速率,向P桶中注入令牌的速率,同时也是P桶允许传输或转发数据的平均速率,单位bit/s

令牌的数量

Tc:表示C桶中的当前令牌数量,单位为个

Te:表示E桶中的当前令牌数量,单位为个

根据桶中当前令牌是否满足数据转发需要而定义的颜色标识,它是模型描述时对分类的数据的颜色定义,将能从桶中取走足量令牌的报文标记为绿色或黄色,而将未能在桶中获得足量令牌的报文,标记为红色

3.单速率流量的评估标准

色盲模式下

  • 单速单桶
  • 单速双桶

色敏模式下

  • 单速单桶
  • 单速双桶

色盲模式的话是对到达的报文进行评估,评估完成后在标记上颜色,而色敏模式的话是报文进来的时候就标记上颜色了,本文的话主要是将色盲模式

4.单速单桶模式双色模型

单桶模式的话由一个桶实现,称为C桶,桶的容量为CBS,单速单桶中,报文只标记为绿、红两色

  • 为方便用TcTe表示桶中的令牌数量,TcTe初始化等于CBSEBS
  • 假设报文大小为B

工作原理: 桶中令牌以承诺的恒定速率CIR注入,桶大小固定,当注入令牌超出桶的容量后,多余的令牌就被丢弃掉。对于到达的报文,图上图中用B表示报文的大小

  1. 如果报文长度不超过C桶中的令牌数Tc,则报文被标记为绿色,且Tc=Tc-B
  2. 如果报文长度超过C桶中的令牌数Tc,报文被标记为红色,Tc值不变。

工作过程:若桶中有令牌,数据包转发会消耗桶中的令牌,若令牌足量,满足报文转发需要的数量,则报文被标记为绿色,并在桶中取走等量令牌。进行正常转发。若待转发报文在桶中得不到足够令牌则标记为红色,桶中令牌不减,报文将执行丢弃的操作

例如:

若当前C桶中有1000个令牌,有2份待转发数据报文,大小分别为800B和500B。假设此期间没有令牌注入,当第一份数据报文和C桶内令牌进行比较时,令牌满足,则第一份报文转发出去,桶中令牌剩余为200个。而第二份报文需要500个令牌,令牌桶中令牌不够,这份报文被标记为红色,不被转发出去,令牌桶中令牌量不变化,单速单桶的模型因其仅以承诺速率CIR注入令牌到C桶,所以C桶中令牌是承诺的令牌

5.单速双桶模式三色模型


双桶结构由两个桶实现,为方便将两个令牌桶称为C桶和E桶。C桶容量为CBSE桶容量为EBS,总容量是CBS+EBS。如果不允许有突发流量,EBS则设置成0。当EBS≠0时,称为单速双桶,双桶的设计也是为了在上一时刻没有数据转发导致C桶中的令牌还有剩余,防止下一时刻注入的时候溢出导致浪费的情况设置的

对于到达的报文,使用B表示

工作原理:

  • 如果报文长度不超过C桶中的令牌数Tc,则报文被标记为绿色,且Tc=Tc-B
  • 如果报文长度超过C桶中的令牌数Tc但不超过E桶中的令牌数Te,则报文被标记为黄色,且Te=Te-B
  • 如果报文长度超过E桶中的令牌数Te,报文被标记为红色,但TcTe不变

工作过程:

报文转发时,先从承诺的C桶中取令牌,如果令牌够,则标记报文为绿色,桶中令牌减少。若C桶中令牌不够(Tc<B), 则继续比较E桶令牌。若E桶令牌够,则标记报文为黄色,否则为红色

举例:

若C桶当前令牌为1000,E桶令牌为800,待转发数据报文有3份,大小分别为800B、 500B、 400B,假设3份报文在转发过程中没有令牌注入。根据上面的逻辑,第一份报文同C桶比较,令牌满足,标记为绿色,此时令牌桶C剩余令牌为200,令牌桶E令牌依然为800。 第二份报文需要500个令牌,C桶承诺部分不够,则使用E桶令牌,E桶部分是累积起来的令牌,第二份报文使用E桶令牌,并标记为黄色,E桶剩余令牌300。第三份报文在C桶和E桶都没有足量的令牌,所以标记为红色,双桶模型由于EBS桶的存在,因此流量可以在承诺的CIR速率基础上过量突发,在某时刻速率可以达到很高。由于前一时刻数据量低,令牌没有使用,因此在下一时刻有过量突发所致的流量过高

6. 双速双桶模式三色模型

初始状态时两桶是满的。往C桶和P桶分别以CIRPIR的速率填充令牌。因这两个令牌桶是相互独立的,当其中一个桶被填满时,这个桶新产生的令牌将会被丢弃,另一个桶继续填令牌,“双速率”是指该算法中两个令牌桶中的令牌填充速率不同

工作原理:

  • 如果报文长度超过P桶中的令牌数Tp,则报文被标记为红色,且TcTp保持不变
  • 如果报文长度不超过P桶中的令牌数Tp但超过C桶中的令牌数Tc,则报文被标记为黄色,且Tp=Tp-B
  • 如果报文长度不超过C桶中的令牌数Tc,报文被标记为绿色,且Tp=Tp-BTc=Tc-B

工作流程:P桶和C桶都是独立注入令牌的,如果桶中令牌溢出,并不会装入到另一个桶里。PIR是峰值速率,CIR是承诺速率,此模型可保证当输入数据的速率超出PIR时,超出部分将被丢弃,而低于PIR部分的报文,高于CIR的部分被标记为黄色,低于CIR部分被标记为绿色。所以待转发的报文先和P桶比较,若P桶令牌不够,则标记为红色,令牌不减。而若P桶令牌够,则继续比较C桶令牌,仅当二者令牌都够时,都做等量相减,此模型能解决单速双桶模型中因E桶的原因而致的流量过量突发而引起的速率波动幅度的不确定性,所以对最高的速率做了限制,如果该模型应用在数据转发的场景下,它使实际数据包的转发速率达到PIR,这往往致企业边缘设备流出的报文速率过高,而上游运营商处丢掉超出CIR的部分流量

举例:

P桶令牌为1000,C桶令牌为700,待转发报文有3份,大小分别为800B、500B、200B,第一份报文和P桶比较,令牌够,继续和C桶比较,C桶不够。第一份转发出去,P桶剩余令牌200,C桶令牌没变化,为700且报文被标记为黄色。第二份报文大小为500,先和P桶比较,因P桶令牌不够而标记为红色,桶内令牌不变。第三份报文先和P桶比较,再和C桶比较。都满足则都减令牌,并标记为绿色,P 桶剩余0, C桶剩余500

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用CloudSim实现基于多维QoS的资源调度算法的示例代码: ```java import org.cloudbus.cloudsim.Cloudlet; import org.cloudbus.cloudsim.CloudletSchedulerSpaceShared; import org.cloudbus.cloudsim.Datacenter; import org.cloudbus.cloudsim.DatacenterBroker; import org.cloudbus.cloudsim.DatacenterCharacteristics; import org.cloudbus.cloudsim.Host; import org.cloudbus.cloudsim.Pe; import org.cloudbus.cloudsim.Storage; import org.cloudbus.cloudsim.Vm; import org.cloudbus.cloudsim.VmAllocationPolicySimple; import org.cloudbus.cloudsim.core.CloudSim; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class QoSResourceScheduling { public static void main(String[] args) { int numBrokers = 1; // 创建一个代理商 Calendar calendar = Calendar.getInstance(); boolean traceFlag = false; // 关闭日志跟踪 CloudSim.init(numBrokers, calendar, traceFlag); Datacenter datacenter = createDatacenter("Datacenter_0"); DatacenterBroker broker = createBroker(); int brokerId = broker.getId(); List<Vm> vms = createVms(brokerId); List<Cloudlet> cloudlets = createCloudlets(brokerId); broker.submitVmList(vms); broker.submitCloudletList(cloudlets); CloudSim.startSimulation(); List<Cloudlet> finishedCloudlets = broker.getCloudletReceivedList(); CloudSim.stopSimulation(); printCloudletResults(finishedCloudlets); } private static Datacenter createDatacenter(String name) { List<Host> hostList = new ArrayList<Host>(); List<Pe> peList = new ArrayList<Pe>(); int mips = 1000; peList.add(new Pe(0, new PeProvisionerSimple(mips))); int hostId = 0; int ram = 4096; // 主机内存(以MB为单位) long storage = 1000000; // 主机存储容量(以MB为单位) int bw = 10000; // 主机带宽 hostList.add(new Host(hostId, new RamProvisionerSimple(ram), new BwProvisionerSimple(bw), storage, peList, new VmSchedulerSpaceShared(peList))); String arch = "x86"; // 主机架构 String os = "Linux"; // 主机操作系统 String vmm = "Xen"; // 主机监视程序 double time_zone = 10.0; // 主机时区 double cost = 3.0; // 主机每秒的成本 double costPerMem = 0.05; // 主机每MB内存的成本 double costPerStorage = 0.1; // 主机每MB存储的成本 double costPerBw = 0.1; // 主机每Mbps带宽的成本 LinkedList<Storage> storageList = new LinkedList<Storage>(); DatacenterCharacteristics characteristics = new DatacenterCharacteristics(arch, os, vmm, hostList, time_zone, cost, costPerMem, costPerStorage, costPerBw); Datacenter datacenter = null; try { datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0); } catch (Exception e) { e.printStackTrace(); } return datacenter; } private static DatacenterBroker createBroker() { DatacenterBroker broker = null; try { broker = new DatacenterBroker("Broker"); } catch (Exception e) { e.printStackTrace(); return null; } return broker; } private static List<Vm> createVms(int brokerId) { List<Vm> vms = new ArrayList<Vm>(); int vmId = 0; int mips = 1000; int size = 10000; // 虚拟机大小(以字节为单位) int ram = 512; // 虚拟机内存(以MB为单位) long bw = 1000; // 虚拟机带宽 int pesNumber = 1; // 虚拟机处理单元数量 String vmm = "Xen"; // 虚拟机监视程序 for (int i = 0; i < 10; i++) { Vm vm = new Vm(vmId, brokerId, mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerSpaceShared()); vms.add(vm); vmId++; } return vms; } private static List<Cloudlet> createCloudlets(int brokerId) { List<Cloudlet> cloudlets = new ArrayList<Cloudlet>(); int cloudletId = 0; long length = 40000; // 执行云任务所需的MI数 long fileSize = 300; // 输入文件大小(以字节为单位) long outputSize = 300; // 输出文件大小(以字节为单位) UtilizationModel utilizationModel = new UtilizationModelFull(); for (int i = 0; i < 10; i++) { Cloudlet cloudlet = new Cloudlet(cloudletId, length, 1, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel); cloudlet.setUserId(brokerId); cloudlets.add(cloudlet); cloudletId++; } return cloudlets; } private static void printCloudletResults(List<Cloudlet> cloudlets) { System.out.println("Cloudlet ID\tStatus\tData center ID\tVM ID\tTime\tStart Time\tFinish Time"); for (Cloudlet cloudlet : cloudlets) { System.out.println(cloudlet.getCloudletId() + "\t" + cloudlet.getStatusString() + "\t" + cloudlet.getResourceId() + "\t" + cloudlet.getVmId() + "\t" + cloudlet.getActualCPUTime() + "\t" + cloudlet.getExecStartTime() + "\t" + cloudlet.getFinishTime()); } } } ``` 这是一个基于多维QoS的资源调度算法的简单示例代码。你可以根据自己的需求进行调整和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值