mmap () не работает с ENOMEM в 1TB ANONYMOUS файле?

Я пытаюсь mmap анонимный файл 1TB в Fedora Linux x86_64 (4G RAM плюс 16G swap). Но я получил ENOMEM «не могу выделить память» и даже для 32G как следующий код. Я что-то пропустил? Оцените любую подсказку.

#define HEAP_SIZE (1UL << 35) int main() { void *addr = mmap(0, HEAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (addr == MAP_FAILED) { perror(NULL); return 1; } printf("mmap %d gbytes succeed\n", HEAP_SIZE/(1UL << 30)); return 0; } 

Стандартная политика перекомпоновки Linux не позволяет вам выделять эту большую память. У вас нет нигде около 1 ТБ ОЗУ, и kernel ​​теперь даст вам ENOMEM а не запуск убийцы OOM позже … но вы можете изменить эту политику.

 $ /sbin/sysctl vm.overcommit_memory vm.overcommit_memory = 0 $ sudo /sbin/sysctl vm.overcommit_memory=1 vm.overcommit_memory = 1 

Политика 1 «всегда превзойдена», что полезно для некоторых приложений. Политика 2 «никогда не превзойдёт». Политика по умолчанию, 0, допускает некоторый overcommit, но использует эвристику для отклонения больших распределений, например, неудачных на вашем компьютере.

альтернатива

Вы также можете использовать флаг MAP_NORESERVE . Обратите внимание, что kernel ​​будет игнорировать этот флаг, если его политика будет «никогда не превышать».