在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
重要
此值应在设置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线程中的数据包 +
额外的不常见情况的内存占用
OVS中用于计算此值的算法如下:
请求的rxqs数量 * 请求的rxq大小 +
请求的txqs数量 * 请求的txq大小 +
(RTE_MAX_LCORE,请求的rxqs数量)两者间较小值 * netdev_max_burst +
MIN_NB_MBUF
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