首页 > 解决方案 > mmap 调用在一个系统上有效,但在另一个系统上失败并显示“无法分配内存”。两者都运行相同的 linux 映像,具有大量内存

问题描述

我正在尝试运行一些我没有编写的代码,这需要大块(~1GB)的连续内存。我正在两种不同的硬件配置上尝试它,但使用相同的 linux 二进制文件。它在一个系统上运行,但在另一个系统上给出错误“无法分配内存”。

uint64_t alloc_flags = MAP_PRIVATE | MAP_POPULATE | MAP_ANONYMOUS | MAP_HUGETLB | (30 << MAP_HUGE_SHIFT) 

mem->buffer = (char *)mmap(NULL, mem->size, PROT_READ | PROT_WRITE,
                  alloc_flags, mem->fd, 0);
       if (mem->buffer == MAP_FAILED) {
       perror("[ERROR] - mmap() failed with");
       exit(1);
   }

有什么想法可能是问题,或者看什么?

/proc/meminfo 在两个系统上看起来都差不多。

我试过没有成功:echo 20 > /proc/sys/vm/nr_hugepages

编辑:两个系统 /sys/kernel/mm/hugepages/ 都有:“hugepages-1048576kB hugepages-2048kB”

.. /sys/kernel/mm/hugepages/hugepages-1048576kB/free_hugepages 在成功的系统上显示 1,在失败的系统上显示 0!

标签: clinuxmmap

解决方案


有足够的内存是不够的。硬件要求每个页面都是按页面大小对齐的连续物理内存范围。

如果您的系统内存碎片化并且没有足够的连续区域,分配将失败。

您可以通过内核参数要求内核在启动时保留一些内存:

hugepagesz=1G hugepages=2

这应该分配 2 个 1GB 页面。请注意,您的 CPU 需要pdpe1gb设置标志:

grep pdpe1gb /proc/cpuinfo

这应该不是问题,因为自 Westmere(2010 年发布)以来的所有 CPU。


推荐阅读