OVS DPDK 设备内存模型

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章