具有入口控制的业务量管理的制作方法

文档序号:12600520阅读:212来源:国知局
具有入口控制的业务量管理的制作方法与工艺

技术领域

本发明涉及业务量管理,并且更具体地,涉及具有入口控制的业务量管理。



背景技术:

一般而言,服务提供商网络被配置为提供到成千上万用户的网络连接。用户可包括个人和/或企业,其通过各自的网络节点耦合到提供商网络。每个网络节点的用户侧都可包括一个或多个用户设备(例如计算设备、电话、视听设备等),其可以经由用户网络互连。

用户设备被配置为发送和/或接收网络业务量,其包括声音、视频和/或数据。可以为各个网络节点定义各个用户和提供商网络之间的业务量,例如通过服务等级协议(Service Level Agreement,SLA)。例如,SLA可包括数据速率和/或流量约束和/或按用户和/或业务量类型(即业务量类别)中定义的承诺。

提供商网络包括多个网络设备,例如路由器,其被配置为管理通过提供商网络的网络业务量的流动。每一个网络设备被配置为接收和/或发送多个业务量流。因此,网络设备物理资源,例如端口,由多个业务量流共享。

业务量管理被配置为管理端口被业务量流的共享。业务量管理被配置为至少部分地基于与业务量流相关联的业务量类别,选择,即,调度用于与调度决定一起传输的分组。传统的业务量管理通常以为分组处理而优化的专用硬件来实现。专用硬件不可由服务提供商编程,和/或如果一起使用来自多个提供商的网络设备,则可能存在互操作性的挑战。

业务量计量被配置为限制接收的分组速率。传统的业务量计量通常以专用硬件实现。网络设备的计量精度通常利用这样的硬件实现,针对相对较小的带宽流或相对高的带宽(例如线路速率或接近线路速率)流,但不能同时针对上述两者。

附图简述

随着下面的详细描述的进行,并参考所述附图,所要求保护的主题的实施例的特征和优点将变得明显,其中相同的数字表示相同的部件,并且其中:

图1示出了与本发明的各种实施例相一致的示例性网络系统;

图2示出了与本发明的各种实施例相一致的示例性网络设备;

图3A示出了用于一个分组处理流水线的分组处理流水线功能块的示例性序列;

图3B示出了将图3A的分组处理流水线的功能块映射到多个线程的一个示例;

图3C示出了将多个分组处理流水线的功能块映射到多个处理器核的示例;

图3D示出了将多个分组处理流水线的功能块映射到多个处理器核的另一个示例;

图4示出了与本发明的一个实施例相一致的示例性调度器模块;

图5示出了与本发明的各种实施例相一致的示例性调度层次结构;

图6示出了与本发明的各种实施例相一致的示例性分层调度器数据结构;

图7示出示出了与本发明的多个实施例相一致的被配置为排列多个分组的示例性操作的流程图;

图8示出了排列操作的示例性流水线化的实现;

图9A和9B示出了与本发明的一个实施例相一致的被配置为排列多个分组的示例性操作的流程图;

图10示出了与本发明的一个实施例相一致的示例性出列操作;

图11是与本发明相一致的示例性管道预取状态机;

图12示出了调度器和网络接口端口的相对定时和同步的示例;

图13示出了与本发明的一个实施例相一致的被配置为初始化令牌桶的示例性操作的流程图;

图14示出了与本发明的一个实施例相一致的配置为更新令牌桶的示例性操作的流程图;

图15示出了与本发明的一个实施例相一致的配置为消耗令牌的示例性操作的流程图;以及

图16A和16B包括与本发明的各种实施例相一致的被配置为示出了示例性的分层调度器的性能的两个图。

虽然下面的详细描述将参考所给示例性的实施例进行,但对于本领域技术人员来说,各种替换、修改和变化将是显而易见的。

详细说明

一般而言,本发明涉及具有入口控制的业务量管理。与本发明一致的系统和方法被配置为利用可编程网络设备,提供可编程的出口业务量管理,可编程网络设备具有大约每秒数个、数十个或更多千兆比特的线路速率。所述系统和方法被配置为根据由例如服务等级协议(SLA)中指定的策略,优先传输与多个用户和多个业务量类别相关的分组。所述系统和方法进一步被配置为提供对数千个(例如64k,其中k是1024)分组队列(以及与每个队列相关联的分组流)以及具有多个调度级别(例如五个)的分层调度的支持。如本文所述,所述系统和方法被配置为对于排列操作,对多个分组并行地操作,以及对于出列操作,对多个管道并行地操作,因此“隐藏”预取等待时间。在一些实施例中,所述系统和方法可以包括拥塞检测机制(例如尾部丢弃、随机早期检测)。如本文所述,所述系统和方法进一步被配置为对于诸如业务量整形、严格优先级和加权轮叫之类的功能,提供相对高级别的精度。

同样地,与本发明一致的入口控制被配置为在可编程网络设备上实现,并进一步被配置为对于相对低的带宽(例如大约Mbps(每秒兆比特))和相对高的(例如大约Gbps(每秒千兆比特))带宽的分组流,提供相对高的精确度(例如大约1%)。

图1示出了与本发明的各种实施例相一致的示例性网络系统100。系统100通常包括提供商网络102,通过各自的网络节点105a,...,105n耦合到提供商网络102的多个客户端系统104a,...,104n,以及一个或多个其他网络106。提供商网络102被配置为向所述多个用户,即客户(例如,订户、企业)提供网络服务。提供商网络102包括多个网络设备108a,...,108n。每一个网络设备108a,...,108n被耦合到一个或多个其他网络设备108a,...,108n,并且至少一个网络设备被耦合到其它网络106。如本文所用,网络设备包括但不限于路由器、交换机和/或集线器。

提供商网络102被配置为提供到每个客户端系统104a,...,104n的网络连接和网络服务。例如,例如客户端系统104a的客户端系统可以通过提供商网络102耦合到其它网络106和/或另一个客户端系统104b,...,104n。每一个客户端系统可以包括一个或多个计算机节点元件(例如主机服务器系统、台式计算机、膝上型计算机、平板计算机等)、交换机、路由器、集线器、网络存储设备、网络附接的设备、非易失性存储器(NVM)存储设备、基于云的服务器和/或存储系统、刀片服务器、视听设备(例如电视机、收音机接收器等)、智能手机,功能手机等。每个客户端系统104a,...,104n被配置为通过各自的网络节点105a,...,105n将来往于提供商网络102传送包含数据的分组。所述分组包括数据,其中可能包括语音数据、视频数据和/或其它数据,例如文件传送数据。

提供商网络102(包括网络设备108a,...,108n)、客户端系统104a,...,104n和/或其他网络106也可以使用交换式结构的通信协议,例如以太网通信协议、Infiniband(无限带宽)通信协议等,进行相互通信。以太网通信协议能够使用传输控制协议/因特网协议(TCP/IP)提供通信。以太网通信协议符合或兼容由电气和电子工程师协会(IEEE)发布的命名为“IEEE 802.3标准”的以太网标准(发布于2002年3月)和/或该标准的更高版本,例如,发布于2012年的用于以太网的IEEE 802.3标准。所述InfiniBand协议符合或兼容由InfiniBand贸易协会(IBTA)发布的InfiniBandTM规范,发表于2001年6月的命名为“InfiniBandTM体系结构规范”的第1卷、版本1.2.1,和/或该规范的更高版本,例如,发布于2008年1月的InfiniBandTM体系结构规范,第1卷(一般规范),版本1.2.1,以及发布于2012年11月的第2卷(物理规范),版本Release 1.3。当然,在其他实施例中,交换结构通信协议可以包括自定义的和/或专有的交换结构通信协议。

网络102和/或其他网络106可包括任何分组交换网络,诸如,例如在IEEE 802.3标准中阐述的以太网网络和/或例如IEEE 802.11标准中阐述的无线局域网络。无线协议可以符合或兼容无线标准,所述无线标准由IEEE发表于2012年4月,命名为“802.11-2012-用于信息技术的IEEE标准-本地和城域网系统间的电信和信息交换-特定要求第11部分:无线LAN媒体访问控制(MAC)和物理层(PHY)规范”,和/或该标准的更高版本。

图2示出了与本发明的各种实施例相一致的示例性网络设备200。网络设备200是图1中的网络设备108a,...,108n的一个例子。网络设备200通常包括处理器210、桥接芯片组212、系统存储器214和网络接口216。处理器210被配置为执行与网络设备200相关联的操作。处理器210可以包括一个或多个处理单元,例如核220a,...,220n、与各个核220a,...,220n相关联的各自的缓存存储器222a,...,222n以及处理器缓存存储器224。桥接芯片组212被配置为耦合处理器210、系统存储器和/或网络接口216。

网络接口216被配置为将网络设备200耦合到一个或多个其他网络设备108a,...,108n和/或其他网络106。网络接口216可包括处理器228、主机接口230、媒体接入控制(MAC)电路232、物理层电路层(PHY)233和网络接口存储器234。处理器228被配置为执行与网络接口216相关联的操作。主机接口230被配置为将网络接口216耦合到桥接芯片组212。

MAC 232和PHY 233被配置为将网络设备200经由物理介质耦合到一个或多个其他网络设备108a,...,108n和/或其他网络106。MAC 232被配置为对于发送和接收功能执行媒体访问管理。如本文所述,PHY 233包括一个或多个端口235a,...,235n,每个端口235a,...,235n都能够传输多个业务量流。每个端口,例如端口235a,都包括发送电路236,被配置为将数据和/或消息分组和/或帧发送到一个或多个其他网络设备108a,...,108n和/或其他网络106。每一个端口,例如端口235a,包括接收电路237,被配置为从一个或多个其他网络设备108a,...,108n和/或其他网络106接收数据和/或消息分组和/或帧。

如本文所述,系统存储器214可以被配置为存储操作系统OS 240、网络接口控制器“NIC”驱动程序242、多个应用程序编程接口API 243、多个入口模块244、多个出口模块246、多个数据结构248以及被配置为在分组处理之后和传输之前存储分组的多个队列250。

系统存储器214可被配置为存储虚拟机监视器(VMM)252,然后可包括多个虚拟机(未示出)。OS 240可以被配置为利用被配置为用于有效和相对快速的分组处理的软件框架,。例如,所述软件框架可以符合或兼容数据平面开发套件(DPDK),所述DPDK被配置为优化在体系结构处理器上的分组处理。

入口模块244可包括多个初始处理模块245、监管器模块247和负载平衡器249。出口模块246可以包括调度器模块253(例如分层调度器)和分组输入/输出(I/O)模块255。如本文所述,在一些实施例中,出口模块246可以包括拥塞管理模块257。API 243可以被配置为提供应用程序编程接口,例如,用于调度器模块253的,并且可以包括调度器配置、排列和/或出列功能。API 243可以被,例如服务提供商用于实现用于每个网络节点和相关联的用户的与SLA相关的策略。

网络设备200被配置为对于提供商网络102所承载的网络业务量提供业务量管理功能。网络设备200可以通过例如端口235a的Rx 237接收多个分组流中的多个分组,处理所述分组,并通过例如端口235a的Tx 236发送所述处理后的分组。如本文所述,初始处理模块245可以包括分组I/O接收模块272和流分类模块274,其被配置为处理接收到的分组,以用于例如,识别相关联的业务量流、识别源和/或目的地、和/或识别业务量类别。如本文所述,在一些实施例中,监管器模块247可以被配置为限制可被网络设备200进一步处理的分组的数量。负载均衡器249被配置为跨多个处理器核和/或跨多个线程分配分组处理活动。

