数据库修仙金丹篇六——vpp与dpdk的关系

DPDK&VPP关键技术文档总结 Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 学习地址: https://ke.qq.com/course/5066203?(https://blog.youkuaiyun.com/shaoyunzhe/article/category/6538239),DPDK和vpp的文章都挺多了,不是源码解读,主要是使用方面。13、vfio 和UIO 区别 https://www.cnblogs.com/yi-mu-xi/p/10515609.html。7、如何在DPDK 盒子上使用TRex。. 阅读详情
AI摘要

本文探讨了VPP如何利用DPDK作为插件加速网络包收发,涉及dpdk_config、dpdk_lib_init等初始化流程,以及dpdk内存管理的细节,包括mempool的创建与操作。

vpp与dpdk的关系

dpdk作为vpp的一个插件,主要用来从网卡收发包。

vpp使用如下命令参数初始化dpdk eal。

EAL init args: -c a -n 1 --in-memory --huge-dir /mnt/hugepages --no-pci --proc-type primary --file-prefix vpp --master-lcore 1

dpdk初始化流程

读取配置

dpdk_config

初始化库

dpdk_lib_init

注册节点

  • 输入节点
dpdk_device_inpu
  • 输出节点

    • 接口tx function的赋值

      VNET_DEVICE_CLASS_TX_FN (dpdk_device_class)
      
    • 接口output node和tx node的初始化

网口操作

/* A class of hardware interface devices. */
/* 一类硬件接口的操作函数集合,这些函数是在硬件设备的驱动上封装的一层 */
typedef struct _vnet_device_class
{
    /* Index into main vector.类索引 */
    u32 index;

    /* Device name (e.g. "FOOBAR 1234a").设备类名字 */
    char *name;

    /* Function to call when hardware interface is added/deleted. */
    /* 添加/删除一个该类设备的实例函数 */
    vnet_interface_function_t *interface_add_del_function;

    /* Function to bring device administratively up/down. */
    /* 设备UP/DOWN操作函数 */
    vnet_interface_function_t *admin_up_down_function;

    /* Function to call when sub-interface is added/deleted */
    /* 以该类型设备为主设备,添加/删除一个子接口的函数 */
    vnet_subif_add_del_function_t *subif_add_del_function;

    /* Function to call interface rx mode is changed */
    /* 接收模式变化函数 */
    vnet_interface_set_rx_mode_function_t *rx_mode_change_function;

    /* Function to call interface l2 mode is changed */
    /* 接口的二层模式变化操作函数 */
    vnet_interface_set_l2_mode_function_t *set_l2_mode_function;

    /* Redistribute flag changes/existence of this interface class. */
    u32 redistribute;

    /* Transmit function. */
    /* 发送函数 */
    vlib_node_function_t *tx_function;

    /* Transmit function candidate registration with priority */
    /* 注册的多个候选的发送函数,最终根据优先级选择一个最高的赋值给tx_function */
    vlib_node_fn_registration_t *tx_fn_registrations;

    /* Error strings indexed by error code for this node. */
    /* 发送函数错误原因字符数组 */
    char **tx_function_error_strings;

    /* Number of error codes used by this node. */
    /* tx_function_error_strings数组大小 */
    u32 tx_function_n_errors;

    /* Renumber device name [only!] support, a control-plane kludge */
    int (*name_renumber) (struct vnet_hw_interface_t * hi,
                          u32 new_dev_instance);

    /* Interface flow offload operations */
    /* 流量卸载功能操作函数集合 */                      
    vnet_flow_dev_ops_function_t *flow_ops_function;

    /* Format device instance as name. */
    format_function_t *format_device_name;

    /* Parse function for device name. */
    unformat_function_t *unformat_device_name;

    /* Format device verbosely for this class. */
    format_function_t *format_device;

    /* Trace buffer format for TX function. */
    format_function_t *format_tx_trace;

    /* Format flow offload entry */
    format_function_t *format_flow;

    /* Function to clear hardware counters for device. */
    /* 清除统计函数 */
    void (*clear_counters) (u32 dev_class_instance);

    uword (*is_valid_class_for_interface) (struct vnet_main_t * vnm,
                                           u32 hw_if_index,
                                           u32 hw_class_index);

    /* Called when hardware class of an interface changes. */
    void (*hw_class_change) (struct vnet_main_t * vnm,
                             u32 hw_if_index, u32 new_hw_class_index);

    /* Called to redirect traffic from a specific interface instance */
    /* 强制重定向一个接口的流量到指定的node */                         
    void (*rx_redirect_to_node) (struct vnet_main_t * vnm,
                                 u32 hw_if_index, u32 node_index);

    /* Link-list of all device classes set up by constructors created below */
    /* 形成链表 */
    struct _vnet_device_class *next_class_registration;

    /* Function to set mac address. */
    /* 链路层地址变化函数 */
    vnet_interface_set_mac_address_function_t *mac_addr_change_function;
} vnet_device_class_t;

