mmap 调用在一个系统上有效,但在另一个系统上失败并显示 "Cannot allocate memory"。两张 运行 相同的 linux 图片,内存充足
mmap call works on one system but fails with "Cannot allocate memory" on another. Both running same linux image, with plenty of memory
我正在尝试 运行 一些我没有写的代码,它需要一大块 (~1GB) 的连续内存。我在两种不同的硬件配置上尝试它,但使用相同的 linux 二进制文件。它在一个系统上 运行s 但在另一个系统上给出错误 "Cannot allocate memory"。
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!
从 mmap(2) 读取,似乎 MAP_HUGE_1GB(即您的 (30 << MAP_HUGE_SHIFT) 标志)在任何地方都不受支持:
The range of huge page sizes that are supported by the system
can be discovered by listing the subdirectories in /sys/kernel/mm/hugepages
你的ls /sys/kernel/mm/hugepages/
输出是多少?
有足够的内存是不够的。硬件要求每个页面都是按页面大小对齐的连续物理内存范围。
如果您的系统内存碎片化且没有足够的连续区域,分配将失败。
您可以要求内核在启动时通过kernel parameters保留一些内存:
hugepagesz=1G hugepages=2
这应该分配 2 个 1GB 的页面。请注意,您的 CPU 需要设置 pdpe1gb
标志:
grep pdpe1gb /proc/cpuinfo
这应该不是问题,因为自 Westmere(2010 年发布)以来所有 CPUs。
我正在尝试 运行 一些我没有写的代码,它需要一大块 (~1GB) 的连续内存。我在两种不同的硬件配置上尝试它,但使用相同的 linux 二进制文件。它在一个系统上 运行s 但在另一个系统上给出错误 "Cannot allocate memory"。
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!
从 mmap(2) 读取,似乎 MAP_HUGE_1GB(即您的 (30 << MAP_HUGE_SHIFT) 标志)在任何地方都不受支持:
The range of huge page sizes that are supported by the system can be discovered by listing the subdirectories in /sys/kernel/mm/hugepages
你的ls /sys/kernel/mm/hugepages/
输出是多少?
有足够的内存是不够的。硬件要求每个页面都是按页面大小对齐的连续物理内存范围。
如果您的系统内存碎片化且没有足够的连续区域,分配将失败。
您可以要求内核在启动时通过kernel parameters保留一些内存:
hugepagesz=1G hugepages=2
这应该分配 2 个 1GB 的页面。请注意,您的 CPU 需要设置 pdpe1gb
标志:
grep pdpe1gb /proc/cpuinfo
这应该不是问题,因为自 Westmere(2010 年发布)以来所有 CPUs。