出口模块246被配置为管理来自网络设备200的处理后的分组的传输。调度器模块253被配置为排列准备传输的处理后的分组,选择用于传输的下一分组,以及出列所选择的下一分组。PKtI/O Tx模块255被配置为通知例如网络接口216,所述出列后的分组准备好传输。拥塞管理模块257被配置为基于策略,在在某一时间段内接收到比可以发送的分组更多的分组的情况下,有选择性地丢弃分组。

入口模块244和出口模块246被配置为利用处理器210体系结构。入口、出口和其它分组处理功能可以被分配在处理器核220a,...,220n和/或多个线程之间。因此,入口、出口和/或其它分组处理功能可以被并行地执行,并且可以被流水线化。流水线被配置为提高分组处理效率并且可便于在一段相对短的时间内处理相对大量的分组流(例如数万或更多)。

图3A示出了一个分组处理流水线300的分组处理流水线的功能块的示例性序列。网络设备200可以被配置为实现多个分组处理流水线。分组处理流水线300的功能块可以由处理器210的一个或多个核220a,...,220n和/或网络接口216来执行。分组处理流水线300包括分组输入/输出接收模块“Pkt I/O Rx”302、分组解析器模块“Pkt解析304和流分类器模块“Classif”306。例如,Pkt I/O Rx 302、Pkt解析304和Classif 306可以被包含在图2中的初始处理模块245中。分组处理流水线300还包括业务量计量和/或策略模块“监管器”308、负载均衡模块“负载均衡器”310、工作模块“工作器”312、拥塞管理模块“丢弃器”314、分层调度器模块“Hier sched”316和分组输入/输出发送模块“Pkt I/O TX”318。例如,监管器308可对应于监管器247,负载均衡器310可以对应于负载均衡器249,工作器312可对应于工作模块254,丢弃器314可对应于拥塞管理模块257,Hier sched 316可对应于调度器模块253,并且Pkt I/O TX 318可对应于Pkt I/O TX 255。

响应于来自Pkt I/O TX 318的通知,输入分组可以由PKt I/O Rx 302从Rx 237接收,并且处理后的分组可以由Tx 236发送。通常,每个分组包括与路由(例如寻址)和控制相关联的分组报头和包含数据的分组有效负载。例如,分组可以被网络接口216的端口235a的Rx 237接收,并且可以由NIC驱动程序242进行初始处理。如本文所述,例如,NIC驱动程序242可以被配置为轮询模式驱动程序。接收到的分组(即输入分组)随后可被Pkt解析304进行解析。Pkt解析304被配置为识别每一个输入分组的协议栈。Pkt解析304还被配置为检查输入分组的分组报头的完整性。然后输入分组可被Classif 306映射为业务量流。例如,映射可包括精确匹配查找表,该表使用了可配置的散列函数(例如jhash、CRC(循环冗余校验)等)以及桶逻辑来管理冲突。每个业务量流都对应于源和目的地之间的一种分组传送类型。源和/或目的地可包括,例如客户端系统104a,...,104n(和/或客户端系统内的客户端设备)、提供商网络102、其他网络106和/或耦合到其它网络106的其他客户端系统(未示出)。分组类型可对应于有效负载的类型,并且还可以对应于业务量类别,所述负载是,例如,分组携带的语音、视频、数据。

如本文所述,监管器308被配置为执行业务量计量和/或监管功能。如本文所述,业务量计量和/或监管被配置为限制数据速率。作为业务量计量和/或监管的结果,一个或多个输入分组可能会被丢弃。负载均衡器310被配置为将输入分组(即在计量/监管中留下来的)分配到例如工作器312的多个工作器模块,并向每个工作器模块提供均匀的负荷。每个工作器模块,例如,工作器312,都可对应于服务提供商特定的应用程序工作负载线程(例如互联网协议(IP)堆栈等)。负载均衡器310可以进一步被配置为保持业务量流与工作器模块的紧密度以及每个流内的分组的顺序。保持业务量流与工作器模块的紧密度可以被配置为通过当处理分组流时,利用数据局部性来支持高效的分组处理。

如本文所述,丢弃器314被配置为对于分层调度器316执行拥塞管理。拥塞管理可包括每当目标调度器队列已满时,都丢弃分组,直到大量分组已被从目标出口队列发送、随机早期检测(RED)和/或加权RED(WRED)。加权RED被配置为基于当前的调度器队列负载水平和分组优先权丢弃分组。因此,当遇到拥塞时,相对较低优先级的分组可能会在相对较高优先级的分组之前被丢弃。

如本文所述,分层调度器模块316被配置为至少部分地基于一些标准,调度(即选择)用于传输的下一分组。分层调度器316被配置为将分组排列在多个队列中等待传输,并且当被选择用于传输时出列分组。分层调度器模块316可以被配置为实现业务量整形、严格优先级、上限执行和/或加权轮叫。如本文所述,分层调度器模块316被配置为管理成千上万的队列。

网络设备200还可以包括多个基础结构模块255,其被配置为支持分组处理流水线300功能。基础结构模块255包括缓冲管理器模块256,被配置为提供对全局缓冲池和按线程私有缓冲缓存的支持;队列管理模块258,被配置为对分组处理流水线模块之间的消息传递提供支持;和/或省电电模块260,被配置为在低活动期间提供对省电的支持。

图3B示出了将分组处理流水线300的功能块映射到多个线程的一个示例。线程可被配置为在一个或多个处理器核,例如处理器核220a,...,220n上并行地执行。在此示例中,网络接口216包括多个端口235a,...,235n,其中每个端口都包括各自的接收器NIC Rx 322a,...,322n(例如,Rx 237)和各自的传输器NIC Tx 324a,...,324n,例如Tx 236。例如,分组处理流水线可包括线程0、线程1、线程2、直到线程(n+1)和线程(n+2),其配置为处理多个业务量流的分组。线程可被配置为在流水线中的不同的分组上并行地执行。在本示例中,线程0包括Pkt I/O Rx 302和Pkt解析304,线程1包括Classif 306、监管器308和负载均衡器210,线程2至(n+1)的每一个包括各自的工作器312a,…,312n,并且线程(n+2)包括丢弃器314、Hier Sched316和Pkt I/O Tx 318。继续这个示例,分组处理流水线和相关联的线程可被配置为对一个物理端口处理分组,例如端口235a、Rx 237和Tx 236,其分别对应于NIC RX 0和NIC TX 0。

在一些实施例中,一个物理端口可以由多个线程所共享。如本文所述,多个子端口可以与一个物理端口相关联。然后每个子端口都可以与各自的线程相关联。对于一个物理端口的排列和出列操作可以与同一个线程相关联。与调度器316相关联的排列和出列操作被配置为由同一个线程,例如线程(n+2)实现。如本文所述,排列和出列操作可以共享,例如,分组描述符、队列表、队列存储区和活动队列的位图。由同一个线程实现这些操作被配置为通过允许队列和位图操作是非线程安全的以及维护同一处理器核内部的调度器数据结构,来提供改进的运行效率。因此,可避免使用用于访问序列化的锁定原语或用于无锁访问的原子原语。

图3C示出了将多个分组处理流水线的功能块映射到多个处理器核的示例330。在此示例中,分组处理流水线的功能块被映射到两个处理器核,例如图2中的220a,…,220n。在本示例中,包括Pkt Rx 333(例如Pkt I/O Rx和Pkt解析)和Classif 304的分组接收功能块被映射到第一处理器核332a(例如处理器核220a)和业务量管理334(如丢弃器314和Hier Sched 316),并且分组传输功能(例如Pkt I/O Tx 318)被映射到第二处理器核332b(例如处理器核220b)中。在该示例中,业务量管理334包括调度器排列模块、多个队列以及调度器出列模块。

图3D示出了将多个分组处理流水线的功能块映射到多个处理器核的另一个示例340。在此示例中,分组处理功能块被映射到3个处理器核。在这个示例中,包括Pkt Rx 333和Classif 304的分组接收功能块被映射到第一处理器核332a(例如处理器核220a),业务量管理334功能被映射到第二处理器核332b(例如处理器核220b),并且分组发送功能被映射到第三处理器核332b(例如处理器核220n)。在该示例中,业务量管理334包括调度器排列模块、多个队列和调度器出列模块。例如,核332a、332b、332c可以被包括在处理器210中,并因此可以对应于处理器核220a,...,220n。

因此,与多个业务量流相关联的多个分组可以由网络设备200使用一个或多个分组处理流水线,例如分组处理流水线300,来处理。分组处理流水线300的功能块可以被实现为网络设备220的一个或多个处理器核220a,...,220n上的一个或多个线程。分组处理流水线功能块到处理器核220a,...,220n的映射可以是可配置的,并且可以至少部分地基于,与每个业务量流和相关联的应用程序相关联的性能水平以及为每个功能块启用的一组特征。例如,一些功能块可以消耗多于一个处理器核220a,...,220n(例如,每个处理器核220a,...,220n都被配置为执行相同的功能块的不同的实例,但在不同的输入的分组上的)。在另一个例子中,多个功能块可以被映射到一个处理器核,例如处理器核220a。流水线化,利用多个线程的处理,以及利用多个核的处理便于处理例如64K或更多分组流。

图4示出了与本发明的一个实施例相一致的示例性调度器模块400。调度器400是图2中调度器模块253的一个例子。调度器400对应于,例如,图3A和3B中的Hier Sched 316。调度器400包括排列模块402、多个队列404和出列模块406。排列模块402被配置为在传输之前排列、即暂时存储多个分组。如本文所述,排列模块402被配置为选择多个队列404中的要在传输之前存储分组的其中一个队列。出列模块406被配置为选择所存储的分组以提供给网络接口,例如网络接口216,以便传输。如本文所述,出列模块406被配置为至少部分地基于多个标准,选择用于传输的下一分组。

调度器400被配置为根据策略将来自多个用户(例如客户端)和多个业务量类别的分组的传输排优先级,所述策略由与每个网络节点,例如网络节点105a,...,105n相关联的服务等级协议(SLA)指定。调度器400被配置为管理相对大量(例如大约几万或更多)的业务量流和相关的队列。调度器400被配置为逻辑地将分组分组为多个层级,并至少部分地基于与分层等级的相关的用户、业务量类别和标准,选择下一要发送的分组。如本文所述,调度器400还可以被配置为在其选择过程中利用业务量整形、严格优先级和加权轮叫中的一项或多项。

图5示出了与本发明的各种实施例相一致的示例性调度层次结构500。如本文所述,调度层次结构500表示业务量流的逻辑分组,并且被配置为便于选择用于传输的下一分组。逻辑分组被进一步配置为便于满足多个用户的每个业务量类别的SLA。逻辑分组可以数据结构来实现,随后当选择用于传送的下一分组时,将利用所述数据结构来促进提高处理的效率。

在这个例子中,调度层次结构500包括五个层次:端口、子端口、管道、业务量类别和队列。在一些实施例中,调度层次结构可包括更多或较少的层次。每个层次的成员的数量可能依赖于,例如,相关的网络设备的能力、服务提供商网络的特性、服务级别协议的要求、网络节点数量等等。例如,包括具有多个端口的网络接口的网络设备的调度器,例如调度器253,被配置为实现多个调度层次结构,每个端口,例如端口235a,...,235n,一个层次结构,,,。如本文中所述,调度器,例如调度器253,被配置为根据调度层次结构500分组队列(例如大约上万的队列),并且将一个或多个分组流与每个队列(例如大约数十万或更多个分组流)相关联,并在选择(即,调度)用于传输的分组时,利用组和相关的标准。

