入口使用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);
}
}