1.技术干货!节p节DPDK新手入门到网络功能深入理解
2.AddressSanitizer,点源点增强DPDK内存检测
3.VPP 编译、节p节安装、点源点使用及插件开发注意事项
4.关于vpp中dpdk接口注册流程解析
5.关于VPP源码——dpo机制源码分析
6.DPDK-VPP 学习笔记-01
技术干货!节p节DPDK新手入门到网络功能深入理解
DPDK新手入门
一、点源点金钱串源码安装
1. 下载源码
DPDK源文件由几个目录组成。节p节
2. 编译
二、点源点配置
1. 预留大页
2. 加载 UIO 驱动
三、节p节运行 Demo
DPDK在examples文件下预置了一系列示例代码,点源点这里以Helloworld为例进行编译。节p节
编译完成后会在build目录下生成一个可执行文件,点源点通过附加一些EAL参数可以运行起来。节p节
以下参数都是点源点比较常用的
四、核心组件
DPDK整套架构是节p节基于以下四个核心组件设计而成的
1. 环形缓冲区管理(librte_ring)
一个无锁的多生产者,多消费者的FIFO表处理接口,可用于不同核之间或是逻辑核上处理单元之间的通信。
2. 内存池管理(librte_mempool)
主要职责是在内存中分配用来存储对象的pool。 每个pool以名称来唯一标识,并且使用一个ring来存储空闲的对象节点。 它还提供了一些其他的服务,如针对每个处理器核心的缓存或者一个能通过添加padding来使对象均匀分散在所有内存通道的对齐辅助工具。
3. 网络报文缓冲区管理(librte_mbuf)
它提供了创建、释放报文缓存的能力,DPDK应用程序可能使用这些报文缓存来存储数据包。这个缓存通常在程序开始时通过DPDK的mempool库创建。这个库提供了创建和释放mbuf的API,能用来暂存数据包。
4. 定时器管理(librte_timer)
这个模块为DPDK的执行单元提供了异步执行函数的能力,也能够周期性的触发函数。它是通过环境抽象层EAL提供的能力来获取的精准时间。
五、环境抽象层(EAL)
EAL是用于为DPDK程序提供底层驱动能力抽象的,它使DPDK程序不需要关注下层具体的网卡或者操作系统,而只需要利用EAL提供的抽象接口即可,EAL会负责将其转换为对应的API。
六、通用流rte_flow
rte_flow提供了一种通用的方式来配置硬件以匹配特定的Ingress或Egress流量,根据用户的谷歌源码规范任何配置规则对其进行操作或查询相关计数器。
这种通用的方式细化后就是一系列的流规则,每条流规则由多种匹配模式和动作列表组成。
一个流规则可以具有几个不同的动作(如在将数据重定向到特定队列之前执行计数,封装,解封装等操作),而不是依靠几个规则来实现这些动作,应用程序操作具体的硬件实现细节来顺序执行。
1. 属性rte_flow_attr
a. 组group
流规则可以通过为其分配一个公共的组号来分组,通过jump的流量将执行这一组的操作。较低的值具有较高的优先级。组0具有最高优先级,且只有组0的规则会被默认匹配到。
b. 优先级priority
可以将优先级分配给流规则。像Group一样,较低的值表示较高的优先级,0为最大值。
组和优先级是任意的,取决于应用程序,它们不需要是连续的,也不需要从0开始,但是最大数量因设备而异,并且可能受到现有流规则的影响。
c. 流量方向ingress or egress
流量规则可以应用于入站和/或出站流量(Ingress/Egress)。
2. 模式条目rte_flow_item
模式条目类似于一套正则匹配规则,用来匹配目标数据包,其结构如代码所示。
首先模式条目rte_flow_item_type可以分成两类:
同时每个条目可以最多设置三个相同类型的结构:
a. ANY可以匹配任何协议,还可以一个条目匹配多层协议。
b. ETH
c. IPv4
d. TCP
3. 操作rte_flow_action
操作用于对已经匹配到的数据包进行处理,同时多个操作也可以进行组合以实现一个流水线处理。
首先操作类别可以分成三类:
a. MARK对流量进行标记,会设置PKT_RX_FDIR和PKT_RX_FDIR_ID两个FLAG,具体的值可以通过hash.fdir.hi获得。
b. QUEUE将流量上送到某个队列中
c. DROP将数据包丢弃
d. COUNT对数据包进行计数,如果同一个flow里有多个count操作,则每个都需要指定一个独立的id,shared标记的计数器可以用于统一端口的不同的flow一同进行计数。
e. RAW_DECAP用来对匹配到的定位算法源码数据包进行拆包,一般用于隧道流量的剥离。在action定义的时候需要传入一个data用来指定匹配规则和需要移除的内容。
f. RSS对流量进行负载均衡的操作,他将根据提供的数据包进行哈希操作,并将其移动到对应的队列中。
其中的level属性用来指定使用第几层协议进行哈希:
g. 拆包Decap
h. One\Two Port Hairpin
七、常用API
1. 程序初始化
2. 端口初始化
3. 队列初始化
DPDK-网络协议栈-vpp-ovs-DDoS-虚拟化技术
DPDK技术路线视频教程地址立即学习
一、DPDK网络
1. 网络协议栈项目
2.dpdk组件项目
3.dpdk经典项目
二、DPDK框架
1. 可扩展的矢量数据包处理框架vpp(c/c++)
2.DPDK的虚拟交换机框架OvS
3.golang的网络开发框架nff-go(golang)
4. 轻量级的switch框架snabb(lua)
5. 高效磁盘io读写spdk(c)
三、DPDK源码
1. 内核驱动
2. 内存
3. 协议
4. 虚拟化
5. cpu
6. 安全
四、性能测试
1. 性能指标
2. 测试方法
3. 测试工具DPDK相关学习资料分享:点击领取,备注DPDK
DPDK新手入门原文链接:DPDK上手
AddressSanitizer,增强DPDK内存检测
前言
在使用C/C++构建程序时,内存问题常成为难题,难以复现和定位。这类问题主要源于内存越界和重复释放。内存管理机制存在不足,DPDK内存检测仅在rte_free时进行,调试信息有限。市面上虽有多种内存管理工具,但缺乏DPDK适用且高效的解决方案。
内存检测机制
多数内存检测工具通过建立红区(redzones)来实现检测。红区环绕进程内存的绿色区域,通过影子内存记录访问状态。影子内存需一大块连续虚拟地址空间,供快速查找访问权限,并在每次内存访问前通过代码插桩检查影子区域状态。
动态库实时检测影子内存状态,允许或阻止内存访问,生成诊断报告。ASan工具采用高效映射机制,使用紧凑影子编码,减少影子内存占用。
相关视频推荐
深入了解VPP源码流程、动态库加载、插件、节点和特性。
高性能网络开发框架VPP与DPDK解决了网卡问题。ost源码剖析
NFV基石DPDK,为网络定义新功能。
免费学习资源:DPDK、网络协议栈、VPP、OvS、DDoS、NFV、虚拟化、高性能专家。
DPDK学习路线:0voice.com/uiwebsite/ht...
文章福利:提供学习书籍、视频资料,自行加入(需要自取)。
AddressSanitizer原理及在DPDK中实现
AddressSanitizer(ASan)是Google开发的内存检测工具,通过高效映射和紧凑编码方法优化效率。ASan使用1/8虚拟地址空间的影子内存描述所有地址,构建高效查找机制,通过原始指针除以8和偏移量计算影子内存位置。
插桩技术在内存访问前进行检查,替换glibc函数进行实时检测,设置红区标记内存不可访问。Free函数将内存染毒并隔离。日志记录调用栈,快速定位问题。ASan使用启发法关联错误地址,记录和报告错误信息。
ASan在DPDK中的实现
ASan基于glibc实现,但DPDK内存管理方式不同,导致动态运行库无法直接挂载。GCC和CLANG支持ASan编译选项,通过在malloc和free函数中实现设置红区。已将ASan代码合并至DPDK .,详情可下载代码查看。
如何在DPDK中启用ASan工具检测内存
Meson编译DPDK代码时,添加“-Db_sanitize=address”启用ASan。GCC编译时可不加“-Db_lundef=false”选项,使用“-Dbuildtype=debug”选项输出更多日志信息。推荐使用上述编译选项。cpython源码加密
ASan支持检测缓存溢出、释放后使用等内存问题。检测信息包含文件、行、函数调用过程,便于高效定位问题。
启用ASan工具后,会带来一定性能下降和内存开销,适用于代码调试和集成测试阶段。Intel DPDK测试部门已部署ASan工具,发现并修复多个静态工具无法检测的内存问题。CI系统也将ASan检测纳入DPDK代码测试。
VPP 编译、安装、使用及插件开发注意事项
VPP(Vector Packet Processing)是一个由Cisco开发的开源可扩展框架,用于提供易于使用的高性能交换和路由功能。它通过使用各种插件(Plugin)来处理网络协议,这些插件可以在配置代码中指定其后续操作。插件间的处理逻辑通过返回的索引链接起来,形成一个处理流程。
VPP的核心在于其高性能处理机制,它将相同类型的包放在数组中,利用CPU缓存提高效率,并通过SSE、AVX指令加速(x平台)、NEON指令加速(ARM平台)或AltiVec技术加速(PowerPC平台)。Bihash实现了一个高效的检索表结构,支持读写分离。
VPP安装非常简单,无需编译步骤,直接从官方网站下载源代码,通过apt/yum更新后,执行apt/yum install vpp即可完成安装。不过需要注意的是,安装的版本可能较低。
在使用VPP时,新版本内置了DPDK,但默认情况下未启用高性能模式。默认运行方式可能为socket/af_packet,性能一般。如果你熟悉交换机指令,VPP的使用方式会很熟悉,具有自动补全、帮助和显示信息的功能。创建虚拟网口与VPP建立通信通常使用veth技术。
创建虚拟网口时,如需让VPP运行,通常需要通过命令创建网口并开启主机到VPP的通道。具体操作可参考以下示例:创建虚拟网口与VPP内部建立通讯。
VPP提供了一套完整的命令系统,允许用户进行详细的配置和调试。使用VPP指令时,通过ping .0.0.2检查网络连通性,同时VPP内部的show int命令可以显示统计数据的变化情况,而主机通过tcpdump工具可以抓取到包。
编写插件时,可以参考src/examples/sample_plugin/sample中的示例代码。插件初始化代码在sample.c/sample_init函数中,其中VNET_FEATURE_INIT宏定义了前导节点及插入到哪个节点前面。默认位置为ethernet-input,即适配器输入的前面。vnet_feature_enable_disable函数用于激活节点,参数1通常包含前一步中定义的值。在插件命令执行时,如sample macswap,将调用相应的节点逻辑。
丢包操作可以通过在插件初始化时获取error_drop节点的全局索引,然后将需要丢弃的包存储到目标位置,并使用vlib_put_frame_to_node函数将包放入error_drop节点。实现时,可以使用vlib_get_next_frame获取目标包地址,然后使用put_frame函数将包放入指定位置。
编写和编译插件的流程相对标准,使用emacs进行编辑。VPP的源码编译相对简单,通常只需执行几条命令即可。需要注意的是,在编译过程中,可能会遇到如内存分配不足等问题,因此在虚拟机环境和图形界面下需进行相应的优化。同时,在特定版本和环境下,可能需要额外的依赖库和配置文件。
在安装和配置VPP时,可能会遇到一些常见的问题,例如无法打开日志文件、组vpp不存在等。这些问题通常可以通过调整配置文件或创建相关目录来解决。在某些版本和环境下,安装时可能需要额外的依赖包,如intel-ipsec-mb、dpdk、rdma-core、xdp-tools、quicly、meson等,确保在编译和安装过程中正确配置这些依赖。
最后,确保在安装和运行VPP时有足够的磁盘空间,特别是在配置DPDK时,需要充足的内存资源。如果在HyperV下的Ubuntu.环境中遇到问题,可能需要额外的配置和优化。对于较新的Ubuntu版本,确保使用的是适合VPP版本的系统软件包,避免因版本不兼容导致的问题。
关于vpp中dpdk接口注册流程解析
vpp 是一个高效的包处理转发框架,支持多种接口类型,其中应用最广泛的便是 dpdk。dpdk 通过接管网卡驱动实现内核旁路,提供报文收发加速机制。在 vpp 中,dpdk 作为插件实现,通过 make install-ext-deps 构建过程中自动集成 dpdk。
dpdk 初始化在 /src/plugins/dpdk/device/init.c 文件中,dpdk 的 eal 环境通过调用 rte_eal_init 函数实现。dpdk_config 函数负责参数解析,dpdk_config 函数通过宏 VLIB_CONFIG_FUNCTION 注入,vpp 启动时自动调用,将参数传递给 rte_eal_init 进行初始化。
vpp 的接口层分为硬件层和软件层,硬件层通过 device class 描述硬件驱动,软件层通过 interface class 描述链路层。硬件设备用 vnet_hw_interface_t 结构体描述,软件层接口用 vnet_sw_interface_t 描述。接口统一管理在 vnet_interface_main_t 结构体中,该结构体定义了硬件接口和软件接口的数组。
接口初始化在 vnet_interface_init 函数中进行,此函数除了初始化接口参数,还会将 dpdk 设备的 tx_function 赋值给 device class,决定后续的发包执行函数。
dpdk 接口初始化在 dpdk_lib_init 函数中完成,主要步骤包括初始化 dpdk_device_t 结构体,调用 ethernet_register_interface 注册接口,配置网卡参数,并为接口分配收包线程。
dpdk 收包通过 input node dpdk_input_node 实现,dpdk_device_input 函数完成实际的收包操作,通常将报文传递给下一个 node,如 ethernet_input node。
dpdk 发包逻辑相对复杂,dpdk 的发包并未直接在插件中实现专门的 output node,而是通过接口 tx_function 赋值,最终在 vpp 的发送流程中实现。在发送报文时,接口的 output node 和 tx node 会在 vnet_register_interface 注册接口时一同注册,其中 output node 的执行函数是 vnet_interface_output_node,tx node 的函数则由 vnet_device_class_t 定义。
发送流程以 ip4 报文为例,处理完 ip4 报文后,通常下一个节点为 ip4-lookup 进行路由查找。在 interface-output node 中,通过 buffer->sw_if_index[VNET_TX] 的值确定发送接口,并执行对应的 output node。
在 interface output node 的执行函数中,接口的 output node index 通过调用 vnet_per_buffer_interface_output_hw_interface_add_del 函数获得,该函数在 vpp 初始化过程中将接口的 output node 放置在 interface output node 后面,从而在执行函数中获取到接口 output node 的索引。
vpp 的设计遵循分层架构,逻辑清晰,但宏定义的大量使用增加了阅读难度。 版本源码调整了 node 注册方式,通过 VLIB_NODE_FN 宏实现不同优先级的 function 设置,但这一改动也给源码阅读带来不便。接口发送节点通过 vlib_register_node 函数定义,允许不同驱动共享一个函数,方便了接口的动态添加。
vpp 启动过程中的宏定义执行顺序影响代码结构,后续深入阅读源码时会进一步分析。如有需要,可参考相关学习资料、教学视频和交流群资源进行深入学习和交流。
关于VPP源码——dpo机制源码分析
VPP的dpo机制紧密与路由结合。路由查找的最终结果为load_balance_t结构,相当于一个hash表,包含多种dpo,指向下一步动作。dpo标准类型包括:DPO_LOAD_BALANCE、DPO_DROP、DPO_IP_NULL、DPO_PUNT。DPO_LOAD_BALANCE内含私有数据load_balance_t,通过dpo_id_t中的dpoi_index索引具体实例。DPO_DROP将数据包送往"XXX-drop"节点,简单处理后传至"error-drop"节点完成数据包丢弃。DPO_IP_NULL将数据包送往"ipx-null"节点,决定是否回传icmp不可达或禁止包。
DPO_PUNT与DPO_PUNT核心函数与加锁/解锁无关。这些函数增加私有数据结构的引用计数,对于无私有数据的dpo则为空实现。内部调用注册时提供的函数指针。dpo设置操作包括将数据包从child dpo传递给parent dpo。通过在child dpo的dpoi_next_node中增加指向parent dpo对应node的slot索引,实现数据包传递。dpo_edges为四重指针,用于缓存child dpo对应的node指向下一跳parent dpo对应node的slot索引。
DPDK-VPP 学习笔记-
原文链接: blog.csdn.net/force_eag... 安装方法: 借助CentOS使用yum安装vpp-debuginfo和vpp-devel,可选。 源码安装:直接通过git clone至本地或下载指定版本源码。采用git clone方式和版本v..1,执行make install-dep自动下载所需dpdk版本和依赖库。 编译流程: 编译vpp需注意:源码解压后无法编译rpm和deb安装包。需在编译前清除vpp。 关键编译参数:查看build-data/platforms/vpp.mk与build/external/packages/dpdk.mk中的Makefile源代码,注意指定dpdk pmd mlx5支持。 vpp使用指南: 确认系统网卡型号,重新绑定至igb_uio驱动。 初始化hugepages大小,推荐使用默认的2M页面,分配M。 启动与操作: 启动vpp。 vppctl常用命令示例:针对具体接口名称(如GigabitEthernet5/0/0或TenGigabitEthernet5/0/0)。 配置文件与学习资源: 参考:FD.io VPP v..1,高性能网络开发框架,提升技术层次。 深入学习资料、教学视频和学习路线图,涵盖dpdk、网络协议栈、vpp、OvS、DDos、NFV、虚拟化、高性能等内容,免费分享至学习交流群。