调度层次结构500的第一层是端口502。端口502对应于一个端口,如网络接口216的端口235a,...,235n。例如,端口502可以对应于具有大概几千兆比特每秒,例如1GbE(每秒千兆比特以太网)、10GbE和/或40GbE的比特率的以太网Tx端口。调度器253被配置为以循环顺序调度多个端口,每个端口都具有相同优先级。

子端口504a,…,504s是调度层次结构500的第二层,对应于一个或多个调度层次结构。每个端口的子端口的数量可以被设定,例如,由网络服务提供商设定。例如,每个端口的子端口的数量可以是8。在一些实施例中,每个子端口都可以代表预定义的用户组。多个管道506a,...,506p是调度层次结构500的第三层。每个子端口的管道的数量可以被设定,例如,由网络服务提供商设定。例如,每个子端口的管道的数量可以是4000。每个子端口的管道的数量通常大约为几千。在一些实施例中,一个管道可以代表一个用户,例如一个订户。

多个业务量类别508a,...,508d是调度层次结构的第四层。业务量类别的数量通常是2的幂,一般是比较小的。在此示例中,业务量类别的数量为4。因此,每个管道,如管道506a,都包括四个业务量类别,如业务量类别508a,...,508d。每个业务量类别508a,...,508d都对应于各自的业务量类型,如语音、交互视频、非交互视频、数据传输(文件传输、应用程序下载、电子邮件流量、网页浏览等)。每个业务量类别508a,...,508d都可具有相关联的传输参数,所述传输参数涉及,例如相关的SLA和/或QoS(服务质量)规范。例如,传输参数可以包括但不限于,相关的允许丢失率、容许延迟和/或可允许的抖动规范。

调度层次结构500的第五层对应于多个队列510a,…,510d、512a,…,512d、514a,…,514d、516a,…,516d。在这个例子中,每个管道的队列的数量是16。每个业务量类别,如业务量类别508a,都包括四个队列,例如队列510a,…,510d。每个队列510a,…,510d、512a,…,512d、514a,…,514d、516a,…,516d都被配置为存储来自属于同一用户的同一类型的一个或多个连接(即,业务量流)的分组。

如本文所述,调度器253可以被配置为在子端口和管道的层上使用令牌桶技术实现业务量整形,其中每个子端口都具有一个令牌桶并且每个管道都具有一个令牌桶。在子端口层以及管道层,可以针对每个业务量类别,实施各自的上限。如本文所述,调度器253还可以被配置为允许较低优先级业务量类别重新使用可能没有被较高优先级业务量类别使用的子端口带宽和/或管道带宽管道带宽。

调度器253可以被配置为按照严格优先级顺序,调度同一管道的业务量类别。如果一个子端口业务量类别被超额订阅(例如配置时间事件),则管道层业务量类别的上限可能被限制为由子端口相关联的所有管道共享的动态调整值。调度器253可以被配置为根据预定义的权重,使用加权轮叫(WRR)技术来调度相同业务量类别的队列。

图6示出了与本发明的各种实施例相一致的示例性调度器数据结构600。调度器数据结构600对应于调度层次结构500。调度器253可以被配置为每个端口,例如,端口235a,...,235n,实现各自的调度器数据结构,,例如,调度器数据结构600。调度器数据结构600包括子端口表602、管道表604、队列表606、队列存储区608、活动队列位图610和管道磨机阵列612。

子端口表602包括多个子端口表条目条目Subport 0,...,Subport Sn。例如,每个子端口条目Subport0,...,Subport Sn都有64字节的大小。子端口表条目的数量对应于每个端口的子端口数量。每个子端口表条目的条目Subport 0,...,SubportSn都被配置为存储子端口的永久性数据,例如,与每个子端口,例如子端口504a,...,504s相关联的令牌桶信用。子端口表602可被例如调度器253访问,以执行与的出列操作相关联的读取和/或写入。

管道表604包括多个管道表条目Pipe 0,...,Pipe Pn。例如,每个管道条目Pipe 0,...,Pipe Pn都有64字节的大小。管道表条目的数量对应于每个端口的管道的数量。每个管道表条目条目Pipe 0,...,Pipe Pn都被配置为存储与每一管道相关联的永久性数据,包括与业务量类别,例如业务量类别508a,...,508d相关联的永久性数据,以及与管道相关联的队列,例如,队列510a,…,510d、512a,…,512d、514a,…,514d、516a,…,516d。例如,永久性数据可以包括令牌桶信用。如本文所述,例如在运行期间,可以更新管道表条目表条目Pipe 0,...,Pipe Pn。通常,在运行期间不改变,并且可以被多个管道共享的管道配置参数不被包括在管道表604中。如本文所述,这样的管道配置参数可以被包括在管道简档表中。管道表604可以被例如调度器253访问,以执行与的出列操作相关联的读取和/或写入。

队列表606包括多个队列条目。例如,每个队列条目,Queue 0,...,Queue Qn,都可以具有4字节的大小。队列表条目条目数量对应于每个端口的队列数量。每个队列条目Queue0,...,Queue Qn都被配置为存储永久性数据,例如,读取和写入指针。对于每个业务量类别的所有队列,每个队列的队列大小都可以相同。配置一致的队列大小,以允许队列基地址被有效地确定,因此,队列基地址和队列大小通常没有被包括在相应的队列表条目中。队列表606可以被例如调度器253访问,以执行与排队和出列操作相关联的读取和/或写入。与对应的管道相关联的队列表条目条目通常被存储在,例如,处理器缓存222a的相同的缓存线中。

队列存储区608包括多个队列,Queue 0,...,Queue Qn。Queue 0,...,Queue Qn的数量对应于每个端口的队列数。每个队列Queue 0,...,Queue Qn都可以被配置为存储多个队列元素。队列元素的数量是可配置的。例如,每一个队列Queue 0,...,Queue Qn可以被配置为存储64个8字节的元素。每个8字节的队列元素都对应于一个分组描述符的存储器地址(即mbuf指针)。所述分组描述符(即mbuf)是每个分组的一种相对较小的数据结构(通常是64个字节或更少),其包含与该分组相关联的元数据(例如分组长度、在缓冲器中数据的第一个字节的位置等等)。通常,mbuf与分组体(即头部和有效负载)位于同一存储器缓冲区中,位于存储器缓冲器的特定存储位置。队列存储区608可被例如调度器253访问,以执行与出列操作相关列的读取和/或与排列操作相关联的写入。例如,分组排列对应于mbuf指针被写入到队列中,并且分组出列相当于mbuf指针从所述队列中读取。

活动队列位图610被配置为包括每个队列Queue 0,...,Queue Qn的一个队列状态位。每个端口的队列状态位的数量对应于每个端口的队列数。例如,图5的端口位图524包括对应于与管道506a相关联的队列520的位图部分522。所述队列状态位被配置为指示,队列Queue 0,...,Queue Qn是活动的(即,队列不为空)或者队列Queue 0,...,Queue Qn是不活动的(即队列为空)。每个队列状态位可通过,例如调度器253排列操作(即被排列的分组)设置,以及当相应的队列变空时,被调度器253的出列操作复位(即清除)。在操作中,位图扫描操作被配置为返回下一非空管道和它的状态(例如管道中的活动队列的16位掩码)。

管道磨机阵列612包括多个管道磨机(pipe grinder),Pipe Grinder 0,...,Pipe Grinder Gn。例如,管道磨机阵列612可具有大约128字节的大小。管道磨机,Pipe Grinder 0,...,Pipe Grinder Gn的数量是可配置的。例如,管道磨机的数量可以是8。管道磨机阵列612被配置为存储当前正在处理的活动管道列表。每个管道磨机,Pipe Grinder 0,...,Pipe Grinder Gn都包含管道处理过程中的临时数据。如果当前管道耗尽了分组或者信用,则它被替换为来自位图610的另一活动管道。管道磨机阵列612可被例如调度器253访问,以执行与的出列操作相关联的读取和/或写入。

调度器模块253被配置为在其分组处理操作(即排列和出列操作)中使用调度层次结构,例如调度层次结构500以及数据结构248,例如数据结构。调度器模块253进一步被配置为利用多个处理器核220a,...,220n以及网络设备200的多线程能力,以提高处理效率。因此,调度器253可以有效率地从数以千计的队列中选择用于传输的下一分组,同时满足SLA的承诺。

图7示出了与本发明的一个实施例相一致的被配置为排列多个分组的示例性操作的流程图。例如,所述操作可以由调度器模块253执行。在一些实施例中,例如,当实现拥塞管理时,拥塞管理操作可以由例如拥塞管理模块257执行。最初,一个或多个分组可以被接收自,例如工作器模块或拥塞管理模块。操作702可以包括访问分组描述符(mbuf)并且读取数据字段。数据字段可以包括,例如,分组类型、分组长度、数据开始的指针等。数据字段可被读取,以便识别每一个分组的目标队列。例如,数据字段可包括端口、子端口、业务量类别和业务量类别标识符内的队列。数据字段可以在调度器模块253接收分组之前由分类阶段确定,例如Classif 306。操作704可以包括访问队列结构,例如队列表606,并识别队列阵列中的写位置,例如队列存储区608。

可以在操作706确定被识别队列是否已满。如果被识别队列已满,则操作708可以包括丢弃分组。然后,程序流程可返回到确定被识别队列是否已满。后续的分组也可以被丢弃,直到分组从队列中被出列。如果被识别的队列没满,并且拥塞管理被启用,则可在操作710确定被识别队列的占用率是否高于阈值。如果被识别队列占用率大于阈值,则在操作712,至少部分地基于拥塞管理确定是否丢弃分组。拥塞管理可包括随机早期检测(RED)或加权随机早期检测(WRED)。RED和/或WRED被配置以考虑队列占用率和分组优先级,以决定是否要排列或丢弃特定的分组。例如,较高优先级的分组比低优先级的分组更有可能被排列,例如当目标队列占用率相对较高时。RED和WRED被配置以提供相对于胡乱丢弃的分组更加智能的有关排列或丢弃分组的决定。在操作714,如果分组不被丢弃,则被识别队列阵列位置可以被访问,分组被存储。例如,存储分组对应于写入mbuf指针。程序流程在操作716结束。

由于输入分组的相对较高的速率(例如每秒千兆位)以及相对较大数量的队列(例如几万),被访问以排列当前分组的数据结构可能不出现在当前核的缓存器中(例如核220a的缓存器222a)。因此,排列相关的存储器访问可能会导致一个或多个缓存缺失,以及相应的性能下降。因此提前预取数据是有益的。

图8示出了包括预取的排列操作的示例性流水化的实现800。示例性实现800包括4个流水线阶段:预取mbuf 802、预取队列804、预取队列706中的位置和排列808。每个阶段802、804、806、808都被配置为在两种不同的输入分组上并行执行。例如,预取mbuf 802可以对分组00和01进行操作,预取队列804可以对分组10和11进行操作等。每个输入分组在给定时间都可以是一个流水线阶段的一部分(即,被一个流水线阶段操作),并且多个分组可以被并行地操作。预取操作具有相关联的执行延迟,在该过程中,处理器210不能尝试访问当前处于预取中的数据结构。处理器210可被配置为执行其它工作,例如,执行其他输入分组上的操作的排列序列的不同阶段,从而导致排列操作的流水线化实现。

因此,在排列操作期间,多个分组可以被并行操作。,每一个输入分组都不能一次被多于一个的流水线阶段操作,但在任何时间点,多个分组可以由多个流水线阶段进行操作。流水线结构被配置为“隐藏”预取延迟,从而提高分组排列操作的性能。

