QuickWords 34: DPDK i40e 82599网卡发送Tx丢包问题

现象

表现为在DPDK场景下网卡丢包或者发送队列Hang住。如果用GDB跟进去的话会发现是网卡的DD标志位未置位。

根因

因为DPDK ixgbe或者i40e驱动可以直接操作网卡的寄存器和Buffer,当上层业务存在问题,发送一些“不合规”的数据包时,这些有问题的数据包会直接进入网卡,引发硬件问题。

而在内核态时,这些有问题的数据包会被内核驱动过滤掉。

具体原因

引发发送丢包或发送队列Hang住的数据包包括以下几类:

  • 包长小于17Byte
  • 包长大于9674Byte
  • TCP报文分段数目大于8
  • TSO MSS小于256Byte
  • TSO MSS大于9674Byte
  • Mbuf链里mbuf个数和第一个mbuf的nb_segs值不一样
  • Mbuf链里任意一个mbuf的data_len=0
  • Mbuf链长度大于8
  • 其他目前还位置的原因

Workaround

在调用rte_eth_tx*()方法之前,调用ixgbe或i40e驱动提供的[ixgbe | i40e]_prep_pkts()方法,可排除大部分导致该问题的报文。目前已在几个客户生产环境下解决了问题。

同时不必过度担心此类检查会影响性能,经过实际测试影响很小。

根源上,还是需要业务层面找到产生“异常”报文的代码。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero