OVS DPDK 设备内存模型

文章详细解释了OVSDPDK中DPDK设备内存的两种分配方式——共享内存和每端口内存。共享内存允许端口共享内存池,而每端口内存则为每个设备独立分配。文章提供了内存计算示例和注意事项,强调了在选择模型时考虑内存需求和配置的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在OVS DPDK中,DPDK设备内存可以两种方式之一分配,共享内存或每端口内存。以下详述两者的具体情况。

共享内存
默认情况下,OVS DPDK使用共享内存模型。这意味着多个端口可以共享相同的内存池mempool。例如,当添加端口时,它将具有与之关联的给定MTU和Socket ID。如果之前已经为一个具有相同MTU值和Socket ID的已有端口创建过内存池mempool,该内存池将用于这两个端口。如果现有的内存池都不支持这两个参数,创建一个新的内存池mempool。

每端口内存
在每端口内存模型中,内存池是按每个设备创建的,而不共享。这样做的好处是更加透明的内存模型,其中的内存池不会被其它DPDK设备耗尽。然而,在给定部署条件下,这将给内存尺度消耗带来潜在增加。用户在使用此模型前应注意到此部署的内存需求,分配足够的所需巨页HugePage内存。

每端口mempool模型支持可以通过全局配置值启用,per-port-memory。设置此值为true将为OVS中的所有DPDK设备启用每端口的内存模型:

$ ovs-vsctl set Open_vSwitch . other_config:per-port-memory=true
1
重要

此值应在设置dpdk-init=true之前设置。如果在dpdk-init=true之后设置,则必须重新启动守护程序才能使用每端口内存模型。

计算内存需求
给定内存池mempool的所需内存量可以通过内存池中的mbufs数量乘以mbuf大小获得。

用户应注意以下事项:

内存池中的mbufs数量依据不同的内存模型会有不同

mbuf大小受到要求的MTU值的影响

重要

由于OVS DPDK中需要对齐和舍入的原因,以字节为单位的mbuf大小始终大于请求的MTU值大小:

下面是几个针对共享和每端口内存模型的几个内存需求计算示例.

共享内存模型计算
在共享内存模型中,请求的mbufs数量受到所要求的MTU大小的直接影响,如下表格所示。

MTU Size    Num mbufs
1500 or greater    262144
Less than 1500    16384
重要

如果部署环境没有足够的内存来提供262144数量的mbufs,那么将数量减半直到16384个。

示例 1
MTU = 1500 Bytes
Number of mbufs = 262144
Mbuf size = 3008 Bytes
Memory required = 262144 * 3008 = 788 MB

示例 2
MTU = 1800 Bytes
Number of mbufs = 262144
Mbuf size = 3008 Bytes
Memory required = 262144 * 3008 = 788 MB

注意:

假设在示例1和2中使用相同的Socket,两者将共享相同的mempool内存池。

示例 3
MTU = 6000 Bytes
Number of mbufs = 262144
Mbuf size = 7104 Bytes
Memory required = 262144 * 7104 = 1862 MB

示例 4
MTU = 9000 Bytes
Number of mbufs = 262144
Mbuf size = 10176 Bytes
Memory required = 262144 * 10176 = 2667 MB

每端口内存模型
在每端口内存模型中,所需的mbufs数量更加复杂,需要考虑数据路径中的多个动态因素,以及设备配置。

端口所需的MBUF数量的粗略估计如下:

   填充设备rxqs所需的数据包数量 +
   可能卡在其它端口txqs上的数据包 +
   PMD线程中的数据包 +
   额外的不常见情况的内存占用
1
2
3
4
OVS中用于计算此值的算法如下:

   请求的rxqs数量 * 请求的rxq大小 +
   请求的txqs数量 * 请求的txq大小 +
   (RTE_MAX_LCORE,请求的rxqs数量)两者间较小值 * netdev_max_burst +
   MIN_NB_MBUF
1
2
3
4
where:

