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 packets
或 recursive processing on the same MBUF array after rx_burst
.
[EDIT-1] 根据几次调试尝试和指示,问题的根源在于应用程序逻辑。总结如下
- 对于传入的 ARP 请求,将处理数据包并在同一个 MBUF 上发送 ARP 回复,
rte_pktmbuf_free
我们在 rte_Eth_tx_burst
之后立即调用 - 问题已修复
- 对于 IP 数据包,IP header 和 UDP header 会针对所需的数据包进行处理,并在传输前对 MBUF 进行必要的更改。 - 对于某些条件(数据包计数),逻辑进入更长的循环,从而停止函数退出。
注:
- 解决上述 2 个问题似乎可以解决问题。
- 使用 DPDK-Pktgen 生成自定义数据包可以缩小特定代码区域的范围。
我正在尝试调试使用 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 packets
或 recursive processing on the same MBUF array after rx_burst
.
[EDIT-1] 根据几次调试尝试和指示,问题的根源在于应用程序逻辑。总结如下
- 对于传入的 ARP 请求,将处理数据包并在同一个 MBUF 上发送 ARP 回复,
rte_pktmbuf_free
我们在rte_Eth_tx_burst
之后立即调用 - 问题已修复 - 对于 IP 数据包,IP header 和 UDP header 会针对所需的数据包进行处理,并在传输前对 MBUF 进行必要的更改。 - 对于某些条件(数据包计数),逻辑进入更长的循环,从而停止函数退出。
注:
- 解决上述 2 个问题似乎可以解决问题。
- 使用 DPDK-Pktgen 生成自定义数据包可以缩小特定代码区域的范围。