秒懂确定性网络之玩转队列(中)

上一节介绍了队列的概念(秒懂确定性网络之玩转队列(上)),本节分析队列机制的演进过程,从单队列延伸到多队列,从软件队列延伸到硬件队列,从软件定义队列延伸到可编程队列,以及每用户、每队列、每流、每包等队列调度粒度。

队列的演进

1单队列到多队列

当出端口只有一个队列时,所有的包都被放在同一个队列进行调度,流与流之间缺少隔离性,容易导致乱序和抖动,因此交换机逐渐从单队列发展到多队列,利用多个队列来保证隔离性。典型的多队列是优先级队列,其具有0-7共八个队列优先级,且一般将7定义为最高优先级。多队列在调度时,不仅要考虑单个队列中包的调度顺序,还要考虑队列之间的调度顺序,即选择哪一个队列为出端口传输队列,常用的传输选择策略[1]有严格优先级(SP, Strict Priority)、加权轮询(WRR,Weighted Round Robin)、加权公平队列(WRQ,Weighted Fair Queuing)。

SP调度就是严格按照队列优先级的高低顺序进行调度,只有高优先级队列中的报文全部调度完毕后,才调度低优先级队列。其优点是关键业务可以优先被传输以降低响应延迟,其缺点是拥塞发生时,如果高优先级队列中一直有报文存在,那么低优先级队列中的报文将一直得不到服务。

RR调度即采用轮询的方式,如果轮询的队列不为空,则从该队列取走一个报文;如果该队列为空,则直接跳过该队列,调度器不等待。轮询保证了队列传输机会的均等性,WRR在轮询的基础上为队列添加权重,根据权重初始化发包计数器,权重越大,调度机会越多,能被传输的包就越多;比如三个队列的权重为50%、25%、25%,则50%权重的队列传输机会比另外两个队列多一倍,能多发一个包。 WRR的优点是解决了SP队列中低优先级队列长时间得不到服务的问题,缺点是其按照报文个数进行调度,会由于报文长度变化导致无法保证每个队列固定的带宽。

WFQ加权公平队列为使带宽分配更加公平,不再像WRR那样以报文数为单位,而是以比特数为单位进行调度,从而防止长报文比短报文获得更多带宽,并减少大小报文共存时的时延抖动。

此外,为了实现更好的隔离性,满足不同维度的隔离需求,还可以采用多级分层队列,各级可采用不同的传输选择算法,实现丰富的调度策略。比如近年来提出的分层核心无状态公平队列HCSFQ,以及异步流量整形器ATS。

2软件队列到硬件队列

上面提到的队列策略都属于软件队列,流量首先通过802.1p/DSCP/IP等字段在分类器进行优先级映射,进入不同的软件队列,然后在调度器根据不同的调度策略进行出队;出队后进入到硬件队列中,最后从接口发送传输到下一跳。实际上,软件队列中存放的并不是真实的数据包,而是数据包的指针,指针就好比是数据包的名字,真实的数据包依然在缓冲区中,所以数据包的大小并不影响队列的长度,一个1500字节的数据包和一个10K的数据包在队列里占用的队列长度均为1,软件队列的总队列长度可以用队列管理工具调整[2]。

硬件队列是Tx输出队列,里面传输的是真实的数据包,其采用先进先出FIFO的方式,实现在接口的ASIC芯片上。每个物理接口上都有且仅有一个硬件队列,且不能被队列管理工具管理。硬件队列的深度一般只有2-3个包,当硬件队列没有被充满或者为空时,说明接口没有发生拥塞,一般数据不会经过软件队列,而会被直接放入硬件队列进行传输。

3软件定义队列与可编程队列

一方面,当前商用交换机里的队列调度策略都是选配的,即只支持诸如在某个端口关闭SP队列、开启WFQ队列之类的操作,无法灵活地定制特定的队列调度策略,因此软件定义队列的想法被提出。其借鉴软件定义网络中通过OpenFlow南向接口下发流表来实时改变转发行为的思想,希望在控制器中实现诸如OpenQueue[3]的接口,定义入队、调度、出队等基本原语,从而能够实时的进行添加队列、删除队列、改变优先级、改变调度算法等操作。理论上可以在每个端口定义65000[4]个虚拟队列,并采用不同的调度算法。

另一方面,P4等可编程交换机的兴起,激发了人们在可编程交换机中创新队列调度算法的设想。可编程队列中的可编程主要作用在流量管理器(TM, Traffic Manager)中的调度器上,通过改变数据结构、改变硬件设计等方式,针对特定场景实现更高效的队列算法。在2016年的SIGCOMM大会上MIT首次利用可编程PIFO队列[5]实现了WFQ等调度算法的调度器,并支持10Gbps的线速转发能力;Sharma提出可编程日历队列(Calendar Queues)调度器[6]来实现公平队列、pFabric等各种调度算法;近来SP-PIFO[7]调度器使用SP严格优先级队列实现了近似PIFO压入先出队列的调度效果,提升了队列在应对海量流量时的可扩展性。

4队列调度的粒度

队列调度的粒度是众多调度算法的兵家必争之地,由粗粒度到细粒度大致可分为每端口、每用户、每业务类、每队列、每流、每包。

每端口粒度的调度基本只能在出队时做端口限速,没有调度算法;每用户调度可以在边缘侧流量接入时保证用户业务间的良好隔离性;在入队映射时,用户的多种业务流可能被分类进不同的优先级队列;每队列调度即如严格优先级调度般的以队列间的调度顺序为最小调度单位;每流调度可以识别流ID,从而在不同流出队时进行每流粒度的限速和整形;每包调度是最细的调度粒度,比如PIFO队列,其能改变一个包在单个队列中的排队顺序。

调度粒度越细,网络服务质量越好,但所需要的开销也越大,比如每流调度往往需要维护每流的状态,缺少可扩展性,当有成千上万条流需要调度时,调度性能会变得很低。不同的调度粒度可以通过分层的多级队列调度来综合,比如下图的HQOS (Hierarchical Quality of Service)[8]技术。

下一节将介绍确定性网络中的队列增强机制,更多内容请看下回分解。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在向消息队列发送消息后,可以采取以下措施来确保消息一定发送到消息队列: 1. 消息确认机制:大多数消息队列系统都支持消息确认机制,即在消息发送后,消息队列会返回一个确认信息给生产者。生产者可以通过等待确认信息或者接收到确认信息后,才认为消息已经成功发送到消息队列。 2. 持久化设置:确保消息队列的持久化设置已启用。消息队列通常提供了持久化的选项,将消息存储到持久化存储介质(如磁盘)上,以确保即使在消息队列重启或故障时,消息也不会丢失。 3. 重试机制:在消息发送失败或者超时时,可以设置重试机制来重新发送消息。可以根据具体的业务需求和消息队列的特性来设置重试次数和间隔时间,确保消息最终被成功发送。 4. 错误日志记录:对于发送失败的消息,可以将其记录到错误日志,以便后续进行排查和处理。可以通过监控工具或者手动检查错误日志来发现发送失败的情况,并及时采取相应的措施。 5. 监控与报警:建立监控系统,定期检查消息队列的运行状态和发送情况。如果发现消息发送异常或者消息队列不可用的情况,及时触发报警机制,通知相关人员进行处理。 通过以上措施,我们可以在一定程度上确保消息成功发送到消息队列,并提供相应的监控、报警和处理机制,以保证消息的可靠性和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值