入口使用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)
delete pbuf;
pbuf = null;
return ret;
}return ret;
}//出隊,取資料
#define dequeue_count 64
void dequeuering(int count)
if (unlikely(count== 0))
for(int i = 0; i < count; i++)
}
無鎖環形佇列
環形一讀一寫佇列中,不需要擔心unsigned long溢位問題,因為溢位後自動回歸,相減值還會保留。示例一 注 max count 必須為 2 的指數,即 2,4,8,16.佇列尺寸 define max count 4096 define max mask 4095 max count 1 變數...
環形無鎖佇列
1 元素是先進先出的 由佇列的性質保證的,在環形佇列中通過對佇列的順序訪問保證 2 空間可以重複利用 因為一般的環形佇列都是乙個元素數固定的乙個閉環,可以在環形佇列初始化的時候分配好確定的記憶體空間,當進隊或出隊時只需要返回指定元素記憶體空間的位址即可,這些記憶體空間可以重複利用,避免頻繁記憶體分配...
使用無鎖佇列(環形緩衝區)注意事項
環形緩衝區是生產者和消費者模型中常用的資料結構。生產者將資料放入陣列的尾端,而消費者從陣列的另一端移走資料,當達到陣列的尾部時,生產者繞回到陣列的頭部。如果只有乙個生產者和乙個消費者,那麼就可以做到免鎖訪問環形緩衝區 ring buffer 寫入索引只允許生產者訪問並修改,只要寫入者在更新索引之前將...