DPDK之什么是imissed、ierrors、rx_nombuf
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对数据包的处理流程,这将对理解这三个统计参数具有较好的帮助。
- 物理网卡监听物理链路上的信息号,解析得到数据包,并将其存放在物理网卡上的RX FIFO中;
- 物理网卡上的DMA将数据包写入到内存中的rte_rx_queue;
- 应用程序通过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中的数据包没有及时消费掉?
检查CPU运行模式,
cpupower frequency-info
如果当前运行在powersave模式下,可以将其修改为performance,提升CPU频率,cpupower frequency-set -g performance
。程序性能不佳,无法及时消耗掉
rte_rx_queue
中的数据包。
ierrrors
这个就没得办法了,毕竟本身数据包就有错误,接收了也没啥意思。如果实在想接收,可通过rte_eth_rxconf
的offloads
成员进行设置。
rx_nombuf
直接增大mempool
的大小。
DPDK之什么是imissed、ierrors、rx_nombuf的更多相关文章
- [development][profile][dpdk] KK程序性能调优
KK程序: 1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程.第二个线程将数据写入共享内存. 2. 第二个内存在发现共享内存已满时,会直接丢弃数据. 3. 线程二有个选项de ...
- Intel 推出 DPDK 开发包的意义是什么?
Intel 推出 DPDK 开发包的意义是什么? http://www.zhihu.com/question/27413080?sort=created 基于intel dpdk的包处理器,相较于基于 ...
- [dpdk] 熟悉SDK与初步使用 (四)(L3 Forwarding源码分析)
接续前节:[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析) 前文中的最后一个问题,搁置,并没有找到答案.所以继续阅读其他例子的代码,想必定能在其他位置看到答案. ...
- [dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境)
搭建实验环境: troubleshoot 第一步加载驱动 第二步切换驱动 使用了所有qemu支持的卡 [tong@T7:~/VM/dpdk] % cat start.sh sudo qemu-syst ...
- [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)
接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数: int rte_eal_init(int argc, char **ar ...
- [dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)
对例子IP Fragmentation的熟悉,使用,以及源码分析. 功能: 该例子的功能有二: 一: 将IP分片? 二: 根据路由表,做包转发. 路由表如下: IP_FRAG: Socket : ad ...
- DPDK编译步骤
大页内存分配: NUMA系统(现在的linux一般都是) echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048 ...
- DPDK内存管理(1)
1 前言 DPDK将利用hugepage预留的物理内存统一的组织管理起来,然后以库的方式对外提供使用的接口.下图展示了DPDK中内存有关的模块的相互关系. rte_eal 是统一 ...
- [DPDK][转]DPDK编程开发(4)—lcore
1.知识百科 返回值 操作函数 函数功能 RTE_DECLARE_PER_LCORE (unsigned, _lcore_id) RTE_DECLARE_PER_LCORE (rte_cpuset_t ...
随机推荐
- 新来的"大神"用策略模式把if else给"优化"了,技术总监说:能不能想好了再改?
本文来自作者投稿,原作者:上帝爱吃苹果 目前在魔都,贝壳找房是我的雇主,平时关注一些 java 领域相关的技术,希望你们能在这篇文章中找到些有用的东西.个人水平有限,如果文章有错误还请指出,在留言区一 ...
- JSP新闻显示
MYSQL数据库创建新闻表,用户登陆时使用SERVLET获取用户名,效验通过后直接跳转新闻列表页面,JSP使用EL显示新闻列表 1.首先创建数据库及用户.新闻表 CREATE DATABASE /*! ...
- 动态自动配置Bean
概览 接口Condition 用于基于条件的自动配置,和注解@Conditional配合使用,可实现JavaBean的动态自动配置 自定义实现动态配置Bean 定义一个接口和两个实现类 定义两个Con ...
- 使用IDEA 发布项目搭配远程仓库 Gitee
本次讲解的是idea 发布到gitee上 一样的操作流程 没有基础的请先去学习 附上我的 gitee 地址 有资源会发布到gitee 俗话说关注走一走 活到999 https://gitee.com/ ...
- LIMS产品 - Labware
软件架构 客户端:Labware软件,部分C/S功能 Web服务:Apache Tomcat等,部分B/S功能 后台服务:计划.调度程序,环境监控样.稳定性研究等 数据库驱动:ODBC 报表工具:水晶 ...
- MongoDB快速入门教程 (4.2)
4.2.Mongoose实现增删查改 中文文档地址: https://cn.mongoosedoc.top/docs/guide.html 4.2.1.Mongoose是什么? Mongoose是Mo ...
- 部署JUnit
JUnit的简介和使用:http://blog.csdn.net/luanlouis/article/details/37562165 jar包下载地址:http://www.java2s.com/C ...
- mybatis关于Criteria的一点小坑。。。
目录 在用Criteria时,相关代码如下: final RolePermissionExample example = new RolePermissionExample(); example.cr ...
- 区间dp(能量项链)
[题目大意] 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记 ...
- day48 navicat使用及pymysql的使用
目录 一.navicat介绍 1 基本使用 2 练习题 2.1 查询所有的课程的名称以及对应的任课老师姓名 2.2 查询平均成绩大于八十分的同学的姓名和平均成绩 2.3 查询没有报李平老师课的学生姓名 ...