DPDK Pktgen+Docker搭建VNF环境及验证

部署运行你感兴趣的模型镜像

作者简介:文殊博,北京邮电大学未来网络理论与应用实验室(FNL)研究生

一、简介及参考文献

​本文主要是搭建一个基于DPDK的VNF开发实验环境,利用docker和vhost-user摆脱DPDK的硬件约束,方便在一台机器上进行VNF的开发和测试。但是,DPDK的PMD对不同网卡的特性支持差异很大,所以不能完全以这种环境下的运行结果为准。接下来会先介绍环境的配置过程然后搭建一个简单的拓扑,最后会对DPDK的testpmd应用中最简单的iofwd转发引擎中关键部分进行简单说明。

  • NFV(Network Funciton Virtualization, 网络功能虚拟化)旨在通过标准化设备替代现存的专用IT设备,以降低CapEX和OpEX并提供更高的灵活性。更详细内容的可以查看ETSI发布的NFV白皮书或OPNFV提供的相关内容
  • DPDK是intel开发的开源高性能数据平面开发工具集。它提供了在通用处理器上进行快速包处理的库和驱动,这种特性非常适合NFV。更详细内容的内容可以查看DPDK官方文档
  • pktgen即packet generator,以下都特指pktgen-dpdk。这是一款基于DPDK的强大的流量产生工具。更详细的内容可以查看pktgen官方文档
  • Docker是一款简单易用的容器管理工具。由于容器本身启停快、体积小等、
  • 特点,容器化也成为了NFV的趋势之一。更详细内容可以查看Docker官方文档
  • vhost-user是实现在用户态的vhost,相比virtio和vhost需要内核支撑,vhost-user可以完全工作在用户态。vhost-user通过socket文件和共享内存来完成数据的传递。更详细内容可以查看QEMU关于vhost-user的介绍

二、环境配置

2.1 DPDK的安装

  1. 下载DPDK源码,并配置安装所需环境变量。

  2. 配置DPDK

    这里由于要是用Vhost-user驱动,修改使得文件中CONFIG_RTE_LIBRTE_VHOST=y。如果需要连接其他驱动的网卡,也要确认其他驱动相关设置正确。

  3. 安装DPDK

