您好我已经为DPDK实现了pingpong。与客户端发送数据包和服务器接收数据包,然后返回它们。
服务器部分的实现类似于DPDK官方网站中的L2转发样本。
在进行L2转发时,我注意到在将数据包从接收器队列转发到传输队列时存在数据包丢失。
我的问题是......有没有办法让数据包丢失为零?
我无法找到解决方案,因为DPDK网站的示例应用程序都有数据包丢失。
数据包丢失由下面的回调函数计算
rte_eth_tx_buffer_set_err_callback(tx_buffer[portid], rte_eth_tx_buffer_count_callback, &port_statistics[portid].dropped);
这是我从L2转发中获得的结果
Port statistics ====================================
Statistics for port 0 ------------------------------
Packets sent: 384126
Packets received: 379889
Packets dropped: 4237
Aggregate statistics ===============================
Total packets sent: 384126
Total packets received: 379889
Total packets dropped: 4237
====================================================
因为我的实现只是乒乓而且实现非常简单,所以我不相信在我的情况下应该有任何数据包丢失。
当功能Packets dropped
无法将数据包传输到目标端口时,rte_eth_tx_buffer_flush()
计数器在rte_eth_tx_burst()
中增加。
rte_eth_tx_burst()
函数只是调用你的tx_pkt_burst()
PMD回调,所以如果没有关于你的PMD下面的信息,很难说它失败的原因。所以下面的部分是相当多的猜测......
所以一般来说,rte_eth_tx_burst()
失败,因为TX队列已满。 TX队列已满,因为设备下方无法以您提供的速率发送数据包。
可能发生的情况很少:
所以,如果我的猜测是正确的,只需使用ethtool
禁用客户端的以太网流量控制:
ethtool -A eth0 tx off rx off
如果我的猜测不正确,那么在你的服务器端用rte_eth_stats_get()
和rte_eth_xstats_get()
挖掘PMD计数器,看看发生了什么。