一种多核无锁速率限制装置和方法与流程

文档序号:18622087发布日期:2019-09-06 22:35阅读:316来源:国知局
一种多核无锁速率限制装置和方法与流程

本发明要求2017年1月25日递交的发明名称为“一种多核无锁速率限制装置和方法”的第15/415,329号美国非临时专利申请案的在先申请优先权,该在先申请的内容以引入的方式并入本文中。



背景技术:

现代通信网络支持异构流量,可以包括电影下载、消息传送、文件传输、web流量和交互流量。不同类型的流量可能具有不同的流量模式,对网络资源的要求和约束也不同。调度器通常用于调度多个流在特定传输带宽上进行传输。网络性能在很大程度上依赖于调度器的性能。



技术实现要素:

在第一实施例中,本技术涉及一种装置,包括:接收器,用于接收多个数据包;存储器,用于存储指令并形成第一和第二虚拟队列集,以存储所述多个数据包;处理器,具有一个或多个内核,所述内核具有一个或多个包分类器,用于对所述多个数据包中的数据包进行分类。所述处理器与所述存储器通信,用于执行指令,以便基于所述分类将所述数据包从所述接收器传输至所述第一虚拟队列集中的虚拟队列。所述处理器还用于基于与所述虚拟队列相关联的需求速率值和供给速率值将所述数据包从所述虚拟队列传输至发送器。

根据所述第一实施例,在第二实施例中,所述处理器中的第一内核包括用于访问所述第一虚拟队列集的第一包分类器,所述处理器中的第二内核包括用于访问所述第二虚拟队列集的第二包分类器。

根据所述第一至第二实施例,在第三实施例中,所述第一虚拟队列集具有相关联的第一需求速率值集和相关联的第一供给速率值集,其中所述需求速率值包括在所述相关联的第一需求速率值集中并由所述第一内核计算,所述供给速率值包括在所述相关联的第一供给速率值集中并由另一内核计算。

根据所述第一至第三实施例,在第四实施例中,所述第二虚拟队列集具有相关联的第二需求速率值集和相关联的第二供给速率值集。

根据所述第一至第四实施例,在第五实施例中,所述第一内核计算所述相关联的第一需求速率值集,所述第二内核计算所述相关联的第二需求速率值集。

根据所述第一至第五实施例,在第六实施例中,另一内核包括在与调度器通信的网络控制器中。所述网络控制器计算所述相关联的第一供给速率值集和所述相关联的第二供给速率值集。

根据所述第一至第六实施例,在第七实施例中,所述第一内核将所述相关联的第一需求速率值集写入非瞬时性存储器,所述第二内核将所述相关联的第二需求速率值集写入所述非瞬时性存储器。所述网络控制器从所述非瞬时性存储器读取所述相关联的第一和第二需求速率值集。

根据所述第一至第七实施例,在第八实施例中,所述网络控制器将所述相关联的第一和第二供给速率值集写入所述非瞬时性存储器。所述第一内核读取所述相关联的第一供给速率值集,所述第二内核读取所述相关联的第二供给速率值集。

根据所述第一至第八实施例,在第九实施例中,所述需求速率值基于时间量和到达所述虚拟队列的数据包数目来计算。

根据所述第一至第九实施例,在第十实施例中,所述供给速率值基于所述需求速率值和承诺速率来计算。

在第十一实施例中,本技术涉及一种用于传输多个数据包的网络。所述网络包括非瞬时性存储器,所述非瞬时性存储器包括第一虚拟队列集和第二虚拟队列集,其中所述第一虚拟队列集具有第一需求速率值集和第一供给速率值集,所述第二虚拟队列集具有第二需求速率值集和第二供给速率值集。第一处理器包括第一内核,所述第一内核具有接收器和第一包分类器,其中所述接收器用于接收所述多个数据包中的第一数据包,所述第一包分类器用于对所述第一数据包进行分类。所述第一包分类器基于所述第一数据包的分类,将所述第一数据包输出到所述第一虚拟队列集中的第一虚拟队列。所述第一内核计算所述第一需求速率值集。第二内核同样具有接收器和第二包分类器,其中所述接收器用于接收所述多个数据包中的第二数据包,所述第二包分类器用于对所述第二数据包进行分类。所述第二包分类器基于所述第二数据包的分类,将所述第二数据包输出到所述第二虚拟队列集中的第二虚拟队列。所述第二内核计算所述第二需求速率值集。第二处理器基于所述第一和第二需求速率值集来计算所述第一和第二供给速率值集,基于所述第一和第二供给速率值集来输出一个或多个控制信号,以从所述第一和第二虚拟队列输出所述第一和第二数据包。

在第十二实施例中,本技术涉及一种计算机实现的方法,用于限制多个数据包的传输。所述方法包括接收所述多个数据包中的数据包,对所述数据包进行分类以获得所述数据包的分类。基于所述分类将所述数据包传输至多个虚拟队列中的虚拟队列并存储在所述虚拟队列中。计算多个虚拟队列的多个需求速率值。基于所述多个需求速率来计算多个虚拟队列的多个供给速率值。基于与所述虚拟队列相关联的供给速率来输出存储在所述虚拟队列中的所述数据包。

提供本发明内容是为了以简化的形式引入概念的选择,这些概念将在以下具体实施方式中进行进一步的描述。本发明内容和/或标题的目的不在于识别权利要求书保护的主题的关键特征或必要特征,也不在于协助确定权利要求书保护的主题的范围。权利要求书保护的主题不限于用于解决提到的任何或全部缺点的实现方式。

附图说明

图1是本技术实施例提供的一种用于实现多核无锁速率限制装置的网络的框图;

图2示出了本技术实施例提供的多个内核和虚拟队列;

图3a至图3c示出了本技术实施例提供的针对需求速率值、供给速率值和输出速率的等式;

图4示出了本技术实施例提供的一种网元;

图5示出了本技术实施例提供的一种软件架构;

图6示出了本技术实施例提供的数据包处理伪指令;

图7示出了本技术实施例提供的调度/供给速率更新伪指令;

图8是本技术实施例提供的一种用于操作网络的方法的流程图;

图9a至图9c示出了本技术实施例提供的示图;

图10示出了本技术实施例提供的实验结果表;

图11示出了本技术实施例提供的不同qos类数的最大速率;

图12示出了本技术实施例提供的实验结果。