图9A和9B示出了与本发明的一个实施例相一致的被配置为出列多个分组的示例性操作的流程图900、950。所述操作可以由,例如调度器模块253执行,并且可以对于每个端口,例如端口235a,执行,。如本文所述,流程图950是流程图900的延续。程序流程可以开始于901。可以在操作902确定当前端口的任何管道是否活动。例如,可以通过分层调度器253来确定活动队列位图610是否包括被设置以及对应于不包含在管道磨机阵列612的管道的任何位。如果当前端口没有活动的管道,则程序流程可以维持在操作902。如果有活动的管道,则操作903可以包括识别当前端口的下一活动的管道。例如,可以使用例如活动队列位图610的位图扫描操作来识别下一活动的管道。位图扫描操作被配置为返回下一非空的管道标识符和相关联的状态(即管道中的活动队列的16位掩码)。

操作904包括预取下一活动管道数据结构,并预取与下一活动管道相关联的队列指针。操作906可以包括切换管道磨机。例如,如本文所述,操作906可以包括从第一管道磨机切换到第二管道磨机。切换管道磨机被配置为“隐藏”与下一活动管道相关的预取操作。换句话说,切换管道磨机被配置为允许与下一活动管道相关联的预取操作同与当前管道相关联的分组出列操作并行地发生。如本文所用,当前管道对应于当前被选为用于出列操作的管道,并且下一活动管道对应于要被选为用于出列操作的下一管道。因此,在流程图900、950的当前轮次(pass)中的操作903中被识别的下一活动管道对应于流程图900、950的操作的下一轮次中的当前管道。

操作908可以包括读取当前管道数据结构。操作910可以包括更新当前管道和它的子端口的信用。例如,可更新当前管道及其子端口的相应的业务量整形令牌桶信用,以及与当前管道和其子端口相关联的相应的业务量类别信用。可以在操作912识别当前管道内的下一活动业务量类别。操作913可以包括在当前管道和当前业务量类别(TC)范围内选择下一队列。例如,下一队列可以使用加权轮叫(WRR)进行选择。操作914包括在当前的队列中预取下一位置(即队列读取指针所指出的位置)。在当前队列预取下一位置对应于预取包含了队列元素(即队列阵列)的数据结构(在由队列读取指针所指出的位置)。队列指针是在操作904中预取的。每一个队列元素是mbuf指针。队列读取指针对应于在操作904中预取的队列指针。操作915可以包含切换管道磨机。

操作916可以包括从当前队列读取当前元素(即mbuf指针)和预取其分组描述符(即mbuf)。操作917包括切换管道磨机。操作918可以包括从分组描述符中读取分组的长度。在操作920中可确定可用的业务量整形(TS)令牌桶信用和可用的业务量类别信用是否大于或等于分组信用。分组信用对应于分组的长度(以字节为单位)加上组帧开销(以字节为单位)。如本文所述,各自的业务量整形令牌桶信用可以每个子端口和每个管道地提供,并且可以被用于业务量整形。如本文所述,各自的业务量类别信用可以每个子端口和每个管道地提供,并且可被用于对于每个业务量类别实现子端口级别和管道级别的上限。如果可用的令牌桶信用和可用的TC信用不大于或等于所述分组信用,则程序流程可进行到操作932。

在操作922,如果可用的业务量整形令牌桶信用和可用的TC信用大于或等于分组信用,则当前分组可以被调度以用于传输。在操作924,可以减去信用,并且可更新加权轮叫(WRR)队列令牌累加器。例如,对于所选择的管道以及相关联的子端口,可从令牌桶中减去信用,并且对于所选择的业务量类别,可以从在管道和子端口级别的信用计数器中减去信用。减去信用的数量对应于发送的字节数(即分组信用)。队列令牌累加器可增加对应于分组长度的量(例如以字节为单位)。可以在操作926中选择当前管道和当前业务量类别内的下一队列。

在操作930可确定当前业务量类别是否是活动的。如果当前业务量类别是活动的,则程序流程可以返回到操作916,从当前的队列中读取当前元素并预取其分组描述符。如果当前业务量类别是不活动的,则在操作932确定在当前管道中的任何下一业务量类别是否是活动的。如果在当前管道中的下一业务量类别是活动的,则程序流程可以返回到操作912,识别当前管道内的下一业务量类别。如果当前管道内没有下一业务量类别是活动的,则程序流程可返回到操作902,对于当前端口确定任何管道是否是活动的。

确定下一业务量类别是否是活动的操作932被配置为避免返回到当前的管道中的已被服务的业务量类别。例如,在操作912,当识别下一活动的业务量类别时,业务量类别可能是不活动的。在另一个例子中,业务量类别可能是活动的,但可能缺乏足够的业务量整形令牌桶信用和/或业务量类别信用。

为了避免缓存缺失,流程图900的操作,例如操作904,被配置为在被访问之前预取数据结构(例如管道、队列、队列阵列、mbuf)。通过对于当前管道,在预取被发出之后立即从例如管道磨机1中的当前管道切换到例如管道磨机2中的另一个管道(即下一活动管道),预取操作的延迟可以被“隐藏。因此当前管道的预取操作在执行切换回管道磨机1中的该管道之前完成。

流程图900、950的操作被配置为利用处理器缓存中的数据存在。例如,调度器模块253可以被配置为在从相同管道移动到下一活动的业务量类别(如果有)或移动到另一活动的管道之前,尽可能多地从相同管道业务量类别和管道调度分组(最多至可用的分组和信用)。

图10示出了与本发明的一个实施例相一致的示例性出列操作1000。示例性出列操作1000被配置为利用分层调度器数据结构,例如数据结构600。管道磨机1002a,...,1002d可以被耦合到子端口表1004、管道简档表1006、管道表1008、队列表和/或队列存储区域1012。

管道简档表被配置为存储管道配置值,该值对于相同管道的分组来说是不变的。这样的管道配置值通常与SLA相关,并且可以包括,例如周期、每个周期的信用等。因此,如果SLA被修改,则管道简档表中的值可改变,但对于相同管道的分组通常不改变。例如,电信网络可以被配置为由相对较小数量的服务类别(例如少于10)构成。可为每个服务类别创建相应的管道简档,并且大量的(比如大约数千)管道可能共享相同的服务类别,并因此有相同的管道简档值。由于多个管道的相对静态的数据被存储在管道简档表中,因此所述包含每个分组地改变的数据(例如管道令牌桶计数器、每个业务量类别的剩余信用、WRR计数器等)的管道表条目大小可以减小表条目。

最小化管道表条目被配置为减少每个管道要预取的数据的量。预取被配置为以缓存行大小(如64字节)为增量预取管道数据,缓存行大小与处理器物理体系结构相关。因此,对于每个管道,分层调度器被配置为预取管道表条目结构和同一管道的所有16个队列的队列指针。然后,队列指针可以存储在第二缓存行中。分层调度器可以被配置为同时启动两个预取,例如,图9操作904。

在这个例子中,管道磨机阵列包括对应于四个活动的管道的四个管道磨机1002a,...,1002d。活动管道由位图1014指示。分层调度器,例如调度器253,被配置为选择管道磨机1002a,...,1002d中的每一个以管理调度通过输出端口1018进行传输的分组1016例如,输出分组1020。多个与管道磨机1002a,...,1002d相关联的活动管道被用来促进流水线化。多个管道磨机1002a,...,1002d被配置为并行处理多个管道。

例如,为了避免缓存缺失,数据结构(例如管道、队列、队列阵列、mbuf)可以在被访问之前被预取。通过在对当前管道发起预取后,立即从当前管道(例如在磨机1002b中)切换到另一个管道(例如在磨机1002c中),预取操作的延迟可被“隐藏”。这被配置为在执行切换回该管道(例如在磨机1002b中)之前提供足够的时间用于完成预取操作。

图11是与本发明相一致的示例性管道预取状态机1100。示例1100管道预取状态机被配置为利用数据局部性,通过例如从同一个业务量类别依次调度分组,只要令牌桶信用可用并且没超过所述管道级和子端口级业务量类别的上限。与状态机1100相关联的状态包括开始1102、预取管道1104、预取业务量类别队列阵列1106、预取mbuf 1108和读取mbuf 1110。状态机1100通常被配置为从开始1102到预取管道1104到预取业务量类别队列阵列1106到预取mbuf 1108到读取mbuf 1110按顺序进行。如果当前状态是预取管道1104,并且没有活动的管道,即没有带有至少一个活动队列的管道,则状态机1100被配置为保持在预取管道1104的状态。

如果当前状态是读取mbuf 1110,则状态机1100被配置为保持在读取mbuf 1110的状态,只要与管道相关联的相同业务量类别有活动的队列(且信用可用)。如本文所述,例如,如果与mbuf(和相关联的第一分组)相关联的分组信用小于或等于可用的令牌桶和TC信用,则可以调度第一分组以用于传输。继续这个示例,如果在与第一分组相同的业务量类别和相同的管道中有其他分组正在等待调度,则状态过渡是“相同TC”并且下一状态对应于读取mbuf。

状态机1100被配置为如果下一活动的业务量类别与当前活动业务量类别在同一管道中,则从读取mbuf状态1110转换到预取mbuf状态1108。例如,如果第一分组的分组信用超过了可用信用或者在相同的业务量类别中没有额外的分组在等待调度,并且相同管道中的业务量类别具有活动的队列,则可从读取mbuf 1110转换到预取mbuf 1108。

状态机1100被配置为如果接下来的活动队列在下一活动的管道中,则从读mbuf状态1110转换到预取业务量类别队列阵列状态1106(“下一活动的管道”)。例如,如果第一分组的分组信用超过了可用信用或者在相同的业务量类别中没有额外的分组在等待调度,并且在相同管道中没有业务量类别具有活动的队列,则可发生从读取mbuf 1110到预取TC队列阵列1106的转换。状态机1100被配置为如果不存在活动的管道,则从读取mbuf状态1110转换到管道预取状态1104(“无活动的管道”)。

因此,示例性管道预取状态机1100被配置为,通过在移动到相同管道中的另一个业务量类别之前,从相同的管道中的相同业务量类别调度分组(只要信用可用并且没超过上限)来利用数据局部性。示例性管道预取状态机1100可以进一步被配置为从相同管道的分组调度,只要信用可用,并没超过上限。示例性管道预取状态机1100提供管道的分组调度的序列化视图。多个活动的管道可以被并行地处理。每个预取操作都被配置为触发切换到另一个活动管道,从而当预取操作正在发生时,分组调度操作可以继续。因此,对于多个活动的管道,分组处理(即调度)操作可以在时间上交错。

因此,如本文所述,分组出列操作可以由,例如调度器253利用调度层次结构和调度器数据结构来实现。下一活动管道可以使用被配置为识别活动队列及其相关的管道的(例如活动队列位图610的)位图扫描操作来识别(),。多个活动管道可被包括在管道磨机阵列中,所述管道磨机阵列被配置为促进管道的并行处理,以便预取延迟被掩盖,从而提高操作效率。

图12示出了调度器和网络接口端口的相定时和同步的示例1200。每个输出端口,例如端口235a,...,235n,可以被建模为字节缝隙的传送带,所述字节缝隙将被调度器填充用于传输的数据。例如,能够10GbE的端口对应于每秒12.5亿字节缝隙可用于分层调度器。如果分层调度器无法以足够高的速率来出列分组以填充所述时隙,假设存在足够的分组和信用,那么某些时隙将被闲置并且带宽将被浪费。为了完全利用该端口,期望分层调度器保持字节缝隙为满。虽然示例1200示出了一个端口的定时和同步,但是,在操作中,分层调度器可以为多个端口并行地调度分组。示例1200包括其中端口的带宽得到充分利用的两个时间间隔1202、1204,,以及其中分层调度器无法保持字节缝隙为满的两个时间间隔1206、1208字节缝隙。

