Что означает размер виртуальной памяти сверху?
Я бегу top
для мониторинга производительности моего сервера и 2 из моих процессов Java показывают виртуальную память до 800 МБ-1 ГБ. Это плохо?
Что означает виртуальная память?
И, кстати, у меня есть своп 1 ГБ, и это показывает, 0% используется. Так что я в замешательстве.
Процесс Java = 1 сервер Tomcat + мой собственный сервер java-демона = Ubuntu 9.10 (karmic)
7 ответов
Виртуальная память даже не обязательно является памятью. Например, если процесс отображает в памяти большой файл, файл фактически сохраняется на диске, но он все еще занимает "адресное пространство" в процессе.
Адресное пространство (т. Е. Виртуальная память в списке процессов) ничего не стоит; это нереально. Что реально, так это столбец RSS (RES), который является резидентной памятью. Вот сколько вашей реальной памяти занимает процесс.
Но даже это не полный ответ. Если процесс вызывает fork(), он разделяется на две части, и обе они первоначально совместно используют все свои RSS. Таким образом, даже если бы RSS изначально был 1 ГБ, результатом после разветвления было бы два процесса, каждый с RSS 1 ГБ, но вы все равно использовали бы только 1 ГБ памяти.
Смущены еще? Вот что вам действительно нужно знать: используйте free
команду и проверьте результаты до и после запуска вашей программы (на +/- buffers/cache
линия). Разница в том, сколько новой памяти использует ваша недавно запущенная программа.
Я нашел это объяснение Мугурела Суманариу очень ясным:
VIRT
обозначает виртуальный размер процесса, который представляет собой сумму памяти, которую он фактически использует, память, которую он отобразил в себя (например, ОЗУ видеокарты для X-сервера), файлы на диске, которые были отображены в него (большинство особенно разделяемые библиотеки), и память, совместно используемая с другими процессами. VIRT показывает, сколько памяти программа может получить в настоящий момент.
RES
обозначает резидентный размер, который является точным представлением того, сколько фактической физической памяти потребляет процесс. (Это также напрямую соответствует столбцу%MEM.) Это практически всегда будет меньше, чем размер VIRT, так как большинство программ зависят от библиотеки C.
SHR
указывает, какой размер VIRT на самом деле может быть разделен (память или библиотеки). В случае библиотек это не обязательно означает, что вся библиотека является резидентной. Например, если программа использует только несколько функций в библиотеке, вся библиотека отображается и будет учитываться в VIRT и SHR, но только части файла библиотеки, содержащие используемые функции, будут фактически загружены и подсчитаны под RES.
С верхней (1) страницы справочника:
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.
VIRT = SWAP + RES.
Где RES означает резидентную память (используется физическая память).
На самом деле это не правильно (больше). Когда он говорит "swap", это также включает файлы, которые программа отображает в своем адресном пространстве, которые могут или не могут фактически потреблять реальную оперативную память. Эта память хранится в файле, но на самом деле это не подкачка.
VIRT также включает страницы, которые были выделены, но еще ни для чего не используются. Любая страница в этом состоянии сопоставляется с нулевой страницей ядра (блестящая концепция - вам следует поискать ее), поэтому она отображается в VIRT, но фактически не потребляет никакой памяти.
Столбец VIRT в выводе ps / top практически не имеет значения для измерения использования памяти. Не беспокойся об этом. Apache тяжелой нагрузки VIRT против RES памяти
VIRtual
верхний столбец относится к суперпространству (пространству сверхпотребления) процесса, которое процесс может фактически не занимать во время выполнения. Есть еще одна колонка RESident
, который относится к фактической физической памяти / пространству, выделенному процессом, во время выполнения.
Причину различий между ними можно понять из примера: если процесс использует определенную библиотеку, то размер библиотеки также поможет virtual-size
, однако, поскольку будет использоваться только часть библиотеки (то есть некоторые используемые методы), так что это поможет в resident-size
,
Обратитесь за дополнительной информацией
Linux поддерживает виртуальную память, то есть использует диск в качестве расширения ОЗУ, так что эффективный объем используемой памяти соответственно увеличивается. Ядро запишет содержимое неиспользуемого в данный момент блока памяти на жесткий диск, чтобы память могла быть использована для других целей. Когда исходное содержимое снова необходимо, оно читается обратно в память. Все это сделано полностью прозрачным для пользователя; программы, работающие под Linux, видят только больший объем доступной памяти и не замечают, что их части время от времени находятся на диске. Конечно, чтение и запись на жесткий диск медленнее (в тысячу раз медленнее), чем при использовании реальной памяти, поэтому программы не работают так быстро. Часть жесткого диска, которая используется в качестве виртуальной памяти, называется пространством подкачки.
Linux может использовать либо обычный файл в файловой системе, либо отдельный раздел для пространства подкачки. Раздел подкачки быстрее, но легче изменить размер файла подкачки (нет необходимости перераспределять весь жесткий диск и, возможно, устанавливать все с нуля). Когда вы знаете, сколько места подкачки вам нужно, вы должны перейти к разделу подкачки, но если вы не уверены, вы можете сначала использовать файл подкачки, некоторое время использовать систему, чтобы вы могли почувствовать, сколько вы поменяете нужно, а затем сделать раздел подкачки, когда вы уверены в его размере.
Вы также должны знать, что Linux позволяет использовать несколько разделов подкачки и / или файлов подкачки одновременно. Это означает, что если вам иногда требуется необычный объем пространства подкачки, вы можете настроить дополнительный файл подкачки в такое время, вместо того, чтобы постоянно выделять всю сумму.
Примечание по терминологии операционной системы: компьютерные науки обычно различают подкачку (запись всего процесса в пространство подкачки) и подкачку страниц (запись только частей фиксированного размера, обычно по несколько килобайт, за один раз). Пейджинг обычно более эффективен, и это то, что делает Linux, но традиционная терминология Linux в любом случае говорит об обмене.
"VIRT" - это просто адресное пространство, RES - это "реальная" память, но "SHR" (= совместно используемая) величина "RES" - это часть RES, которая используется совместно с другими процессами. Поэтому для большинства процессов я считаю, что вычитание SHR из RES дает вам объем памяти, который действительно относится к этому конкретному процессу.