DPDK丢包乱序

DPDK packet lost and disorder

我用DPDK做了一个简单的测试程序:computer1中的program1是发送数据包,computer2中的program2是接收数据包。 computer1 和 computer2 直接相连,没有切换。

在程序一中,我用一个packId来表示packet id的顺序。

while(true){
pkt = rte_pktmbuf_alloc(mbuf_pool); 
uint8_t* pchar = rte_pktmbuf_mod(pkt, uint8_t*); 
//set mac address and packet length. (pkt 0 to pkt 13). 
//use from byte 14 to store uint_64 packId; 
uint64_t* pPackId = (uint64_t*)(pchar+14); 
*pPackId = packId; 
packId++; 
//put 1024 bytes data inside packet. 
uint16_t sent = rte_eth_tx_burst(0, 0, &pkt, 1); 
while(sent!=1)
{
   sent = rte_eth_tx_burst(0, 0, &pkt, 1); 
}
}

在接收器中,我定义长 RX 环:nb_rxd=3072:

rte_eth_dev_adjust_nb_rx_tx_desc(0, &nb_rxd, &nb_txd); 
rte_eth_rx_queue_setup(0, 0, nb_rxd, rte_eth_dev_socket_id(0), NULL, mbuf_pool);

有一个for循环来接收数据包,并检查数据包序列id。

for(;;)
{
   strcut rte_mbuf *bufs[32]; 
   const uint16_t nb_rx = rte_eth_rx_burst(0, 0, bus, 32);
   if(unlikely(nb_rx==0))
      continue; 
   int m = 0; 
   for (m=0; m<nb_rx;m++)
   {
       uint8_t* pchar = rte_pktmbuf_mtod(buf[m], uint8_t*); 
       uint64_t* pPackId = pchar+14; 
       uint64_t packid = *pPackId; 
       if(expectedPackid!=packid){
           printf... 
           expectedPackid = packid+1; 
        }
       else expectedPackid++; 
   } 
} 

基于program2,我看到很多丢包和乱码。接收到的数据包放入环形缓冲区中。应该是按顺序接收的,我也发现有丢包,但是我的program1发送速度只有1gbps左右。

rte_eth_stats_get() 对于故障排除非常有用。从rte_eth_stats,我发现ipackets是正确的,q_ipackets[0]是正确的,imissed是0,ierrors是0,rx_nombuf是0,q_errors[0]是0。所以应该是program2中的代码有问题。查代码后发现是因为program2中的一些内存管理。