DPDK详解

DPDK的优点:

  1. 可以绑定到固定的core上运行;
  2. 舍弃内核中断,报文直接通过DMA传输到用户态处理;
  3. 单独的内存管理机制,效率高效;

用户态配置参数:

  • NB_MBUF:rte_mempool中包含的rte_mbuf元素的个数;
  • MBUF_SIZE:每个rte_mbuf元素的大小;
  • 环形队列的元素个数;

内存池:

1 l2fwd_pktmbuf_pool =
2     rte_mempool_create("mbuf_pool", NB_MBUF,  //rte_mempool包含的rte_mbuf元素的个数;
3                MBUF_SIZE, 32,                 //每个rte_mbuf元素的大小;
4                sizeof(struct rte_pktmbuf_pool_private),
5                rte_pktmbuf_pool_init, NULL,
6                rte_pktmbuf_init, NULL,
7                rte_socket_id(), 0);

环形队列:

  • 环形无锁队列,存储mempool中的对象指针
  • share_ring = rte_ring_create("TESTRING", 1048576, rte_socket_id(), rg_flags);

DPDK从队列摘包过程:

    void *obj;
    struct header_info *hdr;
    struct rte_mbuf *m;
    const char *p;
    while(1){
        ring_count = rte_ring_count(share_ring);  // share_ring = rte_ring_create("TESTRING", 1048576, rte_socket_id(), rg_flags);
        if(ring_count > 0){
            rte_ring_mc_dequeue(share_ring,&obj);
            hdr = (struct header_info *)obj;
            m = (struct rte_mbuf *)hdr->buffer;
            p = rte_pktmbuf_mtod(m, u_char *);
            (*pkt_parse)(p, m->data_len);
            rte_pktmbuf_free(m);
            rte_mempool_mp_put(header_info_pool, hdr);
        }


你可能感兴趣的:(DPDK详解)