在DPDK中每每是在內核啓動參數中設置要啓動的大頁的總數量,好比設置大頁個數爲16個,每一個大頁是1G,這樣系統啓動後,就能在/sys/devices/system/node/node0/hugepages/hugepages-1048576KB/nr_hugepages
上看到node0上分配的大頁,一樣能夠查看到node1上的大頁。默認的狀況是內核會平均分配到 不一樣的socket上。在個人機器上,就是2個socket,這樣的話,每一個node上會分到8個大頁。node
然而,問題就來了。對於使用DPDK ring的primary進程和secondary進程而言,爲了提升性能,在其中的線程綁core的時候,最好是在同一個socket上,假設咱們綁定了socket 0上的多個core,這時候,不管是primary進程仍是secondary進程分配內存的時候都是優先在socket 0上的node 0分配內存,這就致使一個問題,node 1上的內存基本就分配不到,也就是說,雖然留出了16G的大頁給DPDK的應用使用,但實際上,只有不到一半的使用率。這就有點浪費內存咯。ubuntu
急於上面的問題,咱們指望可以從新分配大頁在不一樣socket上的分配比例,好比,若是DPDK進程都是在socket 0上,那麼16G大頁能夠分配12G給node 0,剩餘的4G給node 1,充分利用內存。centos
對於不一樣的系統,配置的方法大同小異,對於2M的大頁而言,能夠直接進行配置,而對於1G的大頁,老些的版本則存在一些問題,如在使用centos 6.3時,動態修改1G大頁的個數就不成功。socket
所以這裏只說通用的作法,對於本身的系統,能夠再進行細調。在內核啓動參數中配置大頁的大小和個數,以ubuntu爲例:性能
default_hugepagesz=1G hugepagesz=1G hugepages=1
設置到/etc/default/grub
中的GRUB_CMDLINE_LINUX
中,而後運行update-grub
更新啓動參數配置文件 /boot/grub/grub.cfg
。以後從新啓動,cat /proc/meminfo
就能看到系統中顯示大頁數量和剩餘的數量(這個圖是配置的2M的頁)。線程
接下來就是如何解決提到的背景問題了:3d
在系統啓動後,是能夠再進行調整大頁的數量的,配置的參數就在/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
,這個是2M的配置,對於1G的頁,無非就是2048K變爲其餘值。注意這裏的node0,若是還有其餘socket,就能夠調整對應的socket上的大頁的數量。code
也正是基於上面的可調整參數,能夠在系統啓動後,先進行大頁在不一樣socket上從新調整,而後再啓動DPDK的應用進程。好比共設置16個大頁,其中node 0上分配12個,node 1上分配4個。這裏也會有另外一個問題:就是若是調整後的大頁分配大於原來的總頁數會怎麼樣?對於2M的應該沒啥問題,對於1G的,恐怕是不行的,暫時沒實驗,須要注意。這樣調整後,把DPDK的應用都綁定在node 0上對應的core(由於咱們給他分的大頁多),這樣的話,就能充分利用到咱們分配的大頁了。blog
至此,能夠進一步觀察實驗了。進程