Я пытаюсь использовать функцию mmap для выделения большого объема памяти в виртуальном пространстве. Мне нужно около 30 Гб, но это не так. Я пробовал с 20Gb с тем же результатом. Я выполнил свой тест на 64-битном сервере OVH с 60 ГБ ОЗУ.
Мой тестовый код:
#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
Кто-то может сказать мне, можно ли выделить 30 ГБ виртуальной памяти с помощью mmap и почему? Иначе как выделить 30Gb другим способом?
Пожалуйста, не спрашивайте, почему я хочу сделать это, или это глупые или другие философские мысли.
Это моя потребность, и я просто хочу найти способ сделать это, если это возможно.
Я запустил вашу программу на Linux Mint 17 (примерно Ubuntu 14.04) x86_64 без ошибок. В моей системе 8 ГБ ОЗУ, 16 ГБ подкачки, большая часть 8 ГБ в настоящее время используется кешем страниц и 1-2 ГБ в настоящее время используется процессами.
(Кстати, для подобных вопросов вам действительно нужно подробно указать свою платформу.)
Я смог воспроизвести ваше сообщение об ошибке двумя разными способами.
Первый способ:
$ ./mmap
8
0 Success
$ ulimit -v 65536
$ ./mmap
8
1 Cannot allocate memory
Второй способ (из новой оболочки):
$ ./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
задавать?
Я собираюсь немного погулять и заявить, что один из них — твой преступник.