除非另有指示,否则不同图中的对应标号和符号通常指代对应部分。绘制各图是为了清楚地说明实施例的相关方面,因此未必是按比例绘制的。

具体实施方式

本技术大体涉及一种多核无锁网络控制流量装置和方法。虚拟类队列用于隔离处理器的不同内核对同一队列的同时访问。诸如需求速率值和供给速率值之类的附加参数用于虚拟队列,以同步不同内核之间的服务质量(qualityofservice,简称qos)约束。在一实施例中,与专用硬缓冲不同,虚拟队列由软件实现。本技术通过多核平台和数据包大小提高性能和可扩展性。

本技术可以支持高带宽网络流量处理,可以提高软件定义网络(softwaredefinednetwork,简称sdn)和/或网络功能虚拟化(networkfunctionvirtualization,简称nfv)的应用的性能。与典型的多核速率限制装置和/或方法相比,本技术将最大支持限制速率提高了大约50%到大约60%。实验结果可以表明,本技术对于不同数量的处理器内核具有较高的可扩展性,在不同大小的数据包中也具有稳定性能。

qos网络功能,包括延迟和最小带宽保证、速率限制、带宽整形和不同业务流共享,在定量测量所述服务质量以及为网络流量提供差异化服务方面,可以发挥重要作用。作为qos的一部分,速率限制用于控制输入和输出侧的流量速率。例如,路由器可以通过限制不同流的速率来确保流量平稳,防火墙可以通过限制特定传入流的速率来执行访问控制。

通常,可以通过硬件和/或软件来执行速率限制。网络接口控制器(networkinterfacecontrollers,简称nics)可以支持多个硬件发送队列。发送数据包时,操作系统(operatingsystem,简称os)可以向所述nic发送通知所述数据包到达的请求,所述nic可以使用仲裁器来计算来自不同循环缓冲区的数据包的提取顺序。所述nic可以首先查找所述数据包的物理地址,然后对所述数据包内容发起直接存储器存取(directmemoryaccess,简称dma)传送,将所述数据包内容传送到其内部数据包缓冲区。最后,调度器可以决定是否或何时发送所述数据包。

基于硬件的速率限制可以确保低处理器开销和高精度。同时,在所述nic上针对每个队列存储大量每类数据包队列和循环缓冲区可能导致可扩展性较低。例如,当在所述nic中使用4,000个队列并且每个队列存储15kb数据包数据(约1,000个数据包)时,将消耗所述nic的静态随机存取存储器(staticrandomaccessmemory,简称sram)大约60mb的空间,这对于nic应用来说太过昂贵。典型的nic硬件仅可以支持8-128个速率限制器,这可能对这些场景中的细粒度速率限制和其它qos应用具有显著限制。

大多数os支持某种类型的基于软件的速率限制函数。例如,linux提供一组用于管理和操作数据包传输的工具。流量控制(trafficcontrol,简称tc)是一种用户空间实用程序,用于配置linux内核数据包调度器。它使用排队规则(queuingdiscipline,简称qdisc)来实施灵活、可扩展的流量控制策略,其中所述排队规则可以配置流量类别。但是,由于锁争用和频繁中断,基于软件的速率限制实现方式可能会遇到处理器开销较大的问题。先前实验可以表明,与基于硬件的方法相比,基于软件的速率限制实现方式多消耗约5倍的内核处理器(或中央处理器(centralprocessorunit,简称cpu))利用率。

随着软件定义网络(softwaredefinednetwork,简称sdn)和网络功能虚拟化(networkfunctionvirtualization,简称nfv)的快速发展,越来越多的网络功能可以在通用处理器平台上虚拟化和实现。在允许灵活部署和实时迁移的同时,这些实现方式的不良性能可能成为支持高带宽网络流量处理的瓶颈。最近,诸如数据平面开发套件(dataplanedevelopmentkit,简称dpdk)和快速数据输入/输出(fastdata-input/output,简称fd.io)之类的数据平面技术的发展可能为高性能qos功能的实现带来新的可能性。然而,在尽量减少开销的同时,有效地在多核平台上映射队列仍然是一个挑战。

本技术提供了一种可扩展的多核无锁速率限制框架。具体地,虚拟qos类队列用于隔离处理器的不同内核对同一队列的同时访问。每个内核都具有其自身的虚拟队列,不需要为了控制对两个或两个以上处理器内核共享的队列的访问提供信号量。需求速率值和供给速率值这两个附加参数被关联或附加到每个虚拟类队列,以同步不同内核之间的所述qos约束。实验结果表明,与现有多核速率限制实现方式相比,使用本技术可以将限制速率提高大约50%。此外,本技术可以随着处理器内核数目的增加而具有较高可扩展性。

应该理解,本技术可以以许多不同的形式来体现,不限于在此阐述的实施例。相反,提供这些实施例是为了透彻完整地理解本发明。事实上,本发明公开旨在覆盖包括在由所附权利要求书限定的本发明公开的精神和范围内的这些实施例的替代物、修改和等同物。另外,描述中陈述许多具体细节,以对本技术各实施例进行通彻理解。然而,可以清楚的是,实际应用中,可以不包括本技术的这样特定细节。

图1是包括多个节点、链路以及控制器的网络100的实施例的示意图。所述多个节点101-109可以通过多个链路互连。信号或不同类型的业务流f0-f5经由所述多个链路传输至网络100中的节点并且从所述网络100中的节点传输,例如,业务流f1经由链路112在节点101与102之间传输。特定业务流可以包括多个数据包,链路可以包括两个或两个以上节点之间的特定信号路径。在一实施例中,控制器190和所述多个节点101-109采用多核无锁速率限制器,用于在所述多个节点101-109之间传输数据包。多核无锁速率限制器技术可以包括在一个或多个节点101-109和/或控制器190内。

通过在网络100中采用多核无锁速率限制器技术,所公开的实施例通过多核平台和不同大小的数据包提高了性能和/或可扩展性。

在一实施例中,控制器190包括集成电路处理器,用于执行存储在存储器中的指令,以执行网络100中的多核无锁速率限制器。在一实施例中,控制器190可以向一个或多个节点输出控制信号以限制数据包传输。类似地,如本文所述,一个或多个节点可以包括集成电路处理器,用于执行存储在存储器中的指令,以执行多核无锁速率限制器。

在一实施例中,控制器190经由信号路径(例如,耦合到节点101和102的信号路径191-192)向所述多个节点101-109输出控制信号。在一实施例中,控制器190向链路输出控制信号,以配置节点之间的信号路径。

