Можно ли выделить в Linux большой объем виртуальной памяти?
Возможно. Но вам может потребоваться настроить его так, чтобы он был разрешен:
Ядро Linux поддерживает следующие режимы обработки overcommit
0 - Эвристическая обработка overcommit. Очевидные нарушения адресного пространства отклоняются. Используется для типичной системы. Это обеспечивает серьезное сбои при распределении, позволяя при избыточном коммите сократить использование подкачки. В этом режиме root может выделить немного больше памяти. Это значение по умолчанию.
1 - Всегда перегрузка. Подходит для некоторых научных приложений. Классическим примером является код, использующий разреженные массивы и просто полагающийся на виртуальную память, состоящую почти полностью из нулевых страниц.
2 - Не перегружайте. Общая фиксация адресного пространства для системы не может превышать swap + настраиваемый объем (по умолчанию 50%) физической памяти. В зависимости от количества, которое вы используете, в большинстве случаев это означает, что процесс не будет остановлен при доступе к страницам, но при необходимости получит ошибки при выделении памяти.
Полезно для приложений, которые хотят гарантировать, что их выделение памяти будет доступнов будущем без необходимости инициализации каждой страницы.
Политика избыточной фиксации устанавливается с помощью sysctl `vm.overcommit_memory '.
Итак, если вы хотите выделить больше виртуальной памяти, чему вас есть физическая память, тогда вам нужно:
# in shell
sysctl -w vm.overcommit_memory=1
RLIMIT_AS Максимальный размер виртуальной памяти процесса (адресного пространства) в байтах. Это ограничение влияет на вызовы brk (2), mmap (2) и mremap (2), которые завершаются ошибкой ENOMEM при превышении этого предела. Также автоматическое расширение стека завершится неудачно (и сгенерирует SIGSEGV, который убивает процесс, если через sigaltstack (2) не было сделано доступного альтернативного стека). Поскольку значение является длинным, на компьютерах с длиной 32-битной версии это ограничение не должно превышать 2 ГиБ, или этот ресурс не ограничен.
Итак, вам нужно:
setrlimit(RLIMIT_AS, {
.rlim_cur = RLIM_INFINITY,
.rlim_max = RLIM_INFINITY,
});
Или, если вы не можете дать процессу разрешение на это, то вы можете настроить его постоянно в /etc/security/limits.conf, что повлияет на все процессы (пользователя / группы).
Хорошо, так что, кажется, mmap поддерживает ... но для этого требуется дескриптор файла. ... может быть победой, но не в том случае, если они должны быть подкреплены файлом ... Мне не нравится идея прикрепления к файлу
Вам не нужно использоватьфайл поддержал mmap. Для этого есть MAP_ANONYMOUS.
Я не знал, какой номер вставить в запрос
Затем используйте ноль. Пример:
mmap(nullptr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
Тем не менее, если вы настроили систему, как описано, то new
должен работать так же, как и mmap
. Вероятно, он будет использовать malloc
, который, вероятно, будет использовать mmap
для таких больших выделений, как этот.
Бонус-подсказка: вы можете воспользоваться преимуществом использования HugeTLB Pages .