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