dpdk无锁环形队列的使用

本文介绍了一种利用DPDK无锁队列提高数据包处理性能的方法。通过创建环形队列并进行enqueue和dequeue操作,有效减少了多线程锁带来的开销,提升了系统整体性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

入口使用dpdk,数据包解包分析后续处理线程性能太低,cpu很大一部分浪费在多线程锁开销上,于是想用dpdk无锁队列,看是否有改善。
使用前不知道dpdk的ring是否能在收发包之外使用,也没找到实际使用跟收发包无关的例子
也不需要使用mbuf,需要存储一个指针的队列,直接拿过来用看看可不可以。
前面dpdk初始化完毕,后面跟dpdk无关的地方,直接包含头文件使用,根据例子创建环形队列(个数为2的指数),enqueue,dequeue,使用ok,性能有所提升

//创建
//单生产单消费,根据自己需要设置
#define RING_SIZE 131072
rte_list = rte_ring_create("CircleRing_1", RING_SIZE,  SOCKET_ID_ANY, RING_F_SC_DEQ | RING_F_SP_ENQ);
    if (cirList == NULL)
        printf("Write to file rte ring create error!\n");
    else
        printf("Write to file rte ring create success:%d!\n",m_max_cache_size);
static int count = 1;
    if (!su || !cirList)
        return;

//使用,也可以一次入多个,一次取多个
int enqueueList(strParams* pbuf)
{
    int ret = rte_ring_enqueue(cirList, (void *) pbuf);
    if (unlikely(ret != 0)) {
        if(count++%100000 == 0)
        {
            count = 1;
            printf("rte_ring_enqueue error : %d !\n",ret);
        }
        delete pbuf;
        pbuf = NULL;
        return ret;
    }
    return ret;
}

//出队,取数据
#define DEQUEUE_COUNT 64
void dequeueRing(int count)
{
	strParams* params[DEUEUE_COUNT]
	 while (count>0 && unlikely(rte_ring_dequeue_bulk(cirList, (void**)params, DEQUEUE_COUNT )!=0)){
                count= (uint16_t)RTE_MIN(rte_ring_count(cirList), DEQUEUE_COUNT );
            }
            if (unlikely(count== 0)){
                usleep(100);
                return;
            }

            for(int i = 0; i < count; i++)
            {  
                strParams* param = params[i];
                if(!param)
                    continue;
                processParam(param);
            }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值