DPDK丢包?

DPDK packet drop?

我正在尝试调试使用 DPDK 时与丢包相关的问题。在没有 DPDK 的情况下使用应用程序时,没有发现任何问题。

说明: 我有一个进程 A,它从进程 B(来自不同的服务器)接收数据包。

初始问题: 当在进程 A 中启用 DPDK 时,最初几秒钟,数据包流很好,但几分钟后进程 A 停止接收任何数据包。 这可能是什么原因?我已经确认进程 B 正在发送数据包。

调试: 我在我的应用程序中启用了 pdump 功能,这样我就可以使用 dpdk-pdump 进行数据包捕获。 在调试时,我看到,当我使用 dpdk-proc-info

检查时,服务器正在接收数据包
[root@QVr740-6 app]# ./dpdk-proc-info   -- --stats -p 0x1
EAL: Cannot find resource for device
EAL: No legacy callbacks, legacy socket not created

  ######################## NIC statistics for port 0  ########################
  **RX-packets: 11595973**    RX-errors:  0           RX-bytes:  17231595358
  RX-nombuf:  0
  TX-packets: 0           TX-errors:  0           TX-bytes:  22

  ############################################################################

但是,当我尝试进行数据包捕获时:

[root@QVr740-6 app]# ./dpdk-pdump -l 42,44,46  --   --pdump 'device_id=0000:18:00.1,queue=*,rx-dev=/home/cu1/nmurshed/capture.pcap'
EAL: Detected 56 lcore(s)
EAL: Detected 2 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket_69588_2a3baabe32a56
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: Probe PCI driver: net_i40e (8086:1572) device: 0000:18:00.1 (socket 0)
EAL: Probe PCI driver: net_i40e (8086:1572) device: 0000:18:00.2 (socket 0)
EAL: Cannot find resource for device
EAL: No legacy callbacks, legacy socket not created
Port 2 MAC: 02 70 63 61 70 01
 core (42), capture for (1) tuples
 - port 0 device (0000:18:00.1) queue 65535
^C

Signal 2 received, preparing to exit...
##### PDUMP DEBUG STATS #####
 -packets dequeued:                     0
 -packets transmitted to vdev:          0
 -packets freed:                        0

如何找出这些数据包丢弃的位置? 我确实确认 dpdk-pdump 在未发现问题时有效。

任何提示都将是有价值的,因为我一直为此焦头烂额。

编辑:

我在统计数据中漏掉了一些东西。我看到 Rx-missed_errors 在问题发生时以惊人的速度增长。

Wed Oct 20 18:47:46 PDT 2021
rx_missed_errors: 0
Wed Oct 20 18:47:47 PDT 2021
rx_missed_errors: 0
Wed Oct 20 18:47:48 PDT 2021
rx_missed_errors: 0
Wed Oct 20 18:47:49 PDT 2021
rx_missed_errors: 8216
Wed Oct 20 18:47:50 PDT 2021
rx_missed_errors: 32384
Wed Oct 20 18:47:51 PDT 2021
rx_missed_errors: 56510
Wed Oct 20 18:47:52 PDT 2021
rx_missed_errors: 80636
Wed Oct 20 18:47:53 PDT 2021
rx_missed_errors: 104762
Wed Oct 20 18:47:54 PDT 2021
rx_missed_errors: 128882
Wed Oct 20 18:47:55 PDT 2021
rx_missed_errors: 152960
Wed Oct 20 18:47:56 PDT 2021
rx_missed_errors: 177086
Wed Oct 20 18:47:57 PDT 2021```

I increased the rx/tx desc in  rte_eth_rx_queue_setup which delays the problem. Somehow, my application is not freeing the rx_desc.

Question.. is each packet received == 1 rx_desc?
Is it possible that my application takes too long time to process packet ? or is it like I am not freeing them ?

DPDK 计数器 rx_missed_errors 推断 NIC 上接收到的这些数据包未处理。 Rx-no-mbuf 表示计数器,显示由于缺少 MBUF 缓冲区而不是 DMA 到 CPU-Memory 的数据包。因此错误主要出现在应用程序逻辑 Spending too much time processing the packetsrecursive processing on the same MBUF array after rx_burst.

[EDIT-1] 根据几次调试尝试和指示,问题的根源在于应用程序逻辑。总结如下

  1. 对于传入的 ARP 请求,将处理数据包并在同一个 MBUF 上发送 ARP 回复,rte_pktmbuf_free 我们在 rte_Eth_tx_burst 之后立即调用 - 问题已修复
  2. 对于 IP 数据包,IP header 和 UDP header 会针对所需的数据包进行处理,并在传输前对 MBUF 进行必要的更改。 - 对于某些条件(数据包计数),逻辑进入更长的循环,从而停止函数退出。

注:

  1. 解决上述 2 个问题似乎可以解决问题。
  2. 使用 DPDK-Pktgen 生成自定义数据包可以缩小特定代码区域的范围。