所述网络100可以是任何合适类型的网络,例如电网络和/或光网络。在实施例中,网络100可以包括具有内部和外部链路的多个网络。所公开的实施例可与任何适当类型的路由方法结合采用。所述网络100可以采用任何合适的网络通信协议,例如传输控制协议/互联网协议(transmissioncontrolprotocol/internetprotocol,简称tcp/ip)。所述网络100还可以采用任何适当类型的网络虚拟化和/或网络覆盖技术,例如sdn技术和虚拟扩展局域网(virtualextensiblelocalareanetwork,简称vxlan)技术。网络100可以是大规模网络、ip网络、包交换网络、中央控制的sdn、蜂窝网络、wi-fi网络(电气和电子工程师协会(instituteofelectricalandelectronicsengineers,简称ieee)802.11x)、卫星网络、即兴网和传感器网络或高性能计算集群(数据中心)网络。在一实施例中,网络100可以包括多跳蜂窝网络。所述网络100可以在单个网络管理域或多个网络管理域下操作。所述网络100可以与其它网络互连。所述链路可以包括物理链路,例如光纤链路、电链路、无线链路和/或用于在网络100中传输数据的逻辑链路。

在一实施例中,网络100包括以下节点/链路架构。业务流f0经由链路110提供给节点101。业务流f1经由链路112从节点101提供给节点102。节点102经由链路123和127耦合到节点103和107。节点103经由链路173耦合到节点107。节点103经由链路134耦合到节点104,节点107经由链路174耦合到节点104。节点104经由链路145耦合到节点105。流f2经由链路150输入到节点105。节点109经由链路194耦合到节点104。节点109经由链路169和189耦合到节点106和108。节点106经由链路167耦合到节点107。流f3和f4经由链路160和161输入到节点106。流f5经由链路180输入到节点108。

所述多个节点101-109中的节点(或网络节点)可以是任何合适的网元或设备,例如路由器或交换机(包括交换网),用于接收和转发网络100中的数据。网元可以与其它网元或其它网络通信。如图所示,节点可以接收来自其它网络的业务流。所述业务流或所述流可称为外部流或外源流。其中一些流可以包括高尾(high-tail,简称ht)业务流,而一些其它流可以包括低尾(low-tail,简称lt)业务流,或者它们的组合。所述多个节点101-109中的节点可以采用具有相关联需求速率值集和供给速率值集的多个虚拟队列或虚拟队列集。所述需求速率值集和供给速率值集可用于确定何时从所述虚拟队列集输出存储的数据包或用于限制传输速率。

典型的令牌桶管理方法可用于qos要求。令牌通常表示单个数据包或一个预定字节单元,以固定速率添加到桶中。检查所述桶,以查看所述桶在数据包到达时是否包含足够多的令牌。当所述桶包含有所述数据包需要的足够多的令牌时,所述数据包将通过,若干令牌(通常等于所述数据包的长度)将被移除。否则,任何令牌都不会从所述桶中移除,但是所述数据包将被丢弃或标记为不合格,以用于进一步处理。漏桶方法可以用于限制网络流量的速率。与令牌桶算法不同,泄漏率算法可以以恒定的速率传送数据包,但可能缺乏处理突发流量的能力。分层令牌桶算法可以允许对流量的复杂、细微控制。分层令牌桶算法可以基于诸如ip地址、优先级或接口之类的各种参数来在多级分层中对流量进行分类。然而,这些令牌桶管理方法对于多核装置可能不是最优的,因为它们在处理器内核的数目增加时无法很好地扩展。

其它速率限制方法可以限制每个虚拟机(virtualmachine,简称vm)对之间的速率,以保证多租户数据中心网络的带宽。速率限制器方法可以使用速率限制器来减少数据中心中的拥塞,其中小缓冲区的突发相关流量可能导致应用性能较差。这些速率限制方法可以提供速率限制,但并非专注于解决所述速率限制器本身的性能瓶颈。此外,随着数据中心和虚拟化网络环境中vm和流的数量的增加,速率限制器的数量可能增加,从而给速率限制带来更多的挑战。

系统可以包括具有用于高速交换机中的链路调度的硬件优先队列架构的速率限制器。该速率限制器可以保证高速网络中的qos要求。其它系统可以具有用于可配置拥塞控制管理的可编程nic。其它系统仍然可以将速率限制卸载到netfpga,将剩余任务留给软件,目的是在支持数千个速率限制器的同时减少处理器负载。然而,所有这些系统都严重依赖于特定硬件,可能在通用处理器平台上失去可扩展性。

接收方缩放功能(receive-sidescaling,简称rss)是nic的网络功能,可以实现输入数据包的有效分布。。在rss的支持下,网络接收过程可以分布在若干基于硬件的接收队列上。这可以允许多个处理内核同时处理网络流量,缓解由单个内核过载引起的接收中断处理中的瓶颈。rss可用于处理多核平台上的数据包。然而,与本技术相比,rss也有缺点。

在单核rss设计中,所述单个处理器内核负责数据包接收和速率限制。在从所述nic接收器接收到数据包之后,由所述处理器内核对所述数据包进行分类,然后将所述数据包发送到若干不同qos类的队列中,以进行细粒度流量控制。

在多核rss设计中,每个处理器内核接收来自所述nic接收器的数据包,使用其自身分类器将数据包发送到不同的qos类。然而,由于rss设计中的流量分布是由nic驱动程序而不是由每个处理器内核的分类器来确定的,所以到不同处理器内核的数据包可以被分类为相同的qos类并并发地发送到相同的队列。这可能导致对来自不同处理器内核的一个队列的同时读写操作。在没有额外同步保护的情况下,速率限制可能失败或变得异常。因此,为了精确地限制每个类别的速率,可能需要对所述队列进行锁定操作。例如,在处理器内核0想要对qos类队列0执行写操作之前,qos类队列0可能需要处于解锁状态,然后可能需要保持锁定,直到处理器内核0完成写操作。在qos类队列0的锁定时间内,来自其它处理器内核的对该队列的操作(读取和/或写入)必须等待,直到该队列在处理器内核0的写入操作之后变为解锁或可用。