vpp中dpdk内存管理

dpdk_config
dpdk_buffer_pool_create
dpdk_pool_create
rte_mempool_create_empty
rte_pktmbuf_pool_init
rte_mempool_get_priv
dpdk_lib_init

dpdk_pool_create与rte_pktmbuf_pool_create的区别:

dpdk mempool

  • mempool基础

Mempool是固定大小的对象分配器。 在DPDK中,它由名称唯一标识,并且使用mempool操作来存储空闲对象。Mempool的组织是通过三个部分实现的:

  • mempool对象节点:mempool的对象挂接在 static struct rte_tailq_elem rte_mempool_tailq 全局队列中,可以通过名字进行唯一标识符;此队列只是mempool的一个对象指示结构,并不是实际的内存区;
  • mempool实际内存区: struct rte_memzone 是实际分配的连续内存空间,存储所创建的mempool对象;
  • ring无锁队列:作为一个无锁环形队列 struct rte_ring ,存储着mempool对象的指针,提供了方便存取使用mempool的空间的办法。

mempool的对象通过与ring无锁队列建立关联方便存取;同时,为了减少多核访问造成的冲突,引入了local_cache对象缓冲区。该local_cache非硬件上的cache,而是为了减少多核访问ring造成的临界区访问,coreX app会优先访问该local_cache上的对象。入队的时候优先入local_cache中,出队的时候优先从local_cache中出队。

  • mempool创建使用

先注意一下 rte_mempool_create 的参数中的两个 mp_init 和 obj_init ,前者负责初始化mempool中配置的私有参数,如在数据包中加入的我们自己的私有结构;后者负责初始化每个mempool对象。我们然后按照mempool的3个关键部分展开说明。

  • mempool头结构的创建

    mempool头结构包含3个部分: struct rte_mempool , struct rte_mempool_cache 和mempool private。创建是在 rte_mempool_create_empty() 中完成的,先进行了对齐的检查,然后从mempool队列中取出头节点,我们创建的mempool结构填充好,就挂接在这个节点上。接下来做一些检查工作和创建flag的设置.rte_mempool_calc_obj_size() 计算了每个obj的大小,这个obj又是由三个部分组成的,header_size、elt_size、trailer_size,即头,数据区,尾。在没有开启RTE_LIBRTE_MEMPOOL_DEBUG调试时,没有尾部分;头部分的结构为: struct rte_mempool_objhdr ,通过这个头部,mempool中的obj都是链接到队列中的,所以,提供了遍历obj的方式(尽管很少这么用)。函数返回最后计算对齐后的obj的大小,为后面分配空间提供依据。

  • mempool实际空间的创建

这部分的创建是在函数 rte_mempool_populate_default(struct rte_mempool *mp) 中完成的。

首先计算为这些元素需要分配多大的空间, rte_mempool_ops_calc_mem_size()

接着 rte_memzone_reserve_aligned() 分配空间。把元素添加到mempool,实际上就是把申请的空间分给每个元素。

  • ring的创建

转自DPDK-----内存管理之mempool

reference

  1. https://blog.youkuaiyun.com/the_dog_tail_grass/article/details/113603311
  2. https://blog.youkuaiyun.com/u010827484/article/details/103377792
  3. https://segmentfault.com/a/1190000019400426
  4. https://www.cnblogs.com/rex-2018-cloud/p/10039065.html