requested number of rxqs: 设备请求的接收队列数量.
requested rxq size: 接收队列所需的描述符数量.
requested number of txqs: 设备请求的发送队列数量. 由配置的PMDs数量加1得到。
requested txq size: 发送队列所需的描述符数量.
min(RTE_MAX_LCORE, requested number of rxqs): 比较DPDK支持的最大LCORE数量与请求的设备接收队列数量,取两者中的较小值
NETDEV_MAX_BURST: 一次突发的最大报文量,定义为 32.
MIN_NB_MBUF: 额外的不常见情况的内存占用,定义为 16384.
接下来的所有示例都假设以下的条件值:

requested_rxq_size = 2048
requested_txq_size = 2048
RTE_MAX_LCORE = 128
netdev_max_burst = 32
MIN_NB_MBUF = 16384
示例 1: (1 rxq, 1 PMD, 1500 MTU)
MTU = 1500
Number of mbufs = (1 * 2048) + (2 * 2048) + (1 * 32) + (16384) = 22560
Mbuf size = 3008 Bytes
Memory required = 22560 * 3008 = 67 MB

示例 2: (1 rxq, 2 PMD, 6000 MTU)
MTU = 6000
Number of mbufs = (1 * 2048) + (3 * 2048) + (1 * 32) + (16384) = 24608
Mbuf size = 7104 Bytes
Memory required = 24608 * 7104 = 175 MB

示例 3: (2 rxq, 2 PMD, 9000 MTU)
MTU = 9000
Number of mbufs = (2 * 2048) + (3 * 2048) + (1 * 32) + (16384) = 26656
Mbuf size = 10176 Bytes
Memory required = 26656 * 10176 = 271 MB
————————————————
版权声明:本文为优快云博主「redwingz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/sinat_20184565/article/details/93471205

### 配置和使用OVS DPDK桥接功能指南及最佳实践 #### 创建并配置OVS-DPDK网桥 为了创建支持DPDKOVS网桥,命令如下所示: ```bash ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev ``` 此操作会建立名为`br0`的新网桥,并将其数据路径类型设置为`netdev`以便于与DPDK兼容[^1]。 对于添加基于DPDK接口至上述创建好的网桥中,则需执行下述指令来完成指定名称(如`dpdk0`)端口加入动作的同时设定其类别属性为`type=dpdk`: ```bash ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk ``` 这一步骤确保了所增加进去的端口能够按照预期工作模式运行在高性能的数据平面之上。 #### 编译安装带有DPDK支持的OVS版本 针对希望从源码构建具备DPDK特性的OVS实例情况而言, 可参照下面给出的方法来进行环境准备以及软件包组装过程. 进入解压后的OVN/OVS源文件夹位置之后先初始化子模块再依据实际需求调整编译参数最终实施制造流程: ```bash cd ovs ./boot.sh ./configure --with-dpdk=/root/src/dpdk/x86_64-native-linuxapp-gcc CFLAGS="-Ofast" make && make install ``` 这里特别指定了DPDK库的位置并通过优化标志提高性能表现[^4]. #### 设置必要的环境变量 当涉及到具体项目开发或者测试环境中时可能还需要额外定义一些全局可用的环境变量以方便后续调用或链接依赖项, 例如可以这样导出指向特定版本DPDK构建产物所在路径的信息供其他工具链识别读取: ```bash export DPDK_BUILD=/usr/src/dpdk-18.11.1/x86_64-native-linuxapp-gcc ``` 通过这种方式可以让系统范围内所有进程都能访问到所需的头文件和静态/动态库资源从而简化集成工作的复杂度[^3]. #### 性能考量下的注意事项 值得注意的是,在某些场景下即使已经成功部署好了完整的OVS-DPDK解决方案也未必能在第一时间观察到显著优于传统方案的表现效果。这是因为如果虚拟机内部仍然采用标准Virtio-net驱动而非专门适配过的DPDK版本的话可能会成为新的瓶颈点影响整体吞吐量指标[^2].因此建议尽可能让整个通信链条上的组件都处于最优状态才能充分发挥这套技术组合的优势特性.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值