簡體   English   中英

mmap如何分配超過20Gb?

[英]How can mmap allocate more than 20Gb?

我嘗試使用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呢?

請不要問我為什么要這樣做,或者是愚蠢的或其他哲學思想。 這是我的需要,我只想找到一種方法,如果可能的話。

我在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

我會稍微走出去,斷言其中一個是你的罪魁禍首。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM