c - 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!
解决方案
有足够的内存是不够的。硬件要求每个页面都是按页面大小对齐的连续物理内存范围。
如果您的系统内存碎片化并且没有足够的连续区域,分配将失败。
您可以通过内核参数要求内核在启动时保留一些内存:
hugepagesz=1G hugepages=2
这应该分配 2 个 1GB 页面。请注意,您的 CPU 需要pdpe1gb
设置标志:
grep pdpe1gb /proc/cpuinfo
这应该不是问题,因为自 Westmere(2010 年发布)以来的所有 CPU。
推荐阅读
- r - 在 plotly 中与 add_trace() 一起使用时,悬停模板显示数据两次
- html - 如何移动 p 标签?
- asp.net - 导出脚手架工具路径的动作是什么意思?
- javascript - 如何处理非活动用户并在反应 JavaScript 中注销?
- java - 将classPath中的路径与Spring Boot中资源文件夹中的路径匹配
- c# - 如何在子类中删除从父类继承的方法?
- python - 安装 xlwings 以将 Python 与 excel 一起使用时出现问题
- hl7-fhir - 如何获取包含患者详细信息和他/她已采取的索赔的 FHIR 捆绑包?
- sql - 根据有序sql表中的数字系列分配增量ID
- python - 帮帮我在 Google Colab 上训练 YOLOv3-tiny 或 YOLOv4-tiny