dpdk 多队列配置

dpdk配置:

dpdk中多队列的配置,其实就是将收到的数据包通过一些计算然后分配到不同的网卡接收队列中,达到负载分流的效果。在dpdk中,可以通过一些简单的配置,开启RSS(微软提出的一种负载分流方法)。

static uint8_t default_rss_key_40bytes[] = {
        0xd1, 0x81, 0xc6, 0x2c, 0xf7, 0xf4, 0xdb, 0x5b,
        0x19, 0x83, 0xa2, 0xfc, 0x94, 0x3e, 0x1a, 0xdb,
        0xd9, 0x38, 0x9e, 0x6b, 0xd1, 0x03, 0x9c, 0x2c,
        0xa7, 0x44, 0x99, 0xad, 0x59, 0x3d, 0x56, 0xd9,
        0xf3, 0x25, 0x3c, 0x06, 0x2a, 0xdc, 0x1f, 0xfc
};
static struct rte_eth_conf port_conf = {
        .rxmode = {
                .mq_mode = ETH_MQ_RX_RSS, //开启RSS
                .split_hdr_size = 0,
        },
        .txmode = {
                .mq_mode = RTE_ETH_MQ_TX_NONE,
        },
        // RSS配置
        .rx_adv_conf = {
                .rss_conf = {
                        .rss_key = default_rss_key_40bytes, // 40字节的hash key  
                        // 为NULL的话会采用默认的key
                        .rss_key_len = 40,
                        .rss_hf = RTE_ETH_RSS_PROTO_MASK, //配置哈希方法
                        // 可能有一些会不受支持,没有关系,后面会消去一部分
                        // 开启其实就是把对应位置从0置为1就行了
                },
        },
};

后面就是对这个配置信息的一些内容进行修改 然后用修改过的配置信息去配置网卡

if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
            local_conf.txmode.offloads |= RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;

local_conf.rx_adv_conf.rss_conf.rss_hf &=
                dev_info.flow_type_rss_offloads;

rte_eth_dev_configure(port_id, nb_rxq, nb_txq, &local_conf);

然后为每个核分配一个队列

uint lcore_id = 0;
memset(core_to_rx_queue, -1, sizeof(core_to_rx_queue));
memset(core_to_tx_queue, -1, sizeof(core_to_tx_queue));
uint nb_rx_queues = 0;
uint nb_tx_queues = 0;
while (lcore_id < EN_CS) {
    if (rte_lcore_is_enabled(lcore_id)) {
        if ((nb_rx_queues < nb_rxq) && (!(~core_to_rx_queue[lcore_id])))core_to_rx_queue[lcore_id] = nb_rx_queues++;
        if ((nb_tx_queues < nb_txq) && (!(~core_to_tx_queue[lcore_id])))core_to_tx_queue[lcore_id] = nb_tx_queues++;
    }
    lcore_id++;
}

这个写的有点潦草,建议重新写一个

然后为每个核分配收发包任务

void *args;
args = (void *)mem_pool;
rte_eal_mp_remote_launch(task_per_logical_core, args, CALL_MAIN);

RTE_LCORE_FOREACH_WORKER(lcore_id) {
    if (rte_eal_wait_lcore(lcore_id)) {
        ret = -1;
        break;
    }
}

问题:

配置完成后,每次收发包都打印是哪个核收发包,发现,只有主核的队列不停的接收数据和发送数据,其余核心也进入了task函数,但是不参与收发包。

解决:

是vmware网卡的问题,用真实网卡测试一切正常。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值