rss设计中的锁争用和频繁中断会导致处理器负载较高,这会降低多核平台上的数据包处理性能。rss设计中的频繁锁争用和中断的原因可能是多核共享同一qos类的队列。由于nicrss驱动程序分发数据包进行多核处理,同时用户定义的分类器将数据包分类到不同的qos类,所以数据包不太可能直接从所述nic发送到所述合适的qos类队列。

图2示出了本技术实施例提供的具有可以消除锁定的多核的设备200中的多个虚拟队列。使用虚拟qos类队列(或虚拟队列、虚拟类队列)集。在一实施例中,虚拟类队列本身不是完整的qdisc(或linux流量控制的组件),而是作为完整的qdisc的一部分。图2描述了用于有类速率限制的虚拟类队列与典型类队列之间的关系。虚拟qos类队列00、10和20是构成所述类队列0的三个子类队列。另一方面,虚拟qos类队列00、01和02是映射在内核210上的子类队列,只能由处理器内核210访问。

在一实施例中,虚拟qos类队列定义如下:对于具有n个qos类的m个内核平台上的速率限制实现,存在m*n个虚拟qos类队列,其中vcq(i,j)表示映射在处理器内核i上的虚拟类队列,用于qos类j,其中0≤i<m,0≤j<n。

虚拟类队列集消除了多核访问共享资源或特定队列引起的锁争用,因为每个处理器内核只能访问其自身的虚拟类队列。例如,如果两个处理器内核共享同一个队列,则当一个内核已经访问所述队列时,另一个内核将被锁定无法访问所述队列。为了确保所述有类速率限制效果,另外两个参数附加到每个虚拟类队列或与每个虚拟类队列相关联:图2中描述为“需求”和“供给”的需求率(或需求率值)和供给率(或供应率值)。例如,需求速率值230a-c集和供给速率值240a-c集与虚拟队列(虚拟qos类00、01和02)集相关联。

在一实施例中,需求速率值是表示虚拟类队列中输入数据包的需求速率的参数。在令牌更新时间段t(令牌时间段),w个数据包到达虚拟类队列vcq(i,j),因此在一实施例中,在图3a中的300处定义该虚拟类队列的需求率dr(i,j)。

供给速率值是表示一实施例中虚拟类队列的实际数据包传输速率的一个或一组参数。在一实施例中,在特定供给速率值的情况下,虚拟类队列预计以预定的平均速率出队。

虚拟类队列集以及需求和供给速率值集使得能够在多核装置上实现用于有类qos的无锁速率限制实施例。如图2所示,每个处理器内核(内核210-212)仅需要对所述需求速率参数的写入许可和对其自身虚拟类队列的所述供给速率参数的读取许可。调度器(可以分配给独立处理器内核或执行调度器219的调度器内核213)负责所有需求速率值收集(或读取)和供给速率更新(或计算、写入)。在一实施例中,调度器219还需要对所述参数的一种权限:对所有需求速率值的读取权限和对所有供给速率值的写入权限。

在一实施例中,对于虚拟类队列vcq(i,j),需求率dr(i,j)可以由处理器内核i写入并由调度器内核读取,供给率sr(i,j)可以由所述调度器内核写入并由处理器核i读取。

调度器内核213(执行调度器219)周期性地获取每个虚拟类队列的需求速率值,相应地重新计算供给速率值。在不同的实施例中,可以使用各种调度方法。例如,对于m个内核平台上的速率限制实施例和n个qos类,存在m*n个虚拟qos类队列。对于每个虚拟类队列的需求速率值dr(i,j),其中0≤i<m,0≤j<n,计算供给速率参数sr(i,j)的方法在图3b中的310处示出,其中cr(j)表示一实施例中qos类j的承诺速率。

图6中的方法600示出了一实施例中每个虚拟类队列的数据包处理流程的简化伪代码。在一实施例中,在每个时间段t使用图3a中的300计算需求速率值dr(i,j)。

图7中的方法700示出了一实施例中用于更新每个虚拟类队列的供给速率值sr(i,j)的简化伪代码。在一实施例中,sr(i,j)使用图3b中的400进行计算。执行调度器219的调度器内核213执行方法700。

在实施例中,调度器219可以采用各种不同类型的公平算法,包括先进先出(first-infirst-out,简称fifo)、加权公平队列调度(weightedfairqueuing,简称wfq)、最大化最小公平算法等。

图2中装置200的详细描述在下文中提供。在一实施例中,装置200是网络100的至少一个所述节点中的多核无锁速率限制器。在另一实施例中,设备200(或其组件)包括在网络100中的多个节点中。在另一实施例中,装置200仍然包括在网络100中的至少一个节点和控制器190中。在一实施例中,装置200是一种交换机,例如本技术实施例提供的软件设计(software-design,简称sd)交换机。在实施例中,在网络100中使用至少一个sd交换机。为了清楚地描述本技术,网络100的节点或交换机中的某些典型组件未示出。

在实施例中,装置200从一个或多个链路(或信号路径)接收在网络接口控制器接收器(nicrx)201a-c处具有多个数据包的一个或多个业务流。在可替代实施例中,nicrx201a-c可以使用单个或多个接收器替换。

然后,nicrx201a-c将接收到的数据包转发到一个或多个处理器中的内核210-212。特别地,nicrx201a-c经由信号路径202a-c将数据包转发到内核210-212中的相应数据包接收器(pktrx)205-207。内核210-212还包括相应分类器215-217,用于对由pktrx205-207接收的一个或多个数据包进行分类或提供分类。在实施例中,分类器215-217是存储在存储器中的软件组件,包括由相应内核210-212执行的计算机指令。在实施例中,分类器215-217可以是固件或数字电路,用于提供数据包分类。

在实施例中,分类器215-217通过读取所述数据包中的字段或标识符来确定接收到的特定数据包属于哪个qos类。在一实施例中,数据包包括数字信息,除其它类型的信息外,还可以表示文本、语音、图像、视频、数据、游戏或控制(状态)信息。在一实施例中,从具有基站的蜂窝网络接收所述数据包,其中所述基站配备天线,用于接收具有所述信息的蜂窝(射频)信号。基于接收的数据包的分类,内核210-212经由信号路径220a-c将所述数据包转发到虚拟队列,例如虚拟qos类队列。