DPDK高性能处理框架VPP 如果需要使用 vppctl,需要 cli-listen /run/vpp/cli.sock。修改 src/configure.ac修改 src/plugins/Makefile.am。执行完成以后,在 /etc/vpp/startup.conf。Windows 物理机 ping 192.168.0.120。在 /usr/lib/vpp_plugins/Startup.conf 里面的 pci 地址。将 eth0/eth1/eth2 关闭。配置 vpp1host ip 地址。编写 Startup.conf。 阅读详情

相关推荐

DPDK 学习 网络协议栈-vpp-OvS-DDos-虚拟化专家之路

一、什么是DPDK 对于用户来说,它可能是一个性能出色的包数据处 理加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创 新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。 DPDK 用软件的方式在通用多核处理器上演绎着数据包处理的新篇 章,而对于数据包处理,多核处理器显然不是唯一的平台。支撑包处理 的主流硬件平台大致可分为三个方向。 硬件加速器 网络处理器 多核处理器 在类似 IA(Intel Architecture)多核处理器为目标的平台上,网络数据包处理远早于 DPDK 而.

C/C++Linux、音视频、DPDK 3626

DPDK VPP简单入门及源码plugin实例分析

DPDK VPP简单入门及源码plugin实例分析

zhp优快云921011的博客 8365

Linux: DPDK & VPP

源码:http://core.dpdk.org/download/ 错误示例,使用intel的i40e 驱动提供的 VF:发现cmd dpdk 3815 - - _atomic_set_cmd(): There is incomplete cmd 9 //含义,还有没有完成的command 9 在pending 中; VIRTCHNL_OP_DISABLE_QUEUES = 9, dpdk 3815 - - i40evf_switch_queue(): fail to switch TX 1 off

mzhan017的博客 1975

用户级协议和框架:DPDK、SPDK和VPP的业务场景和发展趋势

在当今数字化世界中,网络通信和存储技术一直是不可或缺的要素,特别是在云计算、边缘计算和物联网等领域。传统的内核级别协议和框架在某些场景下已经显得不够灵活和高效。为了满足更高的性能、更低的延迟和更大的可扩展性需求,用户级别的协议和框架开始崭露头角。

统信软件的博客 3116

从BSCAN到BAP:深度解析Tessent MBIST逻辑的协同工作机制与设计考量

本文深入解析了Tessent MBIST逻辑中BSCAN Interface、Logic Group Def、Controller与BAP模块的协同工作机制。文章以一条测试指令的完整路径为例,详细阐述了数据流与控制流如何跨模块、跨时钟域协同工作,并重点探讨了MBIST BAP在协议转换与流量管理中的核心桥梁作用,为芯片内建自测试的集成与调试提供了关键的设计考量和实战技巧。

kappa的博客 483

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录(20170803YC) 本次总结主要实现的功能如下:用MEXE02软件在步进电机驱动器中设置好控制动作,每个控制动作有一个特定的编号。之后通过PC和驱动器之间的485通讯,发送相关指令,使步进电机按照一定编号的控制动作运转。 参考资料:东方马达步进电机AZM66AK-HS100+AZD-KD的产品手册,可在官网下载。 A....

dahailuoa6的博客 1万+

数据库修仙金丹篇十——vpp使用kni

vpp使用kni

growdu的网络博客 976

FFmpeg实战:5分钟搞定m3u8视频下载与ts文件合并(附完整命令)

本文详细介绍了如何使用FFmpeg快速下载m3u8视频并合并ts文件为mp4格式。通过简洁的命令行操作,读者可以轻松完成视频处理任务,包括环境准备、链接获取、下载合并及性能优化等实用技巧,特别适合需要高效处理流媒体内容的用户。

weixin_30836759的博客 221

数据库修仙金丹篇十二——ptp1588v2实现方案

ptp1588v2实现方案

growdu的网络博客 1977

IAR9.30以上版本安装、注册、新建工程和配置过程详细介绍

