Максимально возможный объем памяти в x64 Linux - PullRequest
1 голос
/ 10 января 2012

есть ли ограничение памяти для одного процесса в x64 Linux?

мы работаем под управлением Linux-сервера с 32 ГБ ОЗУ, и мне интересно, могу ли я выделить большую его часть для одного процесса, который я кодирую, и который требует много ОЗУ!

Ответы [ 3 ]

4 голосов
/ 10 января 2012

Некоторые ядра имеют разные ограничения, но в любом современном 64-разрядном linux ограничение для одного процесса все еще намного превышает 32 ГБ (при условии, что этот процесс является 64-разрядным исполняемым файлом).Различные дистрибутивы могут также устанавливать ограничения для каждого процесса, используя sysctl, поэтому вам нужно проверить локальную среду, чтобы убедиться, что не установлены произвольно низкие пределы (также проверьте ipcs -l в системах на основе RPM).

В документации к порту Debian для порта AMD64 конкретно упоминается, что ограничение виртуального адресного пространства для каждого процесса составляет 128 ТБ (в два раза больше предела физической памяти), так что это должно быть разумной верхней границейработаем с.

3 голосов
/ 24 марта 2015

Текущее 64-битное ядро ​​Linux имеет ограничение в 64 ТБ физической ОЗУ и 128 ТБ в виртуальной памяти (см. Ограничения RHEL и Порт Debian ). Текущие процессоры x86_64 (т. Е. То, что у нас в ПК) имеет (виртуальный) предел адреса 2 ^ 48 = 256 ТБ из-за того, как регистр адреса в ЦП использует все биты (верхние биты используются для флагов страниц, таких как ReadOnly, Writable, ExecuteDisable, PagedToDisc и т. Д. В таблице страниц), но спецификация позволяет переключаться в режим истинного 64-битного адреса, достигая максимума при 2 ^ 64 = 16EB (в байтах). Тем не менее, материнская плата и центральный процессор имеют не так много контактов для доставки всех 48 бит адреса памяти к микросхеме ОЗУ через адресную шину, поэтому предел физической памяти ниже (и зависит от производителя), но виртуальный адрес пространство по своей природе может превышать объем ОЗУ, который может быть на материнской плате, до ограничения виртуальной памяти, указанного выше.

Ограничение на процесс увеличивается в зависимости от того, как установлено виртуальное адресное пространство памяти для процесса, потому что могут быть разные размеры для стека, области mmap () (и динамических библиотек), самого программного кода, а также сопоставления ядра. в пространство процесса. Некоторые из этих настроек могут быть изменены путем передачи аргумента компоновщику, иногда с помощью специальной директивы в исходном коде, или путем непосредственного изменения двоичного файла с помощью программы (двоичный файл имеет формат ELF). Также существуют ограничения, которые установил администратор компьютера (root) или пользователь (см. Вывод команды "ulimit -a"). Эти ограничения могут быть мягкими или жесткими, и пользователь не может преодолеть жесткий лимит.

Также ядро ​​Linux может быть настроено так, чтобы разрешать чрезмерное выделение памяти. В этом случае программе разрешается выделять огромный объем оперативной памяти, а затем использовать только несколько страниц (см. Разреженные массивы, разреженная матрица), см. документация по ядру Linux . Таким образом, в этом случае программа завершится с ошибкой только после заполнения запрошенной памяти данными, но не во время выделения памяти.

3 голосов
/ 10 января 2012

Ограничения ресурса устанавливаются с помощью системного вызова setrlimit .Вы можете изменить их с помощью встроенной оболочки (например, ulimit на bash, limit с zsh).

Практическое ограничение также связано с размером оперативной памяти и размером подкачки.Команда free показывает это.(Некоторые системы перегружают память, но это рискованно).

Процесс фактически не использует оперативную память, он потребляет виртуальную память , используя системные вызовы, такие как mmap (который может быть вызван malloc).С помощью этого вызова вы даже можете отобразить часть файла в память.

Чтобы узнать карту памяти процесса 1234, загляните в файл /proc/1234/maps.Из вашего собственного приложения прочитайте /proc/self/maps.И у вас есть также /proc/1234/smaps и /proc/self/smaps.Попробуйте команду cat /proc/self/maps, чтобы понять карту памяти процесса, который выполняет cat.

На компьютере с 32 ГБ ОЗУ вы обычно можете запустить процесс с 31 ГБ пространства процесса (при условии, что другого большого процесса нет).существовать).Если бы у вас было также 64 ГБ подкачки, вы могли бы запустить процесс как минимум 64 ГБ, но это было бы невероятно медленно (большую часть времени было бы потрачено на загрузку на диск).Вы можете добавить пространство подкачки (например, поменяв местами файл, инициализированный с dd, затем mkswap и активированный с swapon).

Если кодируете сервер, будьте очень осторожны с памятьюутечки .Инструмент valgrind полезен для поиска таких ошибок.И вы могли бы рассмотреть возможность использования сборщика мусора Бома

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...