在实施例中,虚拟qos类队列形成或分组成与特定内核相关联的集合。通过将所述多个虚拟队列形成由特定相关联内核可访问的集合,可以避免队列锁定(或禁止从所述队列或到队列的读取或写入操作)。例如,虚拟qos类队列00-02可由内核210访问。在一实施例中,内核211和212不能访问虚拟qos类队列00-02。类似地,虚拟qos类队列10-12可由内核211访问。在一实施例中,内核210和212不能访问虚拟qos类队列10-12。类似地,虚拟qos类队列20-22可由内核212访问。在一实施例中,内核210和211不能访问虚拟qos类队列20-22。

每个虚拟队列集还具有相关联的需求和供给速率值集,以同步传输和/或限制来自所述虚拟队列的数据包传输。例如,虚拟qos类队列00-02具有存储在存储器中的相关联或附加的需求速率值230a-c和供给速率值240a-c。例如,虚拟qos类队列00具有相关联的需求速率值230a和供给速率值240a,虚拟qos类队列01具有相关联的需求速率值230b和供给速率值240b等。类似地,虚拟qos类队列10-12和20-22具有相关联或附加的需求速率值231a-c集和供给速率值241a-c集以及存储在存储器中的需求速率值232a-c集和供给速率值242a-c集。

在实施例中,相应内核计算并将所述需求速率值写入存储器。例如,内核210计算并写入所述需求速率值230a-c,内核211计算并写入所述需求速率值231a-c,内核212计算并写入所述需求速率值232a-c。在一实施例中,执行调度器219的调度器内核213可以读取需求速率值,但不会写入需求速率值。在一实施例中,内核210-212可以读取相应的供给速率值,但可能不会写入供给速率值。

在一实施例中,调度器219是存储在存储器中的软件组件,包括用于执行多核无锁速率限制和其它功能的计算机指令。在一实施例中,执行调度器219的调度器内核213执行同步(或速率限制),经由信号路径245a-c将存储在虚拟队列中的数据包输出到数据包发送器(pkttx)250a-c。在实施例中,为响应由调度器内核213(执行调度器219)读取的需求速率值和由调度器内核213计算和存储的供给速率值(例如,供给速率值240a-c),从虚拟队列输出数据包,如本文所述。在一实施例中,调度器内核213执行调度器219,以将控制信号输出到虚拟队列,所述虚拟队列同步或限制将存储在所述虚拟队列中的数据包输出到所述pkttx250a-c的所述速率。

如本文所述,来自相应虚拟队列集的虚拟队列形成用于特定qos类的队列。例如,由相应内核210-212可访问的虚拟qos类队列00、10和20是特定qos类00的子类。类似地,由相应内核210-212可访问的虚拟qos类队列01、11和21是特定qos类01的子类。此外,由相应内核210-212可访问的虚拟qos类队列02、12和22是特定qos类02的子类。

由pkttx250a-c接收的数据包经由信号路径255a-c输出到网络接口控制器发送器(nictx)260a-c。然后,数据包可以输出到耦合至nictx260a-c的一个或多个信号路径(或链路),如图1所示。

图4示出了本技术实施例提供的一种网元400。网元400是通过实施例中网络传输或传送数据包的任何合适的设备,例如交换机、路由器、网桥、防火墙、服务器、客户端等。网元400可用于实现和/或支持如本文所述的多核无锁速率限制器。网元400可以在单个网络节点中实现,或者网元400的功能可以在多个网络节点中实现。本领域的技术人员应意识到,所述术语网元包括广泛意义上的设备,网络节点仅是其中一个示例。在实施例中,网元400(或其组件)可以包括在一个或多个节点和/或控制器190中,如图1所示。

本发明所述的至少部分组件/方法在例如网元400的网络装置或组件中实现。例如,本发明中的组件/方法可以采用硬件、固件和/或在硬件上安装运行的软件实现。

如图4所示,所述网元400包括收发机(tx/rx)410a-b,其可以是发送器、接收器或其组合。在实施例中,可以使用更多或更少的收发器。tx/rx410a经由信号路径411耦合到多个端口420a-420c,用于经由链路从其它节点发送和/或接收数据包。tx/rx410a还经由信号路径412耦合到处理器430。类似地,tx/rx410b经由信号路径414耦合到多个端口420d-420f,用于经由链路从其它节点发送和/或接收数据包。tx/rx410b还经由信号路径413耦合到处理器430。

处理器430耦合到每个tx/rxs410a-b,以处理所述数据包和/或确定向哪些节点发送所述数据包。在一实施例中,处理器430可以包括具有一个或多个内核的一个或多个类型的电子处理器。在一实施例中,处理器430是集成电路处理器,执行(或读取)可包括在存储在非瞬时性存储器上的代码和/或计算机程序中的计算机指令,以提供本文所述的至少部分功能。在一个实施例中,处理器430是能够执行多个线程的多核处理器。在一实施例中,处理器430包括内核210-212以及调度器内核213。在一实施例中,调度器内核213可以包括在控制器(例如,控制器190)中,可以经由信号路径(例如,信号路径192)与网元400通信。在一实施例中,处理器430是数字信号处理器、基带电路、现场可编程门阵列、数字逻辑电路和/或等同物。在一实施例中,处理器430可以是一个或多个专用集成电路(applicationspecificintegratedcircuit,简称asic)和/或数字信号处理器(digitalsignalprocessor,简称dsp)的一部分。

处理器430经由信号路径440与存储器432通信,例如读取指令、读取值、写入值以及向在存储器432中形成的虚拟队列和从在存储器432中形成的虚拟队列传输数据包。在一实施例中,信号路径440可以是在处理器430与存储器432之间传输信号的总线或互连。信号路径440还可以在处理器430与存储器432之间传输控制信号。存储器432可以是存储指令以及充当数据存储、缓存、队列、缓冲区和/或等同物的非易失性存储器。

如本文更加全面的论述,处理器430(或处理器430的内核)可以执行具有指令的软件组件,例如多核无锁速率限制器460,以执行调度和/或速率限制。在一实施例中,调度器内核213执行存储在多核无锁速率限制器460中的计算机指令,以执行本文所述的多项功能。例如,调度器内核213执行多核无锁限制器460,以经由信号路径440输出控制信号,继而经由信号路径440和412或413将存储器432的虚拟队列中存储的数据包输出到tx/rx410a-b。在图5中示出并在本文中详细描述了多核无锁速率限制器460的软件架构实施例。此外,多核无锁速率限制器460还引起特定物品(例如,网元或网络)变换到不同状态。

