• dpdk进程启动提示无法分配足够的连续大页内存问题处理


    背景

    在启动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.

    就是申请大页内存应该在系统启动时,或系统启动后尽快申请,避免内存被割裂。

    作者:first_semon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    两个链表的第一个公共节点(Python and C++解法)
    第一个只出现一次的字符(Python and C++解法)
    丑数(Python and C++解法)
    最长不含重复字符的子字符串(Python and C++解法)
    礼物的最大值(Python and C++解法)
    把数字翻译成字符串(Python and C++解法)
    连续子数组的最大和(Python and C++解法)
    最小的k个数(Python and C++解法)
    数组中出现次数超过一半的数字(Python and C++解法)
    字符串的排列(Python and C++解法)
  • 原文地址:https://www.cnblogs.com/first-semon/p/14189192.html
Copyright © 2020-2023  润新知