Понимание использования виртуальной памяти> подкачка + физическая в Linux

9

У меня есть процесс, который сообщает «сверху», что он имеет 6 ГБ резидентной памяти и 70 ГБ выделенной виртуальной памяти. Странно то, что этот конкретный сервер имеет только 8 ГБ физического и 35 ГБ свободного пространства подкачки.

Из «верхнего» руководства:

   o: VIRT  --  Virtual Image (kb)
      The total amount of virtual memory used by the  task.   It  includes
      all  code,  data  and  shared  libraries  plus  pages that have been
      swapped out. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

Учитывая это объяснение, я ожидаю, что распределение виртуальной памяти для процесса будет ограничено моей доступной подкачкой + физической памятью.

Согласно 'pmap', разделы кода, разделяемой библиотеки и разделяемой памяти этого процесса минимальны - не более 300 МБ или около того.

Очевидно, что машина и процесс все еще работают правильно (хотя и медленно), так чего мне здесь не хватает?

Живот
источник

Ответы:

9

Это может быть требование нулевой памяти, которая отсутствует в физической памяти или в файле подкачки.

Некоторые ресурсы, которые вы можете посмотреть:

Создает ли ваше приложение много пустых страниц памяти? Если это так, ваше приложение может получить большую выгоду от:

Это позволяет сжимать и распаковывать страницы памяти в реальном времени. В свою очередь, вы можете хранить все в оперативной памяти, а не на диске ( очень медленно ).

Уникс Дворник
источник
Да, приложение выполняет много корреляций в пространстве IPV4, поэтому потенциально оно может содержать множество пустых страниц в зависимости от распределения трафика. Мы должны следить за этим. Спасибо!
Живот
рад помочь, надеюсь, что другой пользователь пометит меня. Я придумаю убийственные ответы, но у меня рейтинг 1266 :-(. Я не думаю, что пользователи сбоев в работе сервера, как я, хаххах
The Unix Janitor
1
Несколько причин, почему люди не могут голосовать за вас: 1. Форматирование вашего ответа --- используйте разметку. 2. Ваше имя пользователя кажется общим. 3. Самое главное: тот факт, что вы находите это достаточно важным, чтобы комментировать об этом. Оставляет кислый вкус во рту людей.
Бельмин Фернандес
@ user37899 Upvotes, как правило, делятся на 3 категории: насколько информативен ответ, насколько хорошо отформатирован и легко читается, и насколько популярен вопрос. Я бы поработал над вашим форматированием, но вы также должны иметь некоторый дзен и понимать, что некоторые фантастические ответы находятся на сайте всего лишь с одним голосом - популярность вопроса является фактором с наибольшим эффектом.
Джефф Ферланд
1
Сделал некоторое форматирование. Надеюсь, это поможет хе.
Бельмин Фернандес
2

Вот обсуждение вирт против резидентной памяти:

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

Обсуждение относится к процессам Java, но применимо ко всему, что работает под Linux. Главное, что касается вирта, это то, что он включает в себя целую кучу вещей, которые никогда не могут быть использованы. Virt - это то, на что нужно обратить внимание в 32-битных ОС (поскольку процессы будут выходить за пределы адресуемого пространства), но в большинстве случаев это бесполезно. Как уже отмечалось, следует обратить внимание на резидентную память, которая будет ограничена доступной физической оперативной памятью и вашей подкачкой.

CJC
источник
он на самом деле спросил, почему выделенная виртуальная память была больше, чем его физическая память + пространство подкачки ..
The Unix Janitor
Да, и обсуждение в Stackoverflow говорит о том, как это возможно.
cjc
1

Вероятно, это связано с тем, что адресное пространство процесса соответствует размеру, который вы указали, но на самом деле оно не выделяется ОС.

От: http://lwn.net/Articles/428100/

В процессе достижения этой цели «достаточно низкие накладные расходы и отсутствие значительных задержек» разработчики Go сделали несколько упрощающих предположений, одним из которых является то, что управление памятью для работающего приложения происходит из единого, практически непрерывного диапазон адресов. Такие предположения могут натолкнуться на ту же проблему, с которой ваш редактор столкнулся с vi - другой код может распределить фрагменты в середине диапазона - поэтому разработчики Go приняли одно и то же решение: они просто выделяют всю память, которая, по их мнению, им может понадобиться (они полагали, разумно, что 16 ГБ должно хватить на 64-битной системе) во время запуска.

Так что это нелегкий способ управления памятью иногда - наличие непрерывного адресного пространства упрощает освобождение неиспользуемой памяти.

Michaels
источник
0

Ответ, вероятно, MMAP - данные находятся на диске, но они находятся «вне» подкачки и не могут быть видны с помощью команды «free» или «top».

Если процесс Java не слишком сложен, вы можете попробовать поиграть с «lsof», чтобы найти файл MMAP. Однако, если этот Java-процесс сложен, его будет трудно увидеть.

Ник
источник
-1

Я также был удивлен, что Linux позволяет выделить больше виртуальной памяти, чем физической памяти + пространство подкачки, но, очевидно, это помогает повысить производительность в типичных ситуациях.

К счастью, есть параметр настройки ядра, который можно использовать для переключения режима учета памяти. Этот параметр vm.overcommit_memory, и он указывает, какой алгоритм используется для отслеживания доступной памяти. Значение по умолчанию (0) использует эвристический метод и перегружает систему виртуальной памяти. Если вы хотите, чтобы ваши программы получали соответствующие ошибки нехватки памяти при распределении, а не подвергали ваши процессы случайным убийствам, вам следует установить для этого параметра значение 2.

http://www.linuxjournal.com/article/10678

Джон Велонис
источник
Это полностью запутано. Overcommit - это не то, что позволяет выделить больше виртуальной памяти, чем физическая память плюс пространство подкачки. Вы можете сделать это даже без чрезмерной нагрузки. (Например, на машине с 2 ГБ ОЗУ, без подкачки и без перегрузки, вы все равно можете отобразить карту памяти на 4 ГБ файла только для чтения, используя 4 ГБ виртуальной памяти.)
Дэвид Шварц,