0x01 缘由
继续学习dpdk相关文档。QoS听了、看了好多次,但是从来没接触,趁现在学习下。
QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力, 是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。
0x02 介绍
DPDK Quality of Service (QoS) 框架。
1.支持Qos的包管道
一个复杂的带有QoS特性的包处理管道,如下图:
# | 模块 | 函数描述 |
1 | Packet I/O RX/TX(包收发) | 包的接收和转发从一个网卡到多个网卡。轮询模式驱动为Intel 1GbE/10 GbE 网卡。 |
2 | Packet parser(包解析) | 识别输入包的协议栈,检测包头的完整性。 |
3 | Flow classification(流分类) | 将输入的包映射到一致的流中。用配置的hash函数生成key去查找流和桶去处理冲突。 |
4 | Policer(策略) | 使用srTCM(RFC 2697)或trTCM(RFC2698)算法进行数据包计数。 |
5 | Load Balancer(负载均衡) | 将输入的包分发到应用处理worker。为每个worker提供统一的负载。保持worker和流表的亲和性,以及每条流的顺序。 |
6 | Worker threads(工作者线程) | 客户指定应用工作负载的处理。(IP栈等) |
7 | Dropper (抛弃) | 拥塞管理使用随机早期检测(RED)算法(由Sally Floyd-Van Jacobson论文提出)或加权RED(WRED)。 根据当前调度程序队列负载级别和报文优先级丢弃报文。 当遇到拥塞时,首先丢弃优先级较低的数据包。 |
8 | Hierarchical Scheduler(启发式调度器) | 5个层级的启发式调度器具备上千个叶子节点(层级是:输出端口、子端口、管道、流类型、队列)。实现流量整形(用于支持和管道级别),严格优先级(对于流量级别)和加权循环(WRR)(用于每个管道流量类中的队列)。 |
整个数据包处理流程中使用的基础架构块如下表所示。
# | 模块 | 函数描述 |
1 | Buffer manager(缓存管理) | 支持全局缓存池,也支持线程缓存caches。 |
2 | Queue manager (队列管理) | 支持在管道块之间的消息解析。 |
3 | Power saving (节能) | 支持在第活动周期的电源节能 |
管道块到CPU核心的映射可以根据每个特定应用程序所需的性能级别和为每个块启用的功能集进行配置。 某些块可能会消耗多个CPU内核(每个CPU内核在不同的输入数据包上运行同一个块的不同实例),而其他几个块可能映射到同一个CPU内核。
2.启发式调度
启发式调度模块(当使用时)通常位于发送阶段之前的TX侧。其目的是根据每个网络节点的服务级别协议(SLA)规定的策略来优先分配来自不同用户和不同业务类别的数据包的传输。
2.1介绍
启发式调度器模块,类似流量管理模块的网络处理器,用于实现包和流的分组入队和调度。它能够缓存大量的数据包在数据包转发前。当网卡接收更多的数据包来做转发时,这些在buffer中的数据包会一处并处理,用这个包SLAs操作。
启发式调度器对数据包多的队列进行了优化。当只需要少量的队列时,应该使用消息传递队列而不是这个块。 有关更多详细的讨论,请参阅最差的案例情景。
2.2 调度启发
层次结构的第一级是以太网TX端口1/10/40 GbE,后续层次级别定义为子端口,管道,流量类和队列。