在第一时间间隔1202,分层调度器足够快可以填充字节缝隙并且没有字节缝隙隙被浪费。在第二时间间隔1204,分层调度器处理在传输之前,并且分层调度器再次足够快地填充字节缝隙。在第三时间间隔1206,分层调度器延迟导致多个空字节缝隙1210以及因此导致未使用(即浪费)的带宽。在第四时间间隔1208,分层调度器的处理比端口传输其要慢,并且一些字节缝隙1212是空的,因而,可用的带宽不能被充分利用。

一般来说,分层调度器253出列操作可以被网络接口发送器(Tx),例如Tx 236触发。例如,网络接口Tx输入队列的占用将被监控。如果网络接口Tx输入队列的占用下降到低于预定阈值,则通知调度器(例如基于中断或基于轮询)将更多的分组推送到队列中。

调度器253被配置为监视将被信用逻辑所使用的时间提前量。信用逻辑可能包括子端口和管道业务量整形、业务量类别上限实施等等。信用逻辑被配置为至少部分地基于时间,例如从最后一次更新以来的时间间隔的时长,来更新信用。当调度器决定将分组发送到用于传输的网络接口发送器时,调度器被配置为相应地增大它的间隔时间基准。因此,可以很方便地以字节为单位保持内部时间基准,其中一个字节表示物理接口,例如PHY233,在传输介质上将一个字节发送出去所要求的持续时间。当调度一个分组以用于传输时,该时间递增(n+h),其中n是以字节为单位的分组的长度,h是每个分组的成帧开销字节的数量。

调度器253可以被配置为将其内部时间基准与正在被传输的分组速率,即端口传送带的速度,校准。将调度时间基准与网络接口的时间校准被配置为确保调度器不给网络接口,例如,网络接口Tx 236提供比物理介质的线路速率更多的字节。由此,可避免分组被丢弃(例如被调度器,因为网络接口Tx 236输入队列为满和/或通过网络接口Tx内部地)。

调度器253被配置成响应于每个出列调用,读取当前时间。当前处理器时间可通过读取被包括在,例如核220a和/或处理器210中的时间戳计数器(TSC)寄存器或高精度事件计时器(HPET)寄存器223而获得。当前处理器时间(即CPU时间戳)可以从处理器时钟周期数转换为字节数,因为time_bytes=time_cycles/cycles_per_byte,其中cycles_per_byte对应于处理器周期数,它等效于在传输介质上1字节的传输时间(例如,对于处理器频率为2GHz和10GbE端口,cycles_per_byte=1.6)。

调度器253被配置成保持与网络接口时间(“NIC时间”)相关联的内部时间基准。当分组被调度时,NIC时间被增加了分组信用(即分组长度加上成帧开销)。在每个出列调用中,调度器253被配置为将其NIC时间的内部基准262与当前处理器时间,即处理器时间263进行比较。如果NIC时间262是在未来(NIC时间>=当前处理器时间),则NIC时间可不被调整。因此,调度器253在网络接口实际需要分组之前调度这些分组。换句话说,网络接口Tx 236被很好地提供分组。另一方面,如果NIC时间是在过去(NIC时间<当前处理器时间),那么NIC时间262应通过将其设置到当前处理器时间263而调整,因此,调度器253可能无法跟上NIC字节传送带的速度。换句话说,由于向网络接口Tx 236的分组供应不畅,因此,带宽未被使用(即浪费)。

调度器往返延迟(SRTD)对应于调度器对同一管道的两个连续的检查之间的时间(即,处理器周期数)。为了跟上输出端口235a(即为了避免可用带宽的利用不足),调度器253被配置为比网络接口Tx 236可以发送n个分组更快地调度n个分组。如本文所述,调度器被配置为以对应于每个管道的分组传输速率的速率调度分组,假设没有端口超额预订,如为相关联的管道令牌桶所配置的。因此,管道令牌桶的大小可被设置得足够高以避免由于相对长的持续时间SRTD而导致的溢出,因为这将导致管道的信用损失(因此带宽损失)。

调度器253被配置为将对应于第一数量的分组流的多个分组排列进第二数量的队列以及出列存储的分组,用于通过一个或多个端口253a,...,253n传输。所述第一数量大于或等于所述第二数量。调度器253被配置为利用调度层次结构,例如,调度层次结构500,数据结构,例如,数据结构600和信用逻辑,以做出调度决定,即,为了选择下一出列的分组。

当符合以下准则时,从(子端口S、管道P、流量类别(TC)、队列Q)发送下一分组的调度决定是有利的(即,发送分组):

1.当前子端口S的管道P被其中一个端口磨机选择;

2.业务量类别TC是管道P的最高优先级的活动业务量类别;

3.队列Q是管道P的业务量类别TC中的WRR(加权轮叫)选择的下一队列;

4.子端口S有足够的信用发送分组;

5.子端口S有足够的信用供业务量类别TC发送分组;

6.管道P有足够的信用发送分组;以及

7.管道P有足够的信用供业务量类别TC发送分组。

如果上述条件都满足,那么调度器253被配置为选择分组传输,并且可以从,例如与子端口S、子端口S业务量类别(TC)、管道P、管道P业务量类别TC相关联的令牌桶中减去合适的信用(即令牌)。

在一个实施例中,信用单位涉及分组的长度。例如,信用单位可对应于一个字节,即,多个分组的长度的最大公约数。因此,用于长度为n个字节的分组的传输的信用数量等于(n+h),其中h是每个分组的成帧开销字节的数量。因此,分组信用对应于分组长度加上每个分组的成帧开销字节的数量。例如,与以太网帧相关联的成帧开销字段包括长度为7字节的前导码、长度为1字节的帧分隔符的开始(SFD)、长度为4字节的帧校验序列(FCS)和长度为12个字节的帧间间隙(IFG),总共24个字节。帧校验序列(FCS)可被视为开销,如果它不包含在mbuf分组长度字段中。

在一个实施例中,业务量整形可以在子端口和/或管道级别实现。例如,调度器模块253可被配置为实现业务量整形。业务量整形是限制速度的形式,可以延迟一些分组,以控制(即限制)来自,例如网络设备200的分组的传输速率。延迟的分组将存储在例如队列250中。对于子端口和管道的业务量整形可以每个子端口地使用业务量整形(TS)令牌桶以及每个管道地使用TS令牌桶来实现。每个TS令牌桶都可以使用,例如,饱和的计数器来实现,该计数器被配置为维护可用信用的数量的计数。如果在TS令牌桶中的信用的数量大于或等于分组中的字节的数量加上成帧开销字节,则分组被发送,否则,不发送。

令牌桶可以由两个令牌桶参数来描述。第一桶参数,bucket_rate,对应于向该桶添加信用的速率,单位为每秒信用数。第二桶参数,bucket_size,对应于可存储在桶中的信用的最大数量,单位为信用个数。令牌桶可以通过将桶的内容(即可用信用的数量)设置为预定义的值,例如零或半个bucket_size而进行初始化。所述桶可以被更新,例如,可以向目前在桶中的信用添加信用,周期性地或按要求,至少部分地基于bucket_rate。如本文所描述的,所述桶速率可以根据以下方式确定:bucket_rate=(tb_credits_per_period/tb_period)*r,其中r是端口线速率(以每秒字节数为单位)。桶中的信用总数不得超过bucket_size。因此,当桶已满时可用于添加到桶中的额外的信用将被丢弃。响应于分组调度,信用将被消耗。对应于分组的字节数量加上用于分组的成帧开销的信用数量将从桶中去除。只有当桶中有足够的信用在以发送完全分组(分组的字节和分组的成帧开销)时,该分组才可以被发送)。

可以利用永久数据结构来实现令牌桶。数据结构的元素可以被包括在图6的数据结构600中,例如,包括在子端口表602和/或管道表604。元素可包括上次信用更新的时间(tb_time)、以字节为单位计量的允许信用更新之间的时间段(tb_period)、以字节为单位计量的每tb_period的信用限额(tb_credits_per_period)、以字节为单位计量的桶大小(tb_size)和以字节为单位计量的目前在桶中的信用的数量(tb_credits)。如本文所述,Tb_time可以以字节为单位进行计量,以促进信用消耗操作,因为当前的时间是以字节为单位维护的。信用更新之间的实际时间间隔可以包括一个或多个tb_period。可用信用的数量可以对应于实际时间间隔中的tb_period的数量乘以tb_credits_per_period。

令牌桶操作一般包括初始化、信用更新和信用消耗(例如在分组调度时)。表1包括示出了与本发明一致的示例性TS令牌桶的操作的伪代码。如本文所述,时间对应于当前的处理器时间,以字节为单位。N_periods对应于自上次信用更新后时间间隔中的tb_period的数量。

表1

/*lnitializationa*/

tb_credits=0;or tb_credits=tb_size/2;

/*credit update*/

n_periods=(time-tb_time)/tb_period;

tb_credits+=n_periods*tb_credits_per_period;

tb_credits=min(tb_credits,tb_size);

tb_time+=n_periods*tb_period;

/*credit consumption*/

pkt_credits=pkt len+frame-overhead;

if(tb_credits>=pkt_credits){tb_credits=pkt_credits;}

如表1所示,TS令牌桶可以初始化为零信用或与对应于半个令牌桶容量的多个信用。令牌桶信用更新操作可以发生在出列操作期间,例如流程图900、950。例如,当选择管道(即由管道磨机选择)时,启动信用更新操作。随后信用更新操作可以被配置为更新管道的以及与管道相关联的子端口的各自的TS令牌桶信用。在操作910,在所述管道被选择之后,并且在管道和子端口信用被使用之前(例如,在操作922),管道和子端口的TS令牌桶信用被更新。

在另一个例子中,每次发送分组时,都可以触发信用更新操作。在这个例子中,TS令牌桶信用更新操作可以被配置为更新与分组相关联的子端口和管道的信用。将以计算效率为代价实现相对较高的精度。

在一个实施例中,自上次更新后经过至少一个完整的tb_period,TS令牌桶信用可被更新。在本实施例中,精确度可与速度折衷。可以通过为tb_period选择一个值以满足tb_credits_per_period=1来实现全精度。当小于全精度可以接受时,可以通过将tb_credits_per_period设置为较大的值来实现改进的性能(例如增大的速度)。

作为(即,响应于)分组调度(如操作922)的结果,可在出列操作期间执行TS令牌桶信用消耗操作(如操作924)。如果可用的TS令牌桶信用(例如tb_credits)的数量小于分组信用(即分组长度加上成帧开销),那么不能调度该分组以进行传输。如果可用的TS令牌桶信用的数量大于或等于分组信用,则当调度传输时,可以从TS令牌桶中移除适当数量的信用(例如对应于分组长度加上成帧开销,以字节为单位)。

因此,信用逻辑被配置为在子端口和管道级别提供业务量整形,可以利用TS令牌桶来实现该信用逻辑。与分组速率相关的SLA约束可以通过选择桶参数(例如bucket_rate和/或桶的大小)来实现。

在一个实施例中,可根据严格优先级,调度所选定的管道的业务量类别。例如,调度器253可以被配置为实现严格优先级。业务量类别由以下各项来表征:例如,相关的数据类型的对延迟、抖动、乱序交付等的敏感性。例如,语音数据对延迟和/或抖动是高敏感的,而文件传输是最不敏感的。因此,对于具有4个业务量类别(TC 0、TC 1、TC 2、TC 3)的实施例,语音数据可以对应于最高优先级业务量类别(TC 0),而“尽力而为”文件传输可以对应于最低优先级的业务量类别(TC 3)。因此,严格优先级调度可以被配置为以升序选择业务量类别,如TC 0第一以及TC 3最后。因此,对于具有四种业务量类别和每个业务量类别有四个队列的配置,队列0,...,3可与TC 0相关联,队列4,…,7与TC1相关联等。因此,队列0,…,3将优先于队列4,...,7被调度,并且队列4,...,7优先于队列8,…,11被调度。

管道和子端口级别的业务量类别未被业务量整形,在本上下文中,没有维护令牌桶。可通过定期重新填充子端口业务量类别信用计数器和管道业务量类别信用计数器(每一次为该子端口以及与该子端口相关联的管道调度分组时,都消耗其中的信用),实施子端口和管道级别的业务量类别的分组传输率上限,。与业务量整形不同,业务量类别(TC)信用计数器的更新是以固定时间间隔执行的,而TC信用更新设置TC信用计数器的值。类似于业务量整形,TC信用计数器可在出列操期间进行更新,例如图9A中的操作910。

可以利用永久性数据结构来实现每个TC信用计数器。数据结构的元素可以包括tc_time、tc_period、tc_credits_per_period和tc_credits。Tc_time,以字节为单位,对应于当前子端口和与当前子端口相关联的当前管道的业务量类别(TC)的下一次更新(即配置为实现上限的重新填充)的时间。Tc_period对应于当前子端口和当前管道的TC的连续两次更新之间的时间。Tc_period一般比令牌桶的典型值tb_period大。例如,tc_period可能比tb_period大几倍。tc_credits_per_period对应于可以由当前TC在每个实施时间段tc_period期间消耗的TC信用数量的上限。tc_credits对应于被当前业务量类别在当前实施时间段的剩余时间消耗的TC信用的当前上限。

子端口/管道业务量类别上限实施操作通常包括初始化、TC信用更新和TC信用消耗(例如在分组调度时)。表2示出了包括与本发明一致的子端口/管道业务量类别上限实施操作的示例性伪代码。

表2

/*Initializationa*/

tc_credits=tc_credits_per_period;

tc_time=tc_period;

/*credit update*/

if(time>=tc_time){

tc_credits=tc_credits_per_period;

tc_time=time+tc_period;

}

/*credit consumption*/

pkt_credits=pkt_len+frame_overhead;

if(tc_credits>=pkt_credits){tc_credits-=pkt_credits;}

作为分组调度的结果,所选择的业务量类别上限可以减少对应于以字节为单位的分组长度和报头长度的TC信用的数量。如果在TC的限制(即TC信用计数器)中,当前有足够的TC信用以发送完整的分组信用(分组字节和分组成帧开销),则可以发送分组。

因此,利用TS令牌桶在子端口和管道级别来实现业务量整形是可以的,并且使用TC信用计数器在子端口和管道级别为每个业务量类别实施上限。当管道被例如管道磨机选中时,在出列操作期间,信用可以被更新(即,添加),例如在图9A的操作910中。当分组被选择(即调度)以进行传输时,信用可被消耗掉,例如在图9B的操作924中。

在一个实施例中,可以根据轮叫技术来调度选定的业务量类别内的队列,例如在图9A的操作913中。例如,调度器253可以被配置为实现轮叫技术。轮叫可在字节级、分组的长度相关的字节级实现和/或可以进行加权。字节级轮叫可称为“公平排队”,而字节级加权轮叫可称为“加权公平排队”。所使用的技术至少部分地基于所选择的业务量类别的队列的一个或多个特性,例如,在所选择的业务量类别中的所有队列是否为活动的(即不为空)、队列是否为得到同等的权重和/或所有的分组是否相等(即具有相等的长度)。

如果所选择的业务量类别中的所有队列是活动的并且被平均加权,且所有的分组长度相等,则可以根据字节级轮叫来调度队列。例如,可以根据队列#i,i=(i+1)%n,选择下一队列,其中的队列索引为i,%是模整数余数运算符,n是队列的数量。换句话说,四个队列的顺序可以被选择为队列#0、队列#1、#队列2、队列#3、队列#0等。

如果所选择的业务量类别中的所有队列是活动的并且被平均加权,但不是所有的分组长度都相等,则可以根据分组的长度相关的字节级轮叫来调度队列。在这种情况下,从队列#i中消耗一个字节对应于正好消耗队列#i的一个令牌。以前从队列#i中消耗的令牌的累积数,T(i)可以被维护。每次从队列#i中消耗分组时,T(i)都被更新为:T(i)+=pkt_len。换句话说,所消耗的分组的以字节为单位的长度被添加到T(i)。然后可以选择下一队列,下一所选择的队列是具有最小的T值的队列。

如果所选择的业务量类别的所有队列都是活动的,但是不是所有的队列都被平均加权,且不是所有的分组长度都相等,则可以根据分组的长度相关的字节级加权轮叫来调度队列。,可以通过使用每个字节的成本(其对每个队列都是不同的),使分组的长度相关的字节级加权轮叫对应于分组长度相关的字节级轮叫。有较低权重的队列的每字节成本较高。如此,可以促进不同的队列的消耗之间的比较,以便选择下一队列。例如,w(i)可以被定义为队列#i的权重,t(i)被定义为队列#i的每字节的令牌,并且等于队列#i的权重值的倒数。例如,如果对于四个队列(即i=0,1,2,3),W[0…3]=[1:2:4:8],则t[0…3]=[8:4:2:1],并且如果W[0…3]=[1:4:15:20],则t[0…3]=[60:15:4:3]。在第二个例子中,权重倒数已被缩放,使得所得到的令牌是整数。从队列#i消耗一个字节对应于消耗队列#i的T(i)令牌。T(i)是先前从队列#i所消耗的令牌的累加数。每次从队列#i消耗分组时,T(i)被更新为:T(i)+=pkt_len*t(i)。换句话说,分组长度与每个字节的令牌数的乘积被加到令牌的累积数。下个所选择的队列是带有最小的T值的队列。

如果不是所选择的业务量类别的所有队列都是活动的,并且不是所有的队列都被平均加权,且不是所有的分组长度都相等,则可以根据具有可变队列状态的分组的长度相关的字节级加权轮叫来调度队列。可通过将非活动的队列的消耗设置为高值,使具有可变队列状态的分组的长度相关的字节级加权轮叫对应于分组的长度相关的字节级加权轮叫,,从而使非活动队列将不会被最小T逻辑选择。

为了防止由于连续累加而导致T(即队列的令牌的累计数)溢出,对于所有的队列,在每一个分组消耗之后,可以截断T(i)。例如,通过从T(i),i=0…n中减去最小值T(例如1000),T[0…3]=[1000,1100,1200,1300]可以被截断为T[0…3]=[0,100,200,300]。

具有可变队列状态的分组的长度相关的字节级加权轮叫假设在一组输入队列中至少有一个活动队列。这种假设通常是被满足的,因为出列状态机被配置为选择活动队列。队列#i的饱和掩码可以定义为:掩码(i)=(队列#i为激活状态)?0:0xFFFFFFFF,其中,?是条件运算符。因此,如果队列#i是活动的,则掩码(i)是零,并且如果队列#i是不活动的,则掩码(i)是0xFFFFFFFF。类似于分组长度有关的字节级加权轮叫,w(i)对应于队列#i的权重,t(i)对应于队列#i的每字节的令牌,并被定义为队列#i的权重的倒数,T(i)是以前从队列#i所消耗的令牌的累加数,并且下一队列是具有以前从队列#i所消耗的令牌的最小累加数的队列。在从队列#i消耗分组之前,T(i)为掩码(i)的逐位或运算:T(i)|=掩码(i),并且T(i)的值被保存为T(j),其中j对应于队列索引。在从队列#i消耗分组之后,T(j)和T(i)被更新为:T(j)-=T(i),j≠i并且T(i)=pkt_len*t(i)。换句话说,对于每个队列索引j,新的(即消耗分组后)T(j)被确定为旧的(即消耗分组之前)T(j)和刚从其消耗了分组的队列(即队列#i)之外的队列的当前的T(i)之间的差值。随后,队列#i的令牌累加数(即T(i))是分组长度和队列#i的每字节的令牌数的乘积。利用掩码(i)、T(j),并将T(j)更新为:T(j)-=T(i),j≠i被配置为对于不活动的队列,使T(i)变成相对较大,以使非活动队列不被最小T逻辑选择。

因此,轮叫可以用于选择下一队列。轮叫可以被加权并且可以在字节级和/或在分组的长度相关的字节级实现。轮叫可以被配置为接纳非活动队列、至少一个队列的不等的权重和/或不同长度的分组。响应于分组的调度(例如操作922),令牌T(ⅰ)的累积数量可在出列操作中(例如操作924)被更新。

在某些情况下,子端口业务量类别,如业务量类别X,可能被在子端口成员管道级别被分配给业务量类别X比在父子端口级上分配给业务量类别X更多的带宽超额订购。子端口业务量类别超额订购可以允许更高优先级的业务量类别没有使用的带宽被低优先级业务量类别使用(即共享)。在配置时间,对于所选的业务量类别,子端口业务量类别超额订购可以被启用,并且通常对于最低优先级的业务量类别(例如尽力而为业务量类别)启用。对于特定子端口和业务量类别的超额订购的存在是管道和子端口级别配置的结果,而不是由于业务量量负荷在运行时的动态演变而发生(如拥塞)。在操作中,当当前子端口的对业务量类别X的总需求低时(即比子端口级别的业务量类别X的分配要小),则对于所有成员管道,对业务量类别X的需求完全被满足。然而,当所有子端口成员管道的对业务量类别X的累加需求超过了在子端口级别所配置的限制时,可能不能满足所有的管道的需求。

在一个实施例中,与本发明相一致的系统和方法被配置成动态地管理子端口的业务量类别的超额预订。例如,调度器模块253可以被配置为管理子端口业务量类别超额预订。在本实施例中,对于业务量类别X,在子端口级别,在运行时,可以给每个子端口成员管道分配可用带宽的相同份额。较低需求的管道未使用的带宽将重新平均分配给需求相对高的管道。如此,属于较高需求管道的业务量类别X的分组将被限制,而属于较低需求管道的业务量类别X的分组不受影响。另外,可用的带宽可以被共享,因此可以被更充分地利用。

子端口业务量类别超额订购管理被配置为至少部分地基于子端口成员管道所体验的当前的需求,确定水印(即阈值),并周期性地更新水印。水印可以用来限制每个管道被允许发送的业务量类别X的业务量。例如,对于四个(即TC0、TC1、TC2、TC3)业务量类别的配置,业务量类别X可对应于业务量类别TC3(例如,尽力而为)。在本实施例中,对于所有子端口成员管道,假定子端口TC3的上限(例如tc_credits)被设置为子端口速率的100%,并且管道TC3的上限(例如tc_credits)被设置为所有子端口成员管道的管道速率的100%。

可以在每一业务量类别上限实施周期的开始,在子端口级别,确定水印。然后,可以将水印传播到所有子端口成员管道,并且可以在整个当前实施周期被所有的子端口成员管道利用。表3示出了水印传播的一个例子。

表3

------

/*lnitialization*/

/*subport level*/

subport_period_id=0

/*pipe level*/

pipe_period id=0

/*credit update*/

/*subport level*/

if(time>=subport_tc_time){

subport_wm=water_mark_update();

subport_tc_time=time+subport_tc_period;

subport_period_id++;

}

/*pipe level*/

