在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