DPDK內存大頁在NUMA架構重分配的問題


一. 問題介紹

​ 在DPDK中往往是在內核啟動參數中設置要啟動的大頁的總數量,比如設置大頁個數為16個,每個大頁是1G,這樣系統啟動后,就能在/sys/devices/system/node/node0/hugepages/hugepages-1048576KB/nr_hugepages上看到node0上分配的大頁,同樣可以查看到node1上的大頁。默認的情況是內核會平均分配到 不同的socket上。在我的機器上,就是2個socket,這樣的話,每個node上會分到8個大頁。

​ 然而,問題就來了。對於使用DPDK ring的primary進程和secondary進程而言,為了提高性能,在其中的線程綁core的時候,最好是在同一個socket上,假設我們綁定了socket 0上的多個core,這時候,無論是primary進程還是secondary進程分配內存的時候都是優先在socket 0上的node 0分配內存,這就導致一個問題,node 1上的內存基本就分配不到,也就是說,雖然留出了16G的大頁給DPDK的應用使用,但實際上,只有不到一半的使用率。這就有點浪費內存咯。

​ 急於上面的問題,我們期望能夠重新分配大頁在不同socket上的分配比例,比如,如果DPDK進程都是在socket 0上,那么16G大頁可以分配12G給node 0,剩余的4G給node 1,充分利用內存。

二. 重新配置方法

​ 對於不同的系統,配置的方法大同小異,對於2M的大頁而言,可以直接進行配置,而對於1G的大頁,老些的版本則存在一些問題,如在使用centos 6.3時,動態修改1G大頁的個數就不成功。

​ 因此這里只說通用的做法,對於自己的系統,可以再進行細調。在內核啟動參數中配置大頁的大小和個數,以ubuntu為例:

default_hugepagesz=1G hugepagesz=1G hugepages=1設置到/etc/default/grub中的GRUB_CMDLINE_LINUX中,然后運行update-grub更新啟動參數配置文件 /boot/grub/grub.cfg 。之后重新啟動,cat /proc/meminfo就能看到系統中顯示大頁數量和剩余的數量(這個圖是配置的2M的頁)。

接下來就是如何解決提到的背景問題了:

​ 在系統啟動后,是可以再進行調整大頁的數量的,配置的參數就在/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages,這個是2M的配置,對於1G的頁,無非就是2048K變為其他值。注意這里的node0,如果還有其他socket,就可以調整對應的socket上的大頁的數量。

​ 也正是基於上面的可調整參數,可以在系統啟動后,先進行大頁在不同socket上重新調整,然后再啟動DPDK的應用進程。比如共設置16個大頁,其中node 0上分配12個,node 1上分配4個。這里也會有另一個問題:就是如果調整后的大頁分配大於原來的總頁數會怎么樣?對於2M的應該沒啥問題,對於1G的,恐怕是不行的,暫時沒實驗,需要注意。這樣調整后,把DPDK的應用都綁定在node 0上對應的core(因為我們給他分的大頁多),這樣的話,就能充分利用到我們分配的大頁了。

至此,可以進一步觀察實驗了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM