DPDK之什么是imissed、ierrors、rx_nombuf

在采用DPDK进行网络抓包时常常会通过rte_eth_stats_get函数获取当前网卡的丢包状态,首先看一下该函数的声明:

// 函数声明(dpdk-stable-19.11.3/lib/librte_ethdev/rte_ethdev.h)
int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats); // rte_eth_stats 结构体(dpdk-stable-19.11.3/lib/librte_ethdev/rte_ethdev.h)
struct rte_eth_stats {
uint64_t ipackets; /**< Total number of successfully received packets. */
uint64_t opackets; /**< Total number of successfully transmitted packets.*/
uint64_t ibytes; /**< Total number of successfully received bytes. */
uint64_t obytes; /**< Total number of successfully transmitted bytes. */
uint64_t imissed;
/**< Total of RX packets dropped by the HW,
* because there are no available buffer (i.e. RX queues are full).
*/
uint64_t ierrors; /**< Total number of erroneous received packets. */
uint64_t oerrors; /**< Total number of failed transmitted packets. */
uint64_t rx_nombuf; /**< Total number of RX mbuf allocation failures. */

可以看到rte_eth_stats结构体中包含imissed、ierrors、rx_nombuf三个与抓包性能相关的统计量,以下内容将对其进行展开介绍。

DPDK 数据包处理流程

在对以上三个统计量进行展开介绍之前有必要介绍一下DPDK对数据包的处理流程,这将对理解这三个统计参数具有较好的帮助。

  1. 物理网卡监听物理链路上的信息号,解析得到数据包,并将其存放在物理网卡上的RX FIFO中;
  2. 物理网卡上的DMA将数据包写入到内存中的rte_rx_queue;
  3. 应用程序通过PMD的形式轮询从rte_rx_queue读取数据包。

三个参数解析

imissed

imissed发生在上述DPDK抓包流程的第二步,表示rte_rx_queue已经塞满了数据包,所以该包被丢失。此时该包存在于物理网卡的RX FIFO中,但是不会存在于内存中的rte_rx_queue中。

ierrors

ierrors发生在上述第一步中,表示该数据包存在错误,被网卡丢弃。此时该包不会存在于物理网卡的RX FIFO中,更不会存在于内存中的rte_rx_queue中。

// dpdk-stable-19.11.3/drivers/net/ixgbe/ixgbe_ethdev.c:3369
stats->ierrors = hw_stats->crcerrs +
hw_stats->mspdc +
hw_stats->rlec +
hw_stats->ruc +
hw_stats->roc +
hw_stats->illerrc +
hw_stats->errbc +
hw_stats->rfc +
hw_stats->fccrc +

rx_nombuf

rx_nombuf记录在读取数据包时分配mbuf错误的次数,一般情况下不会影响网卡的丢包(imissed、ierrors)。该变量的维护在dpdk-stable-19.11.3/drivers/net/ixgbe/ixgbe_rxtx.c:1651:rx_recv_pkts中。

解决方法

上面讲了那么多,那么如何才能降低丢包呢?

imissed

如上所述imissed表示从网卡到内存写入数据包时的丢包个数,因此需要从以下2个方面进行调试:

1. PCIe是否存在瓶颈?

因为报文从网卡到系统是经过PCIe总线来传输的,PCIe总线的吞吐将直接影响数据包从网卡拷贝到内存的速率。通过lspci -s 03:00.1 -vv | grep Lnk可以查看当前网卡的PCIe速率,其中03:00.1是网卡的PCIe地址,可通过lspci -v|grep Ethernet查到。



由上图可以看到网口能力是传输速率5GT/s,总线宽带x8(LnkCap),实际使用的是传输速率5GT/s,总线宽带x8(LnkSta),工作正常。如果传输速率和总线带宽下降,则需要调试PCIe兼容性问题。一般是服务器与网卡兼容性问题,可以更换网卡或者更换服务器。如果有条件,可以找服务器厂商从bios等方面进行详细定位解决兼容性问题。

2. rte_rx_queue中的数据包没有及时消费掉?

  1. 检查CPU运行模式,cpupower frequency-info



    如果当前运行在powersave模式下,可以将其修改为performance,提升CPU频率,cpupower frequency-set -g performance

  2. 程序性能不佳,无法及时消耗掉rte_rx_queue中的数据包。

ierrrors

这个就没得办法了,毕竟本身数据包就有错误,接收了也没啥意思。如果实在想接收,可通过rte_eth_rxconfoffloads成员进行设置。

rx_nombuf

直接增大mempool的大小。

最新文章

  1. Java基础知识系列——日期
  2. openfire/spark/asmack 环境调试纪要
  3. LXC的介绍
  4. BZOJ1202 [HNOI2005]狡猾的商人&amp;&amp;BZOJ3436小K的农场
  5. Thinking in Java——笔记(3)
  6. Android 高级UI设计笔记14:Gallery(画廊控件)之 3D图片浏览
  7. oc 一些通用函数
  8. Margin和Padding之间的区别
  9. Angular过滤器 自定义及使用方法
  10. uva 10382 Watering Grass_贪心
  11. view和activity的区别(转)
  12. springmvc入门程序
  13. 多线程编程 - PHP 实现
  14. spring-oauth-server实践:授权方式1、2、3和授权方式4的token对象.authorities产生方式比较
  15. 【Go】获取用户真实的ip地址
  16. Visual Studio编译时报错“函数名:重定义;不同的基类型”
  17. 转:CMake快速入门教程-实战
  18. MySQL/Oracle/SQL Server默认端口、JDBCdriver、Url
  19. Cookie 基本操作
  20. Excel时间格式修改为文本格式

热门文章

  1. Format中的转换说明符
  2. MyEclipse 选中属性或方法后 相同的不变色
  3. java.math.BigDecimal cannot be cast to [Ljava.lang.Object;
  4. JavaScript笔记- 函数声明和函数表达式(001)
  5. 创建虚拟机和安装centos7 &amp; install oracle
  6. Python——查看目录下所有的目录和文件
  7. 记一道CTF隐写题解答过程
  8. python-----内存管理机制
  9. Jetbranis学习资料之全家桶
  10. 卸载wsl子系统