if(pipe_period_id!=subport_period_id){

pipe_ov_credits=subport_wm木pipe_weight;

pipe_period ID=subport_period_id;

}

/*credit consumption*/

/*pipe level*/

pkt_credits=pk_len+frame_overhead;

if(pipe_ov_credits>=pkt_credits){

pipe_ov_credits-=pkt_credits;

}

在当前实施周期的开始(与前一实施周期的结束重合),可以至少部分地基于在前一个周期的开始分配给TC 3的,在前一周期的结束时没有被子端口成员管道所使用的带宽量,来调整水印的值。。

如果有未被使用的子端口TC 3带宽,那么,可增大当前周期的水印值,以便鼓励子端口成员管道消耗更多的带宽。否则,可降低水印值,,以在TC 3的子端口成员管道之间实施相等的带宽消耗。

水印值的增加或减少可以以相对较小的增量来进行,因此,可以在多个实施周期内到达平衡状态。这种状态可能随时会改变,因为TC3的子端口成员管道体验需求变化,例如,由于需求的增大(当水印应该降低时)或需求减少时(当水印应该增大时)所致。

当需求低时,水印可以设置得相对较高,以使水印不会阻碍子端口成员管道消耗更多的带宽。可以选择水印的最高值作为为子端口成员管道所配置的最高速率。表4包括了示出水印操作的伪代码的一个例子。

表4

/*lnitialization*/

/*subport level*/

WM=WM_MAX

/*credit update*/

/*subport level(water_mark_update)*/

tc0_cons=subport_tc0_credits_per_period-subport_tc0_credits

tcl_cons=subport_tcl_credits_per_period-subport_tcl_credits

tc2_cons=subport_tc2_credits_per_period-subport_tc2_credits

tc3_cons=subport_tc3_credits_per_period-subport_tc3_credits

tc3_cons_max=subport_tc3_credits_per_period-(tc0_cons+tc1_cons+tc2_cons);

if(tc3_consumption>(tc3_consumption_max-MTU)){

wm-=wm>>7;

if(wm<WM_MIN)wm=WM_MIN;

}else{

wm+=(wm>>7)+1;

if(wm>WM_MAX)wm=WM_MAX;

}

因此,可管理子端口业务量类别超额订购,并且未使用的带宽可以被低优先级的业务量类别进行共享。因此,可用的带宽可被更充分地利用。

因此,调度器模块,例如调度器253,被配置为对于网络设备实现业务量管理。调度器可以包括大约数万的队列,所述队列被配置为存储与,例如几万或更多业务量流相关联的分组。换句话说,多个流可以被映射到队列中,从而,业务量流的数量可以大于或等于队列的数量。如本文所述,调度器被配置为利用调度层次结构和相关联的数据结构,以支持业务量管理操作。

在一个实施例中,网络设备200(例如监管器模块247)可以被配置为实现业务量监管。业务量监管通常被配置为将业务量流限制为可以由,例如SLA指定的速率。监管可以包括计量、标记和/或丢弃由网络设备200接收到的分组。监管可以包括单速率三色标记(srTCM)和/或双速率三色标记器(trTCM),它们可以符合或兼容于由互联网工程任务组(IETF)于1999年9月公布的标题为A Single Rate Three Color Marker(单速率三色标记器)的RFC2697和/或标题为A Two Rate Three Color Marker(双速率三色标记器)的RFC2698。计量被配置来确定所接收到的分组是否是在一个或更多流速率限制之内,标记(例如将接收到的分组标记为绿色、黄色或红色)被配置为指出计量的结果。

监管器模块247被配置为实现可以用于计量的一个或多个令牌桶。令牌桶被配置为对于相对小的带宽业务量流(例如大约每秒几十兆比特的线路速率)以及对于相对高的带宽业务量流(例如大约每秒几个、数十或更高吉比特的线路速率),提供相对高的精确度(例如大约1%)。如本文所述,在一些实施例中,精度是可配置的。令牌桶可以使用轮询模式,而不是中断模式来实现,并且被配置为利用时间戳寄存器,例如时间戳寄存器223,而不是高精度计时器。可以在没有对于令牌桶更新的硬性的截止时间的情况下,实现令牌桶(例如不使用可能会影响性能的周期性的计时器回调)。

一般来说,srTCM技术为每个业务量流定义了两个令牌桶(标记为承诺和多余),两个桶共享相同的令牌更新速率。可以以承诺信息速率(CIR)参数所定义的速率(以每秒IP(互联网协议)分组字节为单位)给“承诺”桶供应令牌。“承诺”桶的大小由承诺突发大小(CBS)参数定义(以字节为单位)。可以以与承诺桶相同的速率给“多余”桶供应令牌。“多余”桶的大小由多余突发大小(EBS)参数定义(单位为字节)。

一般来说,trTCM技术为每个流量流定义了两个令牌桶,两个桶(标记为承诺和峰值)以独立速率利用令牌来更新。类似于srTCM技术,可以以由CIR参数所定义的速率给承诺桶供应令牌,承诺桶大小由CBS参数来定义(以字节为单位)。可以以由峰值信息速率(PIR)参数所定义的速率给峰值桶供应令牌。P桶的大小由峰值突发大小(PBS)参数定义(以字节为单位)。

对于srTCM和trTCM两者,当输入颜色设置为绿色时,彩色盲模式在功能上等效于彩色感知模式。对于色彩感知模式,具有红色的输入颜色标记的分组只用红色的输出颜色来标记,而标记为黄色的输入颜色的分组可以用黄色或红色的输出颜色来标记。在适当情况下,可以实现截然不同于色彩感知模式的色彩盲模式,因为色盲模式相比彩色感知模式计算量不是那么大。

对于每一个输入分组,srTCM和/或trTCM技术的操作包括更新承诺和过量(对于srTCM)或峰值(对于trTCM)令牌桶。例如,可以从处理器时间戳寄存器读取当前时间,可以识别自上次桶更新的时间量,可以计算相关联的令牌数(根据预先配置的桶速率)。桶中的令牌数被预先配置的桶大小所限制。可以基于IP分组的大小和在承诺与过量(srTCM)或峰值(trTCM)的桶中当前可用的令牌数量来确定当前分组的输出颜色。对于颜色感知模式,也可以考虑分组的输入颜色(如果有的话)。当输出颜色不是红色的时,则从承诺和/或过量(srTCM)或承诺和/或峰值(trTCM)中减去等于IP分组的长度的令牌的数量,这取决于技术和分组的输出颜色。

与本发明一致的被用于监控的令牌桶被配置为使用多个输入参数。输入参数包括HZ,每秒处理器周期的数目(即处理器频率)、对应于当前时间的时间和对应于流量流速率(每秒字节数)的tb_rate。可以通过读取处理器时间戳计数器(例如时间戳寄存器223)来获取时间,因此以处理器周期来计量。

令牌桶可利用每个业务量流的永久性数据结构。例如,数据结构可以包括,tb_time、tb_tokens、tb_size、tb_period和tb_tokens_per_period。tb_time对应于令牌桶的最新更新的时间。tb_tokens对应于令牌桶中的当前的可用令牌的数量。通常,一个令牌对应于一个字节的分组数据。tb_size是令牌桶的上限。tb_period对应于计量令牌桶更新周期,即对于每一次桶更新可以消失的处理器周期的数量。tb_tokens_per_period对应于在每次更新时要添加到令牌桶的令牌的数量。tb_period和tb_tokens_per_period可用来对于相对较小带宽业务量和对于相对高带宽业务量两者,实现相对高的精度(例如大约1%)。

图13示出了与本发明的一个实施例相一致的被配置为初始化令牌桶的示例性操作的流程图1300。例如,操作可以由监管器模块247来执行。流程图1300的操作开始于初始化1302。操作1304包括设置最小计量令牌桶更新周期TB_PERIOD_MIN(即对于每一次令牌桶更新,可以消失的处理器周期的最小数)。TB_PERIOD_MIN的值是可配置的,与令牌桶操作的容差(即期望的精确度)相关。例如,TB_PERIODA_MIN可被设置为100,对应于1%的容差。操作1306包括确定计量令牌桶更新周期tb_period(对于每一次令牌桶更新,可以消失的处理器周期的数量)。tb_period可以被确定为每秒处理器周期的数目除以业务量流速率(每秒字节数)。因此,tb_period相当于业务量流的每个字节的处理器周期。

在操作1308可以确定计量令牌桶更新周期是否大于或等于最小计量令牌桶更新周期。如果计量令牌桶更新周期大于或等于最小计量令牌桶更新周期,则在操作1310,可将每次更新要添加到令牌桶的令牌数设定为1。程序流程在操作1316结束。如果计量令牌桶更新周期不大于或等于最小计量令牌桶更新周期,那么可以在操作1312确定在每次更新时要添加到令牌桶的令牌数。可接着在操作1314确定计量令牌桶更新周期。程序流程在操作1316结束。

表5包括示出了与本发明的一个实施例相一致的初始化令牌桶的伪代码的一个例子。表5的示例性伪代码是流程图1300的操作的一个例子。

表5

/*Token bucket initialization*/

TB_PERIOD_MIN=100;/*Configurable,set to 100 for l%tolerance*/

tb_period=HZ/tb_rate;/*Floating point division*/

if(tb_period>=TB_PERIOD_MIN)

tb_tokens_per_period=1;

else{

tb_tokens_per_period=ceil(TB_PERIOD_MIN/tb_period);/*Round up to the nextinteger of floating point division result*/

tb_period=(HZ*tb_tokens_per_period)/tb_rate;}

在第一个例子中,对于带有具有2.5GHz(千兆赫)的处理器频率(HZ)的处理器以及配置了11Mbps(每秒兆比特)的线路速率的网络接口的网络设备,业务量流速率(tb_rate)为l.375兆字节每秒。Tb_period可确定为2.5GHz/1.375兆字节每秒=1818.18周期/字节。对于100的TB_PERIOD_MIN,tb_period大于TB_PERIOD_MIN,从而tb_tokens_per_period可以被设置为1。

在第二示例中,使用相同的处理器和相同TB_PERIOD_MIN=100,但具有7Gbps的线路速率,tb_rate是每秒0.875千兆字节,tb_period为每字节2.86个周期。因为tb_period不大于或等于TB_PERIOD_MIN,tb_tokens_per_period被确定ceil(100/2.86)=ceil(34.96)=35。然后,新的tb_period可确定为(HZ*tb_tokens_per_period)/tb_rate=(2.5千兆赫*35)/0.875千兆字节/秒=100。因此,对于每100个处理器周期,35个令牌可以被添加到令牌桶。

第一示例对应于相对低带宽线路速率,而第二示例对应于相对高带宽线路速率。令牌是不连续的,即每个令牌都对应于一个字节,在整数个处理器周期(即tb_period),令牌可被添加到令牌桶。如果处理器的频率不是业务量流速率的整数倍,则处理器频率除以流量流速率的结果可以被截断。在第一个例子中,将1818.18截断为1818,对精度导致低于百分之一的影响。在第二示例中,例如,将2.86截断为2,导致约30%的错误。

流程图1300的操作和表5中的伪代码被配置为减少相对高带宽流的错误,而不会影响相对低带宽流。令牌被添加到令牌桶的总速率(以及由令牌桶实现的相关联的计量)不会被流程图1300的操作改变。相反,可以以对应于多个处理器周期的间隔添加多个令牌。例如,在第二个例子中,100个处理器周期除以35个令牌(即字节)对应于每2.86个处理器周期1个令牌。对于100个处理器周期的间隔,正负1个处理器周期的变化对应正负1%。因此,对于相对高的速率的业务量流,可以实现计量,并可以保持计量精度。