IAR 一般是指一款嵌入式软件的集成开发环境,类似于 MDK-Keil 这款软件。IAR 对于不同的内核处理器,是对应不同的 IAR 软件的,IAR 到目前为止支持大部分的MCU,比如8051系列、ARM架构系列、MSP430系列、AVR系列等等这些常用的芯片架构。对于 ARM 架构的芯片,有对应的 IAR Embedded Workbench for ARM 软件平台,因为我主要是使用 ARM 架构芯片,下面安装、注册和使用都是基于这个版本进行介绍的。

luobeihai的博客 6万+

PyTorch深度学习实战(4)——常用激活函数和损失函数详解

激活函数和损失函数是深度学习模型中重要组成部分,激活函数和损失函数的选择很大程度上决定了深度神经网络的性能和精度,需要根据具体问题的特点和数据分布等因素进行选择。在本节中,将介绍深度学习中常见的激活函数和损失函数,并说明不同函数的常见应用场景。

盼小辉丶的博客 1万+

VPP使用DPDK纳管主机网卡

正文共:888 字 24 图,预估阅读时间:1 分钟我们之前安装的VPP版本是20.09(安装一个VPP 20.09),现在看官网版本已经更新到22.06.0了。我们先用命令yum update vpp -y看一下YUM仓库里面更新版本了没有。确认一下。确实,仓库里面最新版本还是20.09,那就还用这个版本吧。在DPDK官网,关于部署有相关文档,但是没有和VPP对应的20.09这个版本,所以我选择...

衡水铁头哥的博客 2184

倍福--实现TCP/IP的配置

控制器为CX5120,需要和上位机做通信,选择TCP/IP的通讯方式,本文介绍TCP/IP通信的操作步骤。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 1.2. 串口调试助手 3 1.2.1. TCP调试通信助手 3 授权文件 3 2.1 Lib文件 3 2.2. CAB文件 4 PLC程序编写 4 3.1. 引入TCP/IP库文件 4 3.2. Client端程序 5 3.2.1. 建立相关变量 5 3.3.2. 编写连接功能块

weixin_41883890的博客 5730

vpp+dpdk环境搭建

更改config/common_base的 CONFIG_RTE_EAL_IGB_UIO=y 可以实现编译。dpdk解绑网卡:./usertools/dpdk-devbind.py -u 0000:02:06.0。更高版本的DPDK已经都没有驱动代码,通过git://dpdk.org/dpdk-kmods下载。原因:在虚拟机添加的网卡,dpdk不支持导致的。将/etc/vpp/startup.conf文件中的dpdk配置放开,并添加绑定的网卡。/var/log/vpp/vpp.log需要自行创建文件夹。

zhu_yu12345的博客 2776

Python爬虫:实时交通流量数据爬取与路况分析

随着城市化进程的不断推进,交通流量的管理与预测已成为智能交通系统的重要研究方向。交通流量数据不仅为城市交通管理提供了科学依据,还为驾驶员提供了实时路况信息,帮助其做出更加合理的出行决策。通过爬虫技术,我们可以实时获取城市的交通流量数据,从而分析路况,优化交通管理。在这篇博客中,我们将介绍如何使用Python编写一个爬虫来爬取实时交通流量数据,分析道路的交通状况。我们将使用最新的技术工具来构建爬虫,包括。

2201_76125261的博客 1268

基于龙虾Claw的会议纪要自动提取与重点内容总结办公场景实践

本文介绍如何使用龙虾Claw构建会议纪要自动提取与重点内容总结系统,实现会议内容的智能处理。

一键难忘的博客 254

DPDK 技术深度解析:从原理到 VPP 应用

性能突破吞吐量提升 100 倍以上延迟降低 10 倍以上CPU 利用率降低 10 倍以上架构创新用户态驱动零拷贝技术大页内存生态建设开源社区活跃广泛的应用场景持续的技术创新。

clearhenry的博客 1373

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VMware_ubuntu_vpp_dpdk安装运行

虚拟机编译安装vpp踩坑大全

Wendy1226的博客 2171

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

思科VPP源码分析(dpdk node分析)

VPP使用者几乎都会使用dpdk node作为收包驱动,本文将分析其源码。- 基本概念vlib_buffer_t dpdk收到的数据包用rte_mbuf结构描述。vpp为了兼容其它收包node(netmap,pcap等)改为使用vlib_buffer_t来描述数据包。 vlib_buffer_t紧跟在rte_mbuf后面,headroom空间中。vlib_get_next_framevlib

