zoukankan      html  css  js  c++  java
  • 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对数据包的处理流程,这将对理解这三个统计参数具有较好的帮助。

    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的大小。

  • 相关阅读:
    HUST 1372 marshmallow
    HUST 1371 Emergency relief
    CodeForces 629D Babaei and Birthday Cake
    CodeForces 629C Famil Door and Brackets
    ZOJ 3872 Beauty of Array
    ZOJ 3870 Team Formation
    HDU 5631 Rikka with Graph
    HDU 5630 Rikka with Chess
    CodeForces 626D Jerry's Protest
    【POJ 1964】 City Game
  • 原文地址:https://www.cnblogs.com/dream397/p/14718981.html
Copyright © 2011-2022 走看看