防止L2转发中的DPDK丢包

问题描述 投票:1回答:1

您好我已经为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              
====================================================

因为我的实现只是乒乓而且实现非常简单,所以我不相信在我的情况下应该有任何数据包丢失。

networking dpdk
1个回答
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队列已满,因为设备下方无法以您提供的速率发送数据包。

可能发生的情况很少:

  1. 您的RX端口速度大于您的TX端口速度(很可能不是您的情况)。
  2. 您的RX和TX端口具有相同的速度,但您在应用中添加了一些额外的数据包,因此它们不再适合(可能是您的情况)。
  3. 由于流量控制,您的NIC暂停传输,因此您有这些丢弃(很可能是您的情况)。

所以,如果我的猜测是正确的,只需使用ethtool禁用客户端的以太网流量控制:

ethtool -A eth0 tx off rx off

如果我的猜测不正确,那么在你的服务器端用rte_eth_stats_get()rte_eth_xstats_get()挖掘PMD计数器,看看发生了什么。

© www.soinside.com 2019 - 2024. All rights reserved.