背景
在啟動dpdk多進程實例的時候,發現兩個進程相互切換啟動時,有一個進程必報無法申請足夠的連續的大頁數,導致dpdk主進程啟動失敗。
需求:
解決dpdk無法申請足夠的連續大頁數,讓兩個進程切換時都可以正常啟動。
錯誤如下:
1 EAL: Detected 32 lcore(s) 2 EAL: No free hugepages reported in hugepages-1048576kB 3 EAL: Multi-process socket /var/run/.rte_unix 4 EAL: Probing VFIO support... 5 EAL: Can only reserve 3105 pages from 4096 requested 6 Current CONFIG_RTE_MAX_MEMSEG=256 is not enough 7 Please either increase it or request less amount of memory. 8 EAL: FATAL: Cannot init memory 9 10 EAL: Cannot init memory
解決方案:
1:首先整理一套干凈的環境。即重啟服務器即可,因為一般情況下配置的大頁數據都是臨時的,不具備永久性。如果需要配置永久性的大頁,需要在啟動項的grub里配置,具體博友們可以自行查閱資料。
2:查看大頁的使用情況:
1 [root@localhost bin]# cat /proc/meminfo | grep Huge 2 AnonHugePages: 452608 kB 3 HugePages_Total: 0 4 HugePages_Free: 0 5 HugePages_Rsvd: 0 6 HugePages_Surp: 0 7 Hugepagesize: 2048 kB
3:啟動一個進程后,發現其申請了1024個大頁,與另一個進程申請的大頁數量不一致。
進程2:
[root@localhost bin]# cat /proc/meminfo | grep Huge AnonHugePages: 1087488 kB HugePages_Total: 4096 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
進程1:
[root@localhost bin]# cat /proc/meminfo | grep Huge AnonHugePages: 1087488 kB HugePages_Total: 1024 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
所以為了避免HugePages_Surp字段有數據,分配的大頁數量要求一樣,操作首先將進程1的大頁申請數量改成4096 這時候大頁數據一致了,該字段就不會存在數據了。
接下來:就是在啟動進程之前,手動或者自動對dpdk的大頁等一些配置進行設置。這樣進程在啟動的時候只需要綁定網卡,掛載大頁等就可以了。
博友么可能很疑惑:為什么會不一樣,這是因為兩個進程使用的dpdk版本不一樣,如果兩個進程使用的是同一個版本的話可能就不會存在這樣的問題了。上述的操作就相當於大頁相關的只分配一次,只要不重啟,進程直接使用就可以了。
官網建議:
dpdk-getting-started-guide.pdf這個文檔的2.3.2節中提到
The allocation of hugepages should be done at boot time or as soon as possible after system boot to prevent memory from being fragmented in physical memory.To reserve hugepages at boot time, a parameter is passed to the Linux* kernel on the kernel command line.
就是申請大頁內存應該在系統啟動時,或系統啟動后盡快申請,避免內存被割裂。