2.2 hugepages的配置

  • 本实验中由于我们需要使用virtio-user这种连接方式,由于实现时的一些限制导致使用vhost-user时同时最多只能使用8个hugepages无论2M还是1G大小的hugepagesize。所以这里必须使用1G大小的hugepagesize同时最多分配8个。

      2.3 Pktgen的安装

      • pktgen的安装依赖于DPDK,安装前确保RTE_SDK和RTE_TARGET环境变量设置正确。

      2.4 Docker的安装

      • 国内连接Docker官方仓库非常不稳定,经常404无法获取镜像。推荐使用阿里云提供的Docker镜像仓库。在其中的管理中心——Docker Hub镜像站点中有完整的Docker安装和加速器配置过程。以下从其中复制出的简单安装过程。

        安装完成后可以简单测试。

        正确安装的话,可以进入一个最简单的容器环境中,Ctrl+D可以退出。

        三、简单的拓扑搭建

      3.1 拓扑

      • 预建立的简单拓扑如下

        testpmd是DPDK提供的一个通过数据包转发进行DPDK测试的工具,也是一个非常好的DPDK应用开发示例。如果想进行简单的DPDK开发实验推荐修改$RTE_SDK/app/test-pmd/iofwd.c后编译testpmd应用,之后在同一目录$RTE_SDK/app/test-pmd/下可以找到下编译后的testpmd应用。

        pktgen运行在主机中,testpmd运行在容器中,两个应用之间通过建立的socket文件以及vhost-user进行通信,相当于虚拟网卡。

      3.2 启动容器

      1. 通过Dockerfile创建一个DPDK的Docker镜像。

        首先创建一个Dockerfile。

        使用创建的Dockerfile建立Docker镜像.

        运行容器

        这里运行一个使用刚刚建立的dpdk镜像的容器。

      3.3 启动应用

      1. 在容器中运行testpmd

        在主机上运行pktgen
        注意,pktgen一定要在与pktgen.lua文件同一目录下运行,即pktgen的文件夹中运行。

      3.4 简单实验

      • 在pktgen中设置速率为10%,更具体的速率设置可以通过tx_cycles设置。端口0共发送100个包,端口1发送200个。

        在testpmd中查看端口状态,可以看到端口0接收100个包发出200个,与预期一致:

        四、简单分析iofwd.c代码

          因为这段代码非常简单,这里只介绍几个关键点帮助快速理解。由于DPDK库非常庞大复杂,阅读源码时推荐通过ctags、YCM等类似工具帮助阅读。

          • RTE_TEST_PMD_RECORD_CORE_CYCLES相关的内容用于统计每条转发流处理消耗的时钟周期, rte_rdtsc()函数用于通过RDTSC或VMWARE TSC map读取时钟周期信息。与 RTE_TEST_PMD_RECORD_BURST_STATS相关的内容用于统计每条转发流接收和发送时burst(处理时的一组数据包)的情况。这里的接收端口和发送端口等参数已经在 config.c文件中设置过,更详细的过程可以看到其中的 simple_fwd_config_setup()函数以及其他模式下的相关设置函数。 rte_eth_rx_burst()函数用于从指定端口和队列中读取数据包。会一次读入很多个数据包(取决于端口排队情况),称为burst。 rte_eth_rx_burst()这个API在同步和异步包处理环境下都针对burst做了非常多的优化,性能非常高。但是,这个函数为了降低额外开销不提供任何错误提示。所以当上层应用多次尝试都接收到0返回值时应该检查设备运行状态。 rte_eth_tx_burst()函数用于从指定端口和队列处发送数据包。同接收一样,会一次把一个burst的数据放入到发送队列。同时, rte_eth_tx_burst()这个函数会透明地释放掉先前发送的数据包占用的内存。 likely()unlikely()函数是常用的优化方式,是GCC內建函数 __builtin_expect()的宏。通过提高条件分支预测准确性提高cache命中率从而提升程序性能。由于现代CPU都通过预读机制提升性能,而由于分支造成的转跳会导致pipeline flushing,这会降低程序性能。通过为编译器提供分支预测信息可以让编译结果中可能性更大的代码紧跟分支判断部分减少转跳。从理解代码逻辑的角度上这两个函数可以完全忽略。更详细的内容可以参考这篇 官方解释代码的最后定义的 io_fwd_engine相当于注册了一种新的转发引擎,可以在 testpmd.h文件中找到结构体定义,在 testpmd.c中看到对转发引擎的选择和使用。在理解了iofwd中的关键部分之后,就可以在其基础上参考DPDK的 API文档进行基础性的实验。当然这只是一个最简单的进行DPDK实验的方式。一个更加全面、有代表性的DPDK示例应用可以参考examples目录下的l3fwd。
          原文地址:http://www.sdnlab.com/20112.html

      您可能感兴趣的与本文相关的镜像

      Stable-Diffusion-3.5

      Stable-Diffusion-3.5

      图片生成
      Stable-Diffusion

      Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

      ### DPDK Pktgen 使用指南与性能测试 DPDK(Data Plane Development Kit)是一个用于快速数据包处理的开源软件开发工具包,而 **Pktgen** 是基于 DPDK 的高性能流量生成器,广泛用于网络设备的性能测试、基准评估和协议验证。 #### 安装与配置 在使用 Pktgen 之前,需要确保系统中已安装 DPDK 和相关的开发库。以下是一些基本步骤: 1. 安装 `libpcap-dev`: ```bash $ sudo apt-get install libpcap-dev ``` 这一步是为了支持部分基于 libpcap 的功能[^1]。 2. 编译 DPDK: ```bash $ make config T=x86_64-native-linuxapp-gcc $ make ``` 此命令会编译 DPDK 并包含 TestPMD 等示例应用[^2]。 3. 编译 Pktgen: 在完成 DPDK 编译后,进入 Pktgen 源码目录并进行构建: ```bash $ cd pktgen-dpdk $ make ``` #### 启动 Pktgen 启动 Pktgen 需要绑定网卡到 DPDK 支持的 UIO 驱动(如 `igb_uio` 或 `vfio-pci`),然后运行 Pktgen 应用程序: ```bash $ sudo ./build/app/x86_64-native-linuxapp-gcc/pktgen -l 0-3 -n 4 -- -P -m "[1:3].0" ``` 其中 `-l` 指定使用的 CPU 核心,`-n` 指定内存通道数,`-m` 指定端口与队列的映射关系。 #### 数据包生成与流量控制 Pktgen 提供了多种方式来生成数据包: - **固定速率发送**:可以通过设置目标速率为 Mbps 或 pps。 - **突发模式**:以特定大小的数据包突发发送。 - **自定义报文头**:支持修改源/目的 MAC 地址、IP 地址、端口号等字段。 例如,在 Pktgen 的交互式界面中输入以下命令可设置端口 0 发送速率为 1000 Mbps: ``` set 0 rate 1000 ``` 也可以设置端口 0 的目的 MAC 地址: ``` set 0 dst mac 00:11:22:33:44:55 ``` #### 性能测试方法 在使用 Pktgen 进行性能测试时,可以关注以下几个指标: - **吞吐量(Throughput)**:每秒传输的数据包数量或字节数。 - **延迟(Latency)**:从发送到接收的时间差。 - **丢包率(Packet Loss Rate)**:未成功接收到的数据包比例。 Pktgen 支持统计每个端口的收发情况,并提供实时显示功能。通过按下 `Return` 键可以在界面上查看当前的流量状态。 #### 示例脚本与自动化测试 Pktgen 支持通过 Lua 脚本实现自动化测试流程。例如,创建一个名为 `test.lua` 的脚本文件,内容如下: ```lua -- 设置端口 0 的速率 pktgen.set("0", "rate", "1000") -- 设置端口 0 的目的 MAC 地址 pktgen.set("0", "dst mac", "00:11:22:33:44:55") -- 启动发送 pktgen.start("all") ``` 然后运行: ```bash $ sudo ./build/app/x86_64-native-linuxapp-gcc/pktgen -l 0-3 -n 4 -- -P -m "[1:3].0" -f test.lua ``` 这样就可以自动执行预设的流量生成任务。 #### 注意事项 - 确保网卡驱动已正确加载,并且网卡已被绑定到 DPDK 兼容的驱动。 - 大多数情况下,建议关闭内核网络栈以避免干扰。 - 如果遇到内存分配问题,可以调整 `--socket-mem` 参数来优化内存使用。
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

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

      余额充值