您好我已经为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
====================================================
因为我的实现只是乒乓而且实现非常简单,所以我不认为在我的情况下应该有任何数据包丢失。
答案 0 :(得分:1)
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队列已满,因为设备下方无法以您提供的速率发送数据包。
可能发生的情况很少:
您的RX端口速度大于您的TX端口速度(很可能不是您的情况)。
您的RX和TX端口具有相同的速度,但您在应用中添加了一些额外的数据包,因此它们不再适合(可能是您的情况)。
由于流量控制,您的NIC暂停传输,因此您有这些丢弃(很可能就是您的情况)。
所以,如果我的猜测是正确的,只需使用ethtool
禁用客户端的以太网流量控制:
ethtool -A eth0 tx off rx off
如果我的猜测不正确,那么在服务器端使用rte_eth_stats_get()
和rte_eth_xstats_get()
深入了解PMD计数器,看看发生了什么。