呆呆辉的专栏 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

FD.io VPP基本介绍-理解VPP软件架构

向量封包处理器 1. 什么是VPP 1.1. 介绍 VPP平台是一个可扩展的框架,可提供开箱即用的生产质量交换机/路由器功能。它是思科矢量数据包处理(VPP)技术的开源版本:一种高性能的数据包处理协议栈,可以在商用CPU上运行。 实施VPP的好处在于其高性能,经过验证的技术,其模块化和灵活性以及丰富的功能集。 VPP技术基于成熟的技术,已帮助交付了超过10亿美元的思科产品。这是一个模块化设计。该框架允许任何人“插入”新的**图形节点**,而无需更改内核代码。 1.1.1. 模块化,灵活和可扩展 VPP

RToax 7941

基于DPDK+VPP实现高性能防火墙

0. 数据平面和用户态协议栈 传统基于linux netfilter实现防火墙,虽然方便,但是性能很差。于是pfring/netmap/dpdk等机制,都要bypass掉内核协议栈。 多年来,各大操作系统(Linux/Windows/Freebsd)的网络协议栈一直都在内核中实现。其实网络协议栈只是一个应用,而不是操作系统的范畴,没有人规定网络协议栈一定是要早内核实现的。这些操作系统的开发者们将一切和具体业务无关的东西都塞进了操作系统内核。 其实通信行业的,早就有了数据面,控制面,管理面分离的理念,

hhd1988的专栏 6781

DPDK和VPP地址池

将以上创建的的两个DPDK内存池赋值与以VPP内存池索引的数组dpdk_mempool_by_buffer_pool_index和dpdk_no_cache_mempool_by_buffer_pool_index。数组dpdk_mempool_by_buffer_pool_index和dpdk_no_cache_mempool_by_buffer_pool_index用于存放之后创建的DPDK mempool地址。创建DPDK内存池结构,elt_size为元素大小,bp->n_buffers为元素数量。

redwingz的博客 2029

VPP中的DPDK插件源码详解第一篇:DPDK插件的作用和意义以及整体架构

第26章:DPDK插件总结26.1 DPDK插件的关键特点26.2 在VPP数据包转发中的作用26.3 性能优化要点26.4 与其他模块的关系26.5 最佳实践和注意事项作用和实现原理DPDK插件是VPP中负责与DPDK(Data Plane Development Kit)库集成的核心插件,它充当了VPP与物理网卡之间的"桥梁"。

clearhenry的博客 1109

边缘计算新底座:基于VPP+DPDK的开放智能网关

VPP 这一开源技术在通用 CPU 的基础上,实现了传统上需要专门的网络硬件设备(如路由器)和专业的网络操作系统才能达到的性能,以极高的性价比为广大用户带来了开放网络技术的红利。VPP 集成了DPDK项目,通过它直接访问硬件网卡资源。

asterfusion的博客 1220

vpp+dpdk 安装与运行

参考:http://blog.youkuaiyun.com/icebluechao/article/details/51208560  (感谢 VPP&DPDK 417538415的群主) vpp主页:https://wiki.fd.io/view/VPP 一、获取vpp源码: 1、git方式(https://wiki.fd.io/view/VPP/Pulling,_Building,_

shaoyunzhe的专栏 3万+

基于DPDK的VPP 插件demo代码

这个就是实现报文回显的主要代码: 从frame中取出所有的packet vectore, 然后进行打印, 然后再push到下一frame中的buffer中。另外关于push到下一个node还是下一个frame, 我觉得应该是一个意思, 以后学习深入了应该能确认。现在看, VPP 已经可以把192.168.100.200 这个口收到的报文打印出来了。现在再重新把VPP的流程走一下。VPP的插件编写, 首先要把VPP 工程下载下来, 编译通过。这个时候可以看到,VPP 已经把我们新写的插件启动起来了。

1861
上一篇: 数据库修仙金丹篇七——dpdk常用接口指北
下一篇: 数据库修仙秘境篇五——linux巨页内存编程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值