在一实施例中,存储器432还包括多个队列,其可以包括虚拟qos类队列的集合。所述多个虚拟队列可以形成由处理器430中的特定相关联内核可访问的集合。通过将所述多个虚拟队列形成由特定相关联内核可访问的集合,可以避免队列锁定(或禁止从所述队列或到队列的读取或写入操作)。类似地,在实施例中,虚拟qos类队列由结合图2描述的相应的相关联内核访问。

每个虚拟队列集还具有相关联的需求和供给速率值集,以同步传输和/或限制来自所述虚拟队列的数据包传输。类似地,在实施例中,所述虚拟队列集结合图2描述的虚拟队列集来操作。

在实施例中,相应内核计算并将所述需求速率值写入存储器432。例如,内核210计算并写入所述需求速率值230a-c,内核211计算并写入所述需求速率值231a-c,内核212计算并写入所述需求速率值232a-c。在一实施例中,需求速率值使用图3a中300处的等式进行计算。在一实施例中,调度器内核213可以读取需求速率值,但可能不会写入需求速率值。

在实施例中,执行多核无锁速率限制器460的调度器内核213计算并将供给速率值(例如,供给速率值240a-c)写入存储器432。在一实施例中,执行多核无锁速率限制器460的调度器内核213写入供给速率值,以响应读取需求速率值。在一实施例中,内核210-212可以读取供给速率值,但可能不会写入供给速率值。

类似地,如结合图2所描述的,来自相应虚拟队列集的虚拟队列形成用于特定qos类的队列。

存储器432以及本文所描述的其它存储器可以包括任何适当类型的系统存储器,例如sram、动态随机存取存储器(dynamicrandomaccessmemory,简称dram)、同步dram(synchronousdram,简称sdram)、只读存储器(read-onlymemory,简称rom)、上述的组合等。在实施例中,存储器432可包含在开机时使用的rom以及在执行计算机程序时使用的存储程序和数据的dram。在实施例中,存储器432是非瞬时性或非易失性集成电路内存存储器。类似地,本文所描述的存储器可以是非瞬时性或非易失性集成电路内存存储器。

此外,存储器432还可以包括任何适当类型的内存存储设备,用于存储数据、包括指令的计算机程序和其它信息,使得所述数据、计算机程序和其它信息可经由信号路径440访问。存储器432例如可包括如下项中的一种或多种:固态硬盘、硬盘驱动器、磁盘驱动器、光盘驱动器和/或等同物。

为了清楚地描述本技术,网元400中的某些典型组件在图4中未示出。例如,在实施例中,网元400可以包括额外的信号路径(外部或内部)和/或接口电路。例如,在一实施例中,可以通过来自控制器(例如,控制器190)的信号路径向网元400提供一个或多个控制信号。在一实施例中,一个或多个控制信号可以输入到处理器430,以控制网元400的特定状态或操作。例如,一个或多个控制信号可以同步所述虚拟队列集中存储的数据包的输出。类似地,网元400可以经由类似的信号路径从处理器430向网络控制器和/或其它网元输出控制或状态信号。

在一示例性实施例中,所述网元400包括:接收模块,用于接收所述多个数据包中的数据包;分类器模块,用于对所述数据包进行分类以获得所述数据包的分类;传输模块,用于基于所述分类将所述数据包传输至多个虚拟队列中的虚拟队列;队列存储模块,用于将所述数据包存储在所述虚拟队列中;需求速率模块,用于计算所述多个虚拟队列的多个需求速率值;供给速率模块,用于基于所述多个需求速率来计算所述多个虚拟队列的多个供给速率值;输出模块,用于基于与所述虚拟队列相关联的供给速率来输出存储在所述虚拟队列中的所述数据包。在一些实施例中,所述网元400可以包括其它或者附加模块,用于执行所述实施例中描述的任一或组合的步骤。此外,如任一附图中所示或在任一项权利要求中所描述的方法的任何附加或可替代实施例或方面预期也包括类似模块。

图5示出了本技术实施例提供的一种软件架构500。在实施例中,多核无锁速率限制器460包括多个软件组件,例如需求速率510、供给速率520、承诺速率530、分类540和调度器550。在实施例中,软件组件可单独或组合地实现为计算机程序、对象、功能、子例程、方法、软件实例、脚本和代码片段,存储在电子文件中。为了清楚地描述本技术,将图5(以及图2和图4)中所示的软件组件描述为单独的软件组件。在实施例中,所示的软件组件可单独或组合地存储(在单个或分布式计算机可读存储介质中)和/或由单个或分布式计算设备(处理器或多核处理器)架构执行。由本文中描述的各种软件组件执行的功能是示例性的。在其它实施例中,本文中所标识的软件组件可以执行更多或更少的功能。在实施例中,软件组件可以组合或进一步划分。

在实施例中,本文中示出的软件组件可以用类似的硬件组件或逻辑/电路替换,用于执行类似功能。

除其它功能外,需求速率510负责计算一个或多个虚拟队列的需求速率值。在实施例中,相应的处理器内核执行需求速率510,以计算并存储与可由执行调度器(例如,调度器550)的调度器内核读取的相关联虚拟队列集相关联的一个或多个需求速率值。例如,执行需求速率510的内核210计算并将与内核210相关联的需求速率值230a-c存储在调度器内核213可读的非易失性存储器中。在一实施例中,需求速率510通过使用图3a中300处的等式来计算需求率值。在其它实施例中,可以使用其它等式来计算需求速率值。

除其它功能外,供给速率520负责计算一个或多个虚拟队列的供给速率值。在实施例中,调度器内核执行调度器,以计算并存储与可由相关联处理器内核读取的虚拟队列集相关联的一个或多个供给速率值。例如,执行调度器550的调度器内核213计算并将与内核210相关联的供给速率值240a-c存储在内核210可读的非易失性存储器中。在一实施例中,供给速率520通过使用图3b中310处的等式来计算供给速率值。在其它实施例中,可以使用其它等式来计算供给速率值。

除其它功能外,承诺速率530负责计算如本文所述的承诺速率(committedrate,简称cr)。在可替代实施例中,可以使用其它方法计算承诺速率(committedrate,简称cr)。

除其它功能外,分类540负责对接收的数据包进行分类。在一实施例中,内核执行分类540以确定对应于接收的数据包的qos分类。在一实施例中,分类540读取数据包中的报头或字段以确定所述合适的qos类。在一实施例中,分类540(由相关联内核执行)将已分类的数据包输出到诸如图2中所示的虚拟qos类队列00、01和02的适当虚拟队列,以响应所确定的分类。在一实施例中,分类540表示多个分类软件组件,例如图2中所示的分类器215-217。

