一、什么是VPP
VPP 是美国思科网络开源的一个可扩展的框架,可提供开箱即用的生产质量交换机 / 路由器功能。它是思科矢量数据包处理(Vector Packet Processing,VPP)技术的开源版本:一种高性能的数据包处理堆栈,可以在商用 CPU 上运行。
其软件架构描述如下所示:(图片来着网络:大佬公众号Flowlet)

vpp源码的数据平面分为四个不同的层:
基础架构层:包括vppinfra,vlib,svm和二进制api库。源码:/src/{vppinfra, vlib, svm, vlibapi, vlibmemory}
通用网络协议栈层:vnet。源码:/src/vnet
应用程序shell:vpp。源码:/src/vpp
日益丰富的数据平面插件。源码:/src/plugins
二、VPP丢包统计分析
下面我们言归正传,介绍VPP的丢包统计分析。
在show interface 统计接口流量的时候,应该关注哪些统计字段呢?在dpdk插件中统计字段的描述如下所示:vpp/src/plugins/dpdk/device/format.c

其中 tx 方向的丢包:tx errors ;rx 方向的丢包 rx missed 分别对应了intel DPDK中的 oerrors 和 imissed。
VPP中DPDK以插件的方式集成,在dpdk插件中完成对dpdk的初始化和操作,那么我们继续分析DPDK 代码:以DPDK 19.11.14 LTS 版本为例
在dpdk中,通过 rte_eth_stats_get 获取统计信息
函数:
int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats);
参数:
1、port id :网卡的逻辑id
2、stats:统计信息的结构体

结构体描述:

从上述我们可以看到:imissed、oerrors、rx_nombuf三个成员,对应vpp中的 rx missed(收包侧丢包)、tx error(发送侧丢包)丢包;
在对以上三个统计量进行展开介绍之前有必要介绍一下DPDK对数据包的处理流程。
DPDK 数据包处理流程

物理网卡监听物理链路上的信息号,解析得到数据包,并将其存放在物理网卡上的RX FIFO中;
物理网卡上的DMA将数据包写入到内存中的rte_rx_queue;
应用程序通过PMD的形式轮询从rte_rx_queue读取数据包。
参数解析
1、imissed 参数
在dpdk处理rx 方向队列的处理函数逻辑如下所示:
void eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)
{
此处略去处理逻辑;
stats->imissed += idropped;
}
从该函数中可以看到,每次统计imissed的时候,都将imissed参数加上idropped,可见imissed参数统计的为rx 的丢包逻辑;

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

rx_nombuf
rx_nombuf记录在读取数据包时分配mbuf错误的次数,一般情况下不会影响网卡的丢包(imissed、ierrors)。该变量的维护在rx_recv_pkts中。

如何解决丢包问题:
imissed 收包侧丢包
如上所述imissed表示从网卡到内存写入数据包时的丢包个数,因此需要从以下2个方面进行调试:
1、判读PCIe是否存在瓶颈
因为报文从网卡到系统是经过PCIe总线来传输的,PCIe总线的吞吐将直接影响数据包从网卡拷贝到内存的速率。
通过lspci |grep Eth 可以查询网卡的PCIe地址;
通过 lspci -s 02:01.0 -vv 可以查看 当前网卡的PCIe速率。
通过查询LnKSta: Speed 5GT/s, 表示网卡的传输速率是5GT/s,总线带宽x8 (LnKCap)际使用的是传输速率5GT/s,总线宽带x8(LnkSta),工作正常。如果传输速率和总线带宽下降,则需要调试PCIe兼容性问题。

2、定位软件处理效率低的问题,即队列的包没有及时处理掉导致了拥塞
首先、检查CPU运行模式,cpupower frequency-info
如果当前运行在powersave模式下,可以将其修改为performance,提升CPU频率,cpupower frequency-set -g performance。
虚拟机中不支持查询

实际物理机中查询情况

其次:分析程序处理代码瓶颈处,优化算法实现
该部分具体问题具体分析!
最后:检查配置是否正确

写在最后:
如果您觉得这篇文章对您有帮助,欢迎点赞关注一下吧,谢谢!

