是否可以在单核DPDK上为多个rx队列分配优先级



嗨,我对DPDK还比较陌生。我想知道是否有可能在DPDK上为每个核心分配超过1个Rx队列。

但这里有更多关于的问题

  1. 1的第1个队列始终具有优先级,并将用于主数据包处理(Rx->decode->do_some_oper->Tx(
  2. 只有当第1个队列中没有剩余的mbuf时,才应使用第2个队列。(Rx->save_5_tuple_info->drop(
  3. 如果数据包未能放入第二个队列,则必须首先在第一个队列中尝试它

因此,基本上我的最终目标是捕获一些重要的细节(5个元组和其他一些(,因为队列已满,所以这些细节宁愿被丢弃。

@RoninGoda有多个问题和小节。所以让我试着一步一步地解释

[问题-1]是否可以在DPDK上为每个核心分配1个以上的Rx队列。

[答:]是,如果DPDK端口支持多个队列,并且其中一个端口已经配置并启动了多个队列;单个DPDK逻辑核心可以查询所有队列。

[问题-2]但这里有更多关于的问题

第1个队列总是具有优先级,并且将用于主分组处理(Rx->解码->do_some_oper->

只有当第1个队列中没有剩余的mbuf时,才应使用第2个队列。(Rx->save_5_tuple_info->drop(

如果数据包未能放入第二个队列,则必须首先在第一个队列中尝试它。

[答:]

第一部分:这里需要一定的清晰度。无论是支持多个队列的物理NIC(PF或VF(还是vdev NIC,都需要启用RSSRTE_FLOWuse external flow director来对NIC进行编程,以在队列-0和队列-1上分发数据包。

如果未配置上述机制,则所有数据包都将落入默认队列-0。因此只要业务流动,rx_ burst将总是返回CCD_

第二部分:假设队列0和队列1启用了RSS or RTE_FLOW or Flow Distributor,则可能有以下4种情况

  1. 队列0有数据包,队列1没有数据包
  2. 队列0没有数据包,队列1没有数据包
  3. 队列0有数据包,队列1有数据包
  4. 队列0没有数据包,队列1没有数据包

对于场景1,您当前的方法始终处理您共享的数据包和tx_burst。对于场景2,由于分组不在队列0中,队列1中的分组将被提取、计数和丢弃。

问题场景是3,因为当排队-0&队列-1有连续的数据包,您的逻辑总是处理来自队列-0的tx数据包,这将连续运行。当队列-1上的数据包开始累积RX描述符(即数据包DMA到主机内存(时,该描述符用完一旦队列没有更多的RX描述符,则去往队列-1的数据包将被丢弃在NIC中。因此,您将开始丢失NIC本身中的数据包

场景4不是问题,因为两个队列中都没有数据包。

注意:如果处理线程正在消耗更多的周期来处理和txburst,那么数据包也将在队列0中累积。在某些情况下,mbuf可能会耗尽,导致队列0和队列1都出现饥饿。

【避免跌落的推荐解决方案】

  1. 检查DPDK NIC是否为每个队列支持多个内存池。如果是,则将队列-0设置为具有较大元素的专用mbuf,将队列-1设置为具有较小元素的mempool
  2. 将队列0的RX描述符设置为允许更多累积的较大值,如2048或4096,同时将队列2的RX描述符设为512或1024
  3. 如果队列0的处理量很大,请尝试使用tx_buffer而不是tx_burst来分摊PCIe写入的成本
  4. 如果NIC PMD解析l2、l3、l4标头并将其存储在rte_mbuf中,请使用相同的标头,而不是解析队列-1中的5个元组,以节省CPU周期

重要变化:而不是固定循环

示例:

burst1 = q0 rx_burst
burst2 = q0 rx_burst
burst3 = q0 rx_burst
if (burst1 ==0 && burst2 ==0 && burst3 ==0); then
burst = q1 rx_burst

具有数据包计数器驱动的方法


portqueue_to_rxburst[4] = {0,0,0,0} /* global array*/
for (index =0; index < 4; index)
{
burst = q-portqueue_to_rxburst[index] rx_burst
if (unlikely(portqueue_to_rxburst[index] == 1) /* drop logic*/
{
....
continue
}
/* process queue-0 packets*/
}

使用外部定时器线程或服务线程从端口到get_xstats | get_Stats,并检查队列统计数据*。如果分组到达队列-1,则将全局数组索引3更新为队列-1*。

最新更新