除其它功能外,调度器550负责调度存储在虚拟队列中的数据包的输出。调度器550也可称为网络调度器或数据包调度器。在一实施例中,调度器550管理nic的发送和/或接收队列中的网络数据包的序列。在一实施例中,调度器550对应于图2中示出的调度器219。在一实施例中,调度器550可存储在非易失性存储器中,由网络控制器中的处理器(或网络控制器处理器内核)执行,向网元输出控制信号。在一实施例中,这些控制信号可以安排(或限制)从特定虚拟队列中网元接收和/或输出的数据包的传输速率。在可替代实施例中,调度器550存储在具有虚拟队列的网元中。在一实施例中,调度器550可以包括供给速率520和/或承诺速率530。

图8是本技术实施例提供的一种用于操作网络的方法800的流程图。在实施例中,图6至图8中示出的方法是至少部分由图1至图2和图4至图5中示出以及如本文所述的硬件和/或软件组件执行的计算机实现的方法。在一实施例中,由一个或多个处理器,例如图4中所示的处理器430执行的软件组件执行所述功能的至少一部分。在其它实施例中,硬件组件执行本文中所述的一个或多个功能。

图8是本技术实施例提供的一种多核无锁速率限制器的方法800的流程图。在图8中的801处接收所述多个数据包中的一个或多个数据包。在一实施例中,该功能以及802-807处的功能由图1至图2和图4至图5中示出的一个或多个组件执行。在实施例中,图2中所示的内核210-212中的pktrx205-207执行该功能的至少一部分。

在802处,对所接收的数据包进行分类以获得所述数据包的分类。在实施例中,由处理器内核210执行的分类器215执行该功能的至少一部分。

在803处,基于所述分类将所述数据包传输至多个虚拟队列中的虚拟队列。在实施例中,由处理器内核210执行的分类器215执行该功能的至少一部分。

在804处,将所述数据包存储在诸如图2中所示的其中一个虚拟qos队列类00、01或02的虚拟队列中。

在805处,计算多个相关联虚拟队列的多个需求速率值。在实施例中,图5中示出的由处理器内核210执行的需求速率510执行该功能的至少一部分,将所述需求速率值230a-c存储在非易失性存储器432中,如图4所示。

在806处,基于所述多个需求速率来计算多个相关联虚拟队列的多个供给速率值。在实施例中,图5中示出的由调度器内核213执行的供给速率520执行该功能的至少一部分,将所述供给速率值240a-c存储在非易失性存储器432中,如图4所示。

在807处,输出存储在所述虚拟队列中的数据包,以响应与所述虚拟队列相关联的供给速率值。在一实施例中,由调度器内核213执行的调度器219执行该功能的至少一部分。

进行了一系列实验来评估本技术的性能和可扩展性。在两个hpz228sff工作站上进行了实验,所述工作站具有coretmi7-4790cpu平台(8个逻辑核)、82599es10千兆以太网控制器以及dpdk16.04,安装用于低级数据包处理。dpdk是一组用于快速数据包处理的库和驱动程序。intel的dpdk的pktgen流量生成器用于以线速发送流量并执行统计分析。如本文所述,采用具有多核无锁速率限制器的调度器来更新每个虚拟类队列的供给速率值。

承诺速率(committedrate,简称cr)是在令牌桶管理方法中将令牌添加到桶中的速率。在一实施例中,以每秒ip数据包的字节为单位来测量承诺速率(committedrate,简称cr)。在一实施例中,每个qos类可以具有其自身的承诺速率(committedrate,简称cr)。对于qos类j,cr(j)表示所述qos类j的承诺速率。然而,在实验中,所有qos类均被分配相同的承诺速率(committedrate,简称cr)。例如,图9a示出了速率与qos类的数目的图表900,其中每个qos类的承诺速率为64mbits/s。图9b示出了速率与qos类的数目的图表910,其中每个qos类的承诺速率(commitedrate,简称cr)为128mbits/s。图9c示出了速率与qos类的数目的图表920,其中每个qos类的承诺速率(commitedrate,简称cr)为192mbits/s。从具有随机源ip和目的ip的pktgen流量生成器生成大小为64字节的数据包,确保所述速率限制器中的所有qos类均被均匀覆盖。qos类的所述数目的范围为1到128,在每个实验中使用四个处理器内核来限制速率。

