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              
====================================================

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

4

1 回答 1

1

Packets droppedrte_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

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

于 2017-12-16T13:27:45.197 回答