Vpp QoS Hierarchical Scheduler(1)
最近工作中需要使用HQOS功能,查阅vpp及dpdk相关文档的资料,参考其他博客和文章,总结一下vpp的Hqos基本实现。
简介
服务质量(QoS)调度器通过根据服务水平协议(sla)对不同类型服务和订阅者的数据包的传输进行优先级排序来执行出站流量管理。QoS调度器可以根据需求在一个或多个NIC输出接口上启用。 QoS调度器实现需要流分类、入队和出队操作。流分类是HQoS的强制性阶段,其中传入数据包的分类是通过将数据包字段信息映射到5元组(HQoS subport, pipe, traffic class, queue within traffic class, and color)并将该信息存储在mbuf sched字段中进行的。入队操作使用此信息来确定存储信息包的队列,在此阶段,如果特定队列已满,QoS将丢弃信息包。dequeue操作包括根据包的长度和可用的积分来调度包,并将计划好的包移交给输出接口。
HQos实现使用dpdk的librte_sched库。下面就简单介绍一下Hqos实现逻辑。
DPDK hqos简单介绍
本文内容来源于dpdk官方文档的介绍,基本上就是内容的翻译,英文比较好的同学建议直接阅读官方资料。
1、概述
分层调度块通常位于发送阶段之前的 TX 侧。其目的是根据每个网络节点的服务级别协议(SLA)指定的策略来实现不同用户和不同流量类别的数据包传输。 分层调度类似于网络处理器使用的流量管理,通常实现每个流(或每组流)分组排队和调度。它像缓冲区一样工作,能够在传输之前临时存储大量数据包(入队操作);由于 NIC TX 正在请求更多的数据包进行传输,所以这些数据包随后被移出,并且随着分组选择逻辑观察预定义的 SLA(出队操作)而交给 NIC TX。
2、调度层次
层次结构的第一级是以太网 TX 端口 1/10/40 GbE,后续层次级别定义为 子端口,管道,流量类和队列。
通常,每个子端口表示预定义的用户组,而每个管道表示单个用户/订户。每个流量类是具有特定丢失率,延迟和抖动要求(例如语音,视频或数据传输)的不同流量类型的表示。每个队列都承载属于同一用户的同一类型的一个或多个连接的数据包。
各层级配置规格级调度方式介绍:
代码示例
下面是dpdk官方提供的HQOS调度的框架,首先是基本HQOS配置初始化,然后就是轮询收包调度(四个步骤,网卡收包、多级调度入队、多级调度出队、网卡发包)。
#define N_PKTS_RX 64
#define N_PKTS_TX 48
#define NIC_RX_PORT 0
#define NIC_RX_QUEUE 0
#define NIC_TX_PORT 1
#define NIC_TX_QUEUE 0
struct rte_sched_port *port = NULL;
struct rte_mbuf *pkts_rx[N_PKTS_RX], *pkts_tx[N_PKTS_TX];
uint32_t n_pkts_rx, n_pkts_tx;
/* Initialization Hqos配置初始化 */
<initialization code>
/* Runtime */
while (1) {
/* 从网卡RX队列开始收包*/
n_pkts_rx = rte_eth_rx_burst(NIC_RX_PORT, NIC_RX_QUEUE, pkts_rx, N_PKTS_RX);
/*多级调度入队操作 */
rte_sched_port_enqueue(port, pkts_rx, n_pkts_rx);
/* 多级调度出队操作*/
n_pkts_tx = rte_sched_port_dequeue(port, pkts_tx, N_PKTS_TX);
/* 报文发送到tx队列 */
rte_eth_tx_burst(NIC_TX_PORT, NIC_TX_QUEUE, pkts_tx, n_pkts_tx);
}
VPP HQOS基本流程图
vpp hqos功能实现使用dpdk hqos模块,这个模块在20.5版本被删除了。具体原因:很长时间不能正常工作了。
commit 548d70de68a4156d5bd4148e50a81555a0ef169f misc: deprecate dpdk hqos Not in functional state for a long time …
上图来源于其他博文,图片画的非常好。 1、2个网卡NIC使能rx多队列(这里是4个),创建了4个worker核。 2、NIC使能Hqos后,会在启动后进行Hqos相关资源的初始化,比较关键的就是申请Swq。每个网卡都会创建自己的swq队列(software queue)用于缓存待调度的保报文,为了实现发包无锁化,每个网卡swq队列的worker线程是一一对应。因此上图中swq是重叠的。 3、Hqos调度线程创建个数由配置文件确定。把Hqos线程绑定到对应的cpu核上,并且会和网卡关联。一个Hqos线程可以对应多个网卡(具体逻辑就需要后续代码分析了)。
这里有一点需要注意worker线程不能和hqos线程共有一个核,否则会导致无法启动。这里在线程初始化函数中vlib_thread_init会设置线程起始worker核心索引。
Hqos配置
1、配置网卡使能HQOS
dpdk {
socket-mem 16384,16384
dev 0000:02:00.0 {
num-rx-queues 2
hqos #使能网卡hqos
}
dev 0000:06:00.0 {
num-rx-queues 2
hqos {
hqos-thread 1
#另外还提供了一个网卡和hqos线程绑定的配置参数,表示与Hqos_thread线程第2个进行绑定。
}
}
num-mbufs 1000000
}
2、设置Hqos线程对应的核
cpu {
main-core 0
corelist-workers 1, 2, 3, 4
corelist-hqos-threads 5, 6 #启动两个hqos线程,分别使用cpu5和6
}
⚠️ Hqos指定的core不能与workers核对应的core重复,否则会导致无法启动。
参考文章
1、dpdk官方文档QOS框架 http://doc.dpdk.org/guides/prog_guide/qos_framework.html# 2、vpp Hqos分析 https://segmentfault.com/a/1190000019644679 3、Hqos enqueue、dequeue代码分析 https://blog.csdn.net/armlinuxww/article/details/105419112 4、Vpp Hqos相关介绍 https://docs.fd.io/vpp/19.01/qos_doc.html
相关文章
- SpringCloudRPC核心原理:RxJava响应式编程框架Scheduler调度器
- MySQL Error number: MY-010804; Symbol: ER_EVENT_SCHEDULER_GOT_BAD_DATA_FROM_TABLE; SQLSTATE: HY000 报错 故障修复 远程处理
- Oracle 视图 USER_SCHEDULER_JOB_LOG 官方解释,作用,如何使用详细说明
- Oracle 视图 USER_SCHEDULER_JOB_RUN_DETAILS 官方解释,作用,如何使用详细说明
- Oracle 视图 USER_SCHEDULER_PROGRAM_ARGS 官方解释,作用,如何使用详细说明
- Oracle 视图 USER_SCHEDULER_REMOTE_JOBSTATE 官方解释,作用,如何使用详细说明
- Oracle 视图 DBA_SCHEDULER_JOB_LOG 官方解释,作用,如何使用详细说明
- Oracle 视图 DBA_SCHEDULER_JOBS 官方解释,作用,如何使用详细说明
- MySQL Variables event_scheduler 数据库 参数变量解释及正确配置使用