如图9a所示,当qos类的所述数目低于128时,锁定技术((rss)和本技术(多核无锁定限制器)的输出速率都呈线性递增趋势。可以在图3c中的320处计算预期输出速率,其中在一实施例中,存在具有n个qos类的m内核平台,其中0≤i<m,0≤j<n。

当存在128个qos类时,所述预期输出速率为是128*64mbits/s=8.192gbits/s。尽管两种技术都没有达到所述预期输出速率,但本技术仍然将吞吐量提高近50%(6.27gbits/s,与4.181gbits/s相比)。图9b和图9c示出了类似的实验结果。

还进行了若干实验来评估所述锁定技术和本技术的所述最大支持限制速率。图11描述了总共具有四个处理器内核和16个qos类的所述速率限制器的结果。由于频繁的锁争用,所述锁定技术的所述输出速率随着qos类数目的增加而减小。由于输入数据包的所述源ip和目的ip是随机的,因此所述速率限制器需要处理的qos类越多,不同内核同时访问一个qos类队列的可能性越高。

相比之下,由于引入了虚拟类队列来防止不同处理器内核同时访问所述同一队列,本技术的性能保持稳定。实验结果表明,在具有16个qos类的四个处理器内核的情况下,本技术实现了6.373gbits/s的最大限制速率,在相同条件下,比所述锁定技术(4.297gbits/s)高出大约48%。

还使用不同的输入数据包大小进行了实验。使用四个处理器内核来限制速率,为每个类设置8个qos类,承诺速率为64mbits/s。pktgen流量生成器用于生成大小从诸如64字节、320字节的小数据包到1500字节的大数据包的数据包。此外,还生成包含这些小数据包和大数据包的混合数据包集。如图10中的表1000所示,本技术的所述输出速率恰好等于每个类的预期承诺速率的总和,无论所述数据包大小如何,本技术的所述输出速率几乎保持不变。

为了评估本技术的可扩展性,使用从1到6的不同数目的处理器内核进行了若干实验。为每个处理器内核分配了16个qos类,针对每个qos类使用了64mbits/s的承诺速率。将大小为64字节的随机数据包从pktgen流量生成器发送到限制器。如图12所示,随着所述内核数目的增加,本技术的所述输出速率不断提高。相反,当使用4个处理器内核时,所述锁定技术达到最高输出速率。在6个内核的情况下,本技术达到5.634gbits/s的输出速率,而所述锁定技术仅达到3.463gbits/s的输出速率。本技术将性能提高大约60%以上。

返回到图1,控制器190包括用户接口,所述用户接口可以包括可由控制器190的所述处理器以及实施例中附加硬件组件执行的计算机指令。用户接口可以包括输入设备,例如触摸屏、麦克风、相机、键盘、鼠标、定点设备和/或位置传感器。类似地,用户接口可以包括输出设备,例如显示器、振动器和/或扬声器,以输出作为输出的图像、字符、振动、语音和/或视频。用户接口还可以包括用户可以通过说话、触摸或做手势来提供输入的自然用户接口。在实施例中,用户接口可以用于控制或向如本文所述的多核无锁速率限制器技术提供输入。

本技术的优点可以包括但不限于,使用虚拟类队列提供内核/线程级隔离以及对虚拟类队列的读/写操作隔离。其它优点包括独立调度器,负责参数更新。需求速率值和供给速率值这两个附加参数被附加到或关联每个虚拟类队列,以同步多个内核之间的所述qos约束。与典型的多核速率限制技术相比,本技术可以将最大支持限制速率提高大约50%到大约60%。实验结果可以表明,当使用不同的数据包大小时,本技术将根据增加后的处理器内核进行扩展,同时保持稳定的性能。

图中的流程图和框图阐述了根据本发明公开各个方面的设备、装置、系统以及计算机可读介质和方法的可能实现方式的结构、功能以及操作。就此而言,所述流程图或框图中的每个框(或箭头)都可以表示用于实现所指定的逻辑功能的系统组件、软件组件或硬件组件的操作。也应注意的是,在一些可替代的实施方案中,块中指出的功能可以不按照图中的顺序实现。例如,事实上,连续示出的两个方块(或箭头)可以几乎同时执行,或者有时候,方块(或箭头)可以按照相反的顺序执行,这取决于所涉及的功能。也应注意的是,框图和/或流程图中的每个框(或箭头)以及框图和/或流程图中的框组合(或箭头)可以由基于专用硬件的系统执行,该系统执行特定的功能或动作,或者执行专用硬件和计算机指令的组合。

应当理解,所述流程图和/或框图中每一个框(或箭头)以及所述流程图和/或框图中框(或箭头)的组合可以由非瞬时性计算机指令来实现。可以将这些计算机指令提供给通用计算机(或网元)、专用计算机或其它可编程数据处理装置的处理器以产生机器,使得通过所述处理器执行的指令创建用于实现在所述流程图和/或框图中指定的功能/动作的机制。

如此处所述,本发明各方面至少可以采用以下形式:系统、装置、具有执行存储在非瞬时性存储器中指令的一个或多个处理器的设备(网元)、计算机实现方法和/或存储计算机指令的非瞬时性计算机可读存储介质。

非瞬时性计算机可读介质包括所有类型的计算机可读介质,包括磁存储介质、光存储介质和固态存储介质,具体不包括信号。应当理解的是,包括计算机指令的软件可以安装在具有计算机可读存储介质的计算设备(网元)中并与其一起出售。或者,可以获得软件并将其加载到计算设备中,包括通过光盘介质或从任何类型的网络或分配系统获得所述软件,例如包括从软件创建者拥有的服务器或者从所述软件创建者未拥有却使用的服务器获得所述软件。例如,所述软件可以存储在服务器上以便通过因特网分发。

所述计算机可读存储介质的更多示例包括以下内容:便携式计算机磁盘、硬盘、随机存取存储器(randomaccessmemory,简称ram)、rom、可擦除可编程只读存储器(erasableprogrammableread-onlymemory,简称eprom,或闪存)、具有中继器的合适光纤、便携式只读光盘(compactdiscread-onlymemory,简称cd-rom)、光存储设备、磁性存储设备或上述的任意合适组合。

本技术实施例中使用的非瞬时性计算机指令可以以一种或多种编程语言的任何组合来编写。所述编程语言可以包括面向对象的编程语言,例如java、scala、smalltalk、eiffel、jade、emerald、c++、cii、vb.net、python或r等;传统过程编程语言,例如“c”编程语言、visualbasic、fortran2003、perl、cobol2002、php、abap;动态编程语言,例如python、ruby和groovy;或其它编程语言。所述计算机指令可以完全在用户计算机(或网元)上执行,部分在所述用户计算机上执行,或作为独立的软件包,部分在所述用户计算机上执行,部分在远程计算机(网络控制器)上执行,或完全在所述远程计算机或服务器上执行。在后面的场景中,所述远程计算机可以通过任何类型的网络与所述用户计算机连接,或者可以(例如,使用因特网服务提供方提供的因特网)在外部计算机上或在云计算环境中建立所述连接或作为服务,例如软件即服务(softwareasaservice,简称saas)。

本文中所用的术语仅仅是出于描述特定方面的目的,并且并不打算限制本发明。除非上下文清楚说明,否则本文所用的单数形式“一”和“所述”包括其复数形式。应进一步了解,本说明书中所用的术语“包括”用于说明存在所述特征、整数、步骤、操作、元件和/或部件,但并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、部件和/或它们的组合。

应该理解,本发明可以以许多不同的形式来体现,不限于在此阐述的实施例。相反,提供这些实施例是为了使本发明内容更加透彻和完整,并将本发明完整地传达给本领域技术人员。事实上,本发明旨在覆盖这些实施例的替代方案、修改和等同方案,其包括在由所附权利要求书定义的本发明的范围和精神内。另外,在本主题细描述中,阐述了许多特定细节以便提供对本主题的透彻理解。然而,所属领域的普通技术人员将清楚到,可以在没有这样具体细节的情况下实践本请求保护的主题。

虽然已经以特定于结构特征和/或方法论步骤的语言描述了主题,但是应该理解的是,权利要求书定义的主题不必局限于上面描述的具体特征或步骤(动作)。相反,上述具体的特征和步骤被公开作为实施权利要求的示例性方式。

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