我使用DPDK做了一个简单的测试程序:computer1中的program1是发送数据包,而computer2中的program2是接收数据包。 computer1和computer2直接连接,没有开关。
在程序1中,我使用packId来指示数据包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左右。
答案 0 :(得分:0)
rte_eth_stats_get()对于故障排除非常有用。从rte_eth_stats,我发现ipackets是正确的,q_ipackets [0]是正确的,并且imissed是0,ierrors是0,rx_nombuf是0,q_errors [0]是0.所以它应该是program2中的代码有问题。检查代码后,这是因为program2中的一些内存管理。