图14示出了与本发明的一个实施例相一致的被配置为更新令牌桶的示例性操作的流程图1400。例如,操作可以由监管器模块247响应于新的分组到达网络设备200来执行。流程图1400的操作开始于更新1402。在操作1404确定最近的桶更新以来的桶更新间隔的数量(即计量令牌桶更新周期数)。在操作1406中可以确定(即更新)最近桶更新的时间。在操作1408中可以更新可用的令牌的数量。例如,可以至少部分地基于自从最近桶更新之后桶更新间隔的数量以及在每一次更新时要添加到令牌桶的令牌的数量,来更新可用令牌的数量。在操作1410中可以确定可用的令牌的数量是否超过令牌桶的上限。如果可用的令牌的数量超过了令牌桶的上限,则在操作1412可以将桶中的可用令牌数量设置为上限。更新可以在操作1414结束。

表6包含了示出与本发明的一个实施例相一致的更新(即补充)令牌桶的伪代码的一个例子。表6的示例性伪代码是流程图1400的操作的一个例子。

表6

/*Token bucket update(replenish)run-time operation.Executed on new packet arrival*/

n_periods=(time-tb_time)/tb_period;

tb_time+=n_periods*tb_period;

tb_tokens+=n_periods*tb_tokens_per_period;

if(tb_tokens>tb_size)

tb_tokens=tb_size;

图15示出了与本发明的一个实施例相一致的被配置为消耗令牌的示例性操作的流程图1500。例如,操作可以由监管器模块247响应于新的分组到达网络设备200而执行。流程图1500的操作开始于消耗1502。可以在操作1504确定桶中当前可用令牌的数量是否大于或等于分组长度。如果桶中当前可用令牌的数量大于或等于分组长度,则在操作1506,从可用的令牌数量中减去分组的长度。如果桶中当前可用的令牌数量小于分组的长度,那么程序流程可以在操作1508结束。

表7

/*Token bucket consumption run-time operation*/

/*Executed on new packet arrival,after the update operation*/

if(tb_tokens>=pkt_len)

tb_tokens-=pkt_len;

因此,业务量监管可以使用一个或多个令牌桶来实现。令牌桶可以配置有容差,所述容差可由例如服务提供商进行选择。业务量,容差被配置为促进针对相对高和相对低的带宽流的计量和计量精度。

图16A和16B包括与本发明的实施例相一致的被配置为示出示例性的分层调度器的性能的两个图1606、1608。如本文所述,示例性分层调度器被实现有64K活动队列、业务量整形、严格优先级和加权轮叫。调度器是在以2.7GHz操作的处理器核上实现的。图1606和1608示出了每个处理器核的调度器的性能。图1606以每秒百万分组数—以字节为单位的分组大小示出了一个10GbE端口的吞吐速率、线路速率以及2个10GbE端口的线路速率。图1608以每秒千兆比特数—以字节为单位的分组大小示出了一个10GbE端口的吞吐速率、线路速率以及2个10GbE端口的线路速率。

虽然图7、9A、9B、13、14和/或15示出了根据各个实施例的各种操作,但应当理解的是,并不是图7、9A、9B、13、14和/或15绘出的所有操作都是其它实施例所必须的。事实上,在此完全设想,在本发明的其它实施例中,图7、9A、9B、13、14和/或15绘出的所有操作和/或本文所述的其它操作可以在任何附图中未具体示出的方式进行组合,但仍然与本发明一致。因此,针对并没有完全准确地在一个附图中示出的功能和/或操作的权利要求被视作在本发明的内容和范围内。

以上提供了示例性系统的体系结构和方法,但是,针对本发明的修改是可以的。处理器可以包括一个或多个处理器核,并且可以被配置为执行系统软件。系统软件可包括,例如操作系统。设备存储器可以包括被配置为存储一个或多个要通过网络接口发送或接收的分组的I/O存储器的缓存。

操作系统(OS)可以被配置为管理系统资源和控制在,例如网络设备200上运行的任务。例如,操作系统可以使用Microsoft Windows、HP-UX、Linux或UNIX来实现,虽然也可以使用其它操作系统。在一些实施例中,OS可以由虚拟机监视器(或系统管理程序)代替,虚拟机监视器可以向在一个或多个处理器上运行的各种操作系统(虚拟机)提供底层硬件的抽象层。操作系统和/或虚拟机可以实现一个或多个协议栈。协议栈可以执行一个或多个程序来处理分组。协议栈的一个例子是TCP/IP(传输控制协议/英特网协议)协议栈,其包括用于处理(例如处理或生成)分组以在网络上发送和/或接收的一个或多个程序。

设备存储器和/或网络接口存储器可以包括一个或多个下列类型的存储器:半导体固件存储器、可编程存储器、非易失性存储器、只读存储器、电可编程存储器、随机存取存储器、闪存储器、磁盘存储器和/或光盘存储器。另外地或替代性地,系统存储器可包括其他和/或以后开发计算机可读存储器类型。

本文所描述的操作的实施例可以在系统中实现,该系统包括一个或多个存储设备,其上单独地或组合地存储指令,当由一个或多个处理器执行指令时执行所述方法。处理器可以包括,例如,网络设备200中的处理单元和/或可编程电路,和/或网络接口216中的其它处理单元或可编程电路。因此,根据本文中所描述的方法的操作可以被分配在多个物理设备上,诸如在多个不同物理位置的处理结构。存储设备可以包括任何类型的有形的、非短暂性存储装置,例如,任何类型的盘,包括软盘、光盘、致密盘只读存储器(CD-ROM)、可重写光盘(CD-RW)及磁光盘、半导体器件,例如只读存储器(ROM)、随机存取存储器(RAM)、诸如动态和静态RAM、可擦除可编程只读存储器(EPROM),电可擦除可编程只读存储器(EEPROM)、闪存存储器、磁或光卡或任何类型的适合于存储电子指令的存储设备。

如在此处任何实施例所用的“电路”,可包括,例如,单独地或以任何组合的,硬连线电路、可编程电路、状态机电路和/或存储由可编程电路执行的指令的固件。“模块”,如本文所使用的,可以包括,单独地或以任何组合的电路和/或代码和/或指令集(例如软件、固件等)。

在一些实施例中,硬件描述语言可被用于指定本文所描述的各种模块和/或电路的电路和/或逻辑实现。例如,在一个实施例中,硬件描述语言可以符合或兼容于超高速集成电路(VHSIC)硬件描述语言(VHDL),该语言可以实现本文所述的一个或多个电路和/或模块的半导体制造。VHDL符合或兼容于IEEE标准2076-1987,IEEE标准2076.2,IEEE1076.1,IEEE草案3.00F VHDL-2006,IEEE草案4.0 VHDL-2008和/或其他版本的IEEE VHDL标准和/或其他硬件描述标准。

服务提供商网络102和/或其他网络106可以包括分组交换网络。网络设备108a,...,108n、其他网络106和/或客户端系统104A,...,104n能够使用所选择的分组交换网络通信协议相互通信。一个示例性通信协议可包括以太网协议,该协议能够允许使用传输控制协议/互联网协议(TCP/IP)的通信。以太网协议符合或兼容于由电气和电子工程师协会(IEEE)公布的、发表于2008年12月名为“IEEE 802.3标准”的以太网标准和/或更高版本的此标准。备选地或附加地,网络设备108a,...,108n、其他网络106和/或客户端系统104A,...,104n能够使用X.25通信协议相互通信。X.25通信协议符合或兼容于由国际电信联盟电信标准化部门(ITU-T)颁布的标准。备选地或附加地,网络设备108a,...,108n、其他网络106和/或客户端系统104A,...,104n能够使用帧中继通信协议相互进行通信。帧中继通信符合或兼容于国际电报电话咨询委员会(CCITT)和/或美国国家标准学会(ANSI)公布的标准。备选地或附加地,网络设备108a,...,108n、其他网络106和/或客户端系统104A,...,104n能够使用异步传输模式(ATM)的通信协议相互通信。ATM通信协议符合或兼容于ATM论坛公布的、发表于2001年8月、名为“ATM-MPLS网络互通2.0”的ATM标准和/或更高版本的此标准。当然,不同的和/或之后开发的面向连接的网络通信协议都同样在此预期。

因此,与本发明一致的系统和方法被配置为利用可编程的网络设备,来提供可编程的出口业务量管理。系统和方法被配置为跨一个或多个处理器核和/或一个或多个线程,分配与,例如大约数万或更多的分组流相关联的处理负载。分组处理可以被流水线化。系统和方法被配置为对于排列操作,对多个分组并行地操作,对于出列操作,对多个管道并行地操作,因此,“隐藏”预取延迟。

分组流可以被分组为包括多个级别的调度层次结构,以促进业务量管理功能。在一个或多个级别实现的业务量管理功能包括业务量整形、上限实施,严格优先级调度和加权轮叫。使用信用逻辑来实现至少一些业务量管理功能。

利用被配置为智能地丢弃分组的随机早期检测,可以实现拥塞管理。可以使用被配置为对于相对高带宽和相对低带宽的业务量流两者都提供相对高精度的令牌桶结构来实现业务量监管。

因此,本发明提供了一种示例性网络设备。该示例性网络设备包括其中包括至少一个处理器核的处理器,;被配置为以线路速率发送和接收分组的网络接口;被配置用于存储调度器分层数据结构的存储器;以及调度器模块。调度器模块被配置为预取下一活动的管道结构,所述下一活动的管道结构被包括在分层数据结构中,更新当前管道和相关联的子端口的信用,至少部分地基于当前管道数据结构,来识别当前管道内的下一活动的业务量类别,选择与所识别的下一活动的业务量类别相关联的下一队列,并且,如果可用的业务量整形令牌桶信用以及可用的业务量类别信用大于或等于下一分组信用,则调度从所选择的下一队列的下一分组,以供通过网络接口传输。

本发明还提供了一种示例性方法。该示例性方法包括:由调度器模块预取下一活动的管道结构,所述下一活动的管道结构被包括在分层数据结构中;由调度器模块更新当前管道和相关联的子端口的信用;由调度器模块至少部分地基于当前的管道数据结构,识别当前管道内的下一活动的业务量类别;由调度器模块选择与被识别的下一活动的业务量类别相关联的下一队列;并且,如果可用的业务量整形令牌桶信用以及可用的业务量类别信用大于或等于下一分组信用,则由调度器模块从所选择的下一队列调度下一分组,供进行传输。

本发明还提供了一个示例性系统,该系统包括一个或多个存储设备,其上单独地或组合地存储指令,当由一个或多个处理器执行指令时导致以下操作,包括:预取下一活动的管道结构,所述下一活动的管道结构被包括在分层数据结构中;更新当前管道和相关联的子端口的信用;至少部分地基于当前的管道数据结构,识别当前管道内的下一活动的业务量类别;选择与被识别的下一活动的业务量类别相关联的下一队列;并且,如果可用的业务量整形令牌桶信用以及可用的业务量类别信用大于或等于下一分组信用,则从所选择的下一队列调度下一分组,供进行传输。

在本文中采用的术语和表达被用作描述的术语而不是限制,并且在使用这些术语和表达时,没有意图排除所示出的和所描述的特征(或其部分)的任何等效特征,并且应认识到,权利要求书的范围内的各种修改是可能的。因此,权利要求旨在覆盖所有这些等效内容。

本文描述了各种特征、方面和实施例。如本领域的技术人员所理解的,所述特征、方面和实施例可以彼此相结合,并可以变化和修改。因此,本发明应当被视为包括这样的组合、变化和修改。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1