版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/shaoyunzhe/article/details/54614077
HugePages_Total: 16 //預留HugePages的總個數
HugePages_Free: 16 //池中尚未分配的 HugePages 數量,真正空閑的頁數等於HugePages_Free - HugePages_Rsvd
HugePages_Rsvd: 0 //表示池中已經被應用程序分配但尚未使用的 HugePages 數量
HugePages_Surp: 0 //這個值得意思是當開始配置了20個大頁,現在修改配置為16,那么這個參數就會顯示為4,一般不修改配置,這個值都是0
Hugepagesize: 1048576 kB //每個大頁的大小
1、hugepage永久 配置
修改/etc/default/grub 中的 GRUB_CMDLINE_LINUX,然后運行 grub 更新並重啟系統:
default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on isolcpus=1-13,15-27
#grub2-mkconfig -o /boot/grub2/grub.cfg
#reboot
注意:上面設置的是系統預留內存,如果是單cpu,預留大小肯定就是上面設置的值,如果是numa系統,每個cpu node平分上面設置的大小(比如系統有cpu node 0和node1,hugepages=2048,在查看/sys/devices/system/node/node0/hugepages/nr_hugepages時,大小肯定是1024)命令 echo ‘vm.nr_hugepages=2048' > /etc/sysctl.d/hugepages.conf也可以設置,但一定注意,有時發現grub設置的大頁大小和實際大小不一樣時,可能就是/etc/sysctl.d/hugepages.conf里的參數在作怪。默認情況下就是系統當前所有在線NUMA節點平均分配這些HugePages,除非那個NUMA節點本身沒有足夠的可用連續內存來生成 HugePages,那么此時HugePages將由另外一個NUMA節點生成hugepage 的數量和類型可根據系統中的可用內存進行調整。 isolcpus 參數支持我們將某些 CPU 與 Linux 調度程序隔離,以便基於 DPDK 的應用能夠鎖定到這些 CPU 上。
重啟系統后,查看內核 cmdline 並按照如下方式分配 hugepage。
接下來是安裝 hugepage 文件系統,加載 vfio-pci 用戶空間驅動程序。
#mkdir -p /mnt/huge
#mkdir -p /mnt/huge_2mb
#mount -t hugetlbfs hugetlbfs /mnt/huge (沒有-o參數,掛載系統默認hugepage大小)
默認大小指的是上圖顯示的Hugepagesize: 1048576 kB,也就是1G大頁(cat /proc/meminfo | grep Hugepagesize)。
#mount -t hugetlbfs none /mnt/huge_2mb -o pagesize=2MB(-o參數指定掛載2M的hugepage大小)
2、臨時配置
Hugepage能夠動態預留,執行命令:
$ echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
上面通過沒有節點關聯的系統分配內存頁。如果希望強制分配給指定的NUMA節點,你必須做:
#echo 1024 >/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
#echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
hugepages-2048kB指預留2M的大小為1024個,一共2*1024M,hugepages-1048576kB指預留1G的大小
3、查看HugePages情況:
cat /proc/meminfo
4、查看掛載情況
cat /proc/mounts
會看見hugetlbfs /mnt/huge hugetlbfs rw,relatime 0 0這樣的,這就是掛載了大頁,在free不夠時,在確定可以umount時,把這些umount一下就可以了,vpp代碼自動掛載大頁的,ovs+dpdk需要手動掛載
5、vpp關於大頁的一些問題
A:有時啟動vpp會報:
導致這原因一般是dpdk默認要求的大頁內存大小太大,而實際預留的太小,就必須在vpp啟動配置文件startup.conf中修改dpdk屬性socket-mem,改小一點
B:vpp默認掛載大頁的路徑是/run/vpp/hugepages,有時vpp\啟動不了,查看cat /proc/mounts,發現掛載了多個/run/vpp/hugepages,但umount又卸載不完,
[root@localhost /]# umount /run/vpp/hugepages
umount: /run/vpp/hugepages: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
可以使用以下解決辦法
使用fuser命令,先確認有那些進程需要殺掉
[root@localhost /]# fuser -cu /run/vpp/hugepages
/mnt: 15060c(root)
其次向進程發出SIGKILL信號
[root@localhost /]# fuser -ck /run/vpp/hugepages
/mnt: 15060c
確認
[root@localhost /]# fuser -c /run/vpp/hugepages
[1]+ Killed dd if=1g of=/dev/null bs=1M (wd:/run/vpp/hugepages)
(wd now: /)
6 ovs+dpdk大頁問題
有時沒法重啟服務器只能配置臨時大頁時,但啟動ovs+dpdk會報錯,
A:
上面顯示的是有4個1073741824(1G)大小的大頁,2048個2097152(2M)大小的大頁,但都沒有掛載,必須手動掛載大頁,需要執行mount -t hugetlbfs hugetlbfs /mnt/huge
B:
這是因為配置的大頁大小不滿足ovs+dpdk大頁需求,需要增大臨時大頁配置
C:
這種情況具體原因就是沒有mount!必須執行
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
比如原來的設置是4096 echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
AnonHugePages: 5218304 kB
HugePages_Total: 4096
HugePages_Free: 4096
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
現在先設置 echo 128 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
再設置echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
估計是內存連續問題造成的
7、其他問題
有時,你會發現大頁
不管怎樣配置,free就是0,top或是free命令,查看內存基本使用完了,但是我們並沒有啟動vpp或是ovs,這個很大可能就是其他進程使用了hugepage,使用以下命令查找
find /proc/*/smaps | xargs grep -ril "anon_hugepage"
原理請查看https://toutiao.io/posts/n4hzg1/preview里hugepage內容
————————————————
版權聲明:本文為CSDN博主「懶少」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/shaoyunzhe/article/details/54614077