mmap如何分配超过20Gb?

时间:2014-12-25 20:57:49

标签: c++ c memory-management mmap virtual-memory

我尝试使用mmap函数在虚拟空间中分配大量内存。我的需求大约是30Gb,但它无法实现。我用20Gb尝试了相同的结果。我在具有60Gb RAM的OVH 64位机器服务器上执行了测试。

我的测试代码:

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <errno.h>

int main()
{
   void *r = NULL;

   printf("%lu\n", sizeof(size_t));

   r = mmap(NULL, ((size_t)20)*1024*1024*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

   printf("%d %s\n", r == MAP_FAILED, strerror(errno));

   return 0;
}

执行结果:

8
1 Cannot allocate memory

有人可以告诉我是否可以使用mmap分配30Gb的虚拟内存,为什么?那么如何用另一种方式分配30Gb呢?

请不要问为什么我要这样做,或者它是愚蠢的或其他哲学思想。 这是我的需要,我只想找到一种方法,如果可能的话。

1 个答案:

答案 0 :(得分:2)

我在Linux Mint 17(大致是Ubuntu 14.04)x86_64上运行你的程序没有错误。我的系统有8G的RAM,16G的交换,目前页面缓存使用的大部分8G,以及进程当前使用的1-2GB。

(顺便说一句,对于这样的问题,您确实需要详细说明您的平台。)

我能够以两种不同的方式重现您的错误消息。

第一种方式:

$ ./mmap
8
0 Success
$ ulimit -v 65536
$ ./mmap
8
1 Cannot allocate memory

第二种方式(来自新shell):

$ ./mmap
8
0 Success
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0
$ sudo sysctl vm.overcommit_memory=2
vm.overcommit_memory = 2
$ ./mmap
8
1 Cannot allocate memory

所以,正如@ vz0所问,ulimit -a说了什么?

您有多少交换,正在使用多少内存,以及您的系统如何设置vm.overcommit_memory

我会稍微走出一条路,断言其中一个是你的罪魁祸首。