VPP 是美国思科网络开源的一个可扩展的框架,可提供开箱即用的生产质量交换机 / 路由器功能。它是思科矢量数据包处理(Vector Packet Processing,VPP)技术的开源版本:一种高性能的数据包处理堆栈,可以在商用 CPU 上运行。
其软件架构描述如下所示:(图片来着网络:大佬公众号Flowlet)
vpp源码的数据平面分为四个不同的层:
二、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 方向队列的处理函数逻辑如下所示:
void eth_rx_queue_stats_get(void *vqueue, struct rte_eth_stats *stats)
{
此处略去处理逻辑;
stats->imissed += idropped;
}
从该函数中可以看到,每次统计imissed的时候,都将imissed参数加上idropped,可见imissed参数统计的为rx 的丢包逻辑;
ierrors发生在上述第一步中,表示该数据包存在错误,被网卡丢弃。
此时该包不会存在于物理网卡的RX FIFO中,更不会存在于内存中的rte_rx_queue中。
rx_nombuf
rx_nombuf记录在读取数据包时分配mbuf错误的次数,一般情况下不会影响网卡的丢包(imissed、ierrors)。该变量的维护在rx_recv_pkts中。
如上所述imissed表示从网卡到内存写入数据包时的丢包个数,因此需要从以下2个方面进行调试:
因为报文从网卡到系统是经过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。
虚拟机中不支持查询
实际物理机中查询情况
其次:分析程序处理代码瓶颈处,优化算法实现
该部分具体问题具体分析!
最后:检查配置是否正确
写在最后:
如果您觉得这篇文章对您有帮助,欢迎点赞,谢谢!