RSS - это размер резидентного набора и используется, чтобы показать, сколько памяти выделено этому процессу и находится в оперативной памяти. Он не включает память, которая выгружается. Он включает память из общих библиотек, пока страницы из этих библиотек фактически находятся в памяти. Он включает в себя всю память стека и кучи.
VSZ - это размер виртуальной памяти. Он включает в себя всю память, к которой может обращаться процесс, включая память, которая выгружается, память, которая выделена, но не используется, и память из общих библиотек.
Таким образом, если процесс A имеет двоичный файл размером 500 КБ и связан с 2500 КБ совместно используемых библиотек, имеет 200 КБ выделенных стеков / кучи, из которых 100 КБ фактически находится в памяти (остальная часть поменялась местами или не используется), и он фактически загрузил только 1000 КБ совместно используемых библиотек. и 400K своего двоичного файла:
Поскольку часть памяти является общей, многие процессы могут использовать ее, поэтому, если вы сложите все значения RSS, вы легко сможете получить больше места, чем в вашей системе.
Память, которая выделяется, также может отсутствовать в RSS, пока она не будет фактически использована программой. Поэтому, если ваша программа выделяет кучу памяти заранее, а затем использует ее со временем, вы можете увидеть, что RSS растет, а VSZ остается прежним.
Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как пропорцию, используемую текущим процессом. Так что, если раньше было два процесса, использующих одну и ту же общую библиотеку:
Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux / unix.
Существует гораздо больше, чем это, чтобы узнать больше, проверьте следующие ссылки:
Я считаю, что RSS включает в себя память из динамически связанных библиотек. Если используются 3 процесса libxml2.so, общая библиотека будет учитываться в каждом из их RSS, поэтому сумма их RSS будет больше, чем фактическая используемая память.
МСЧ
1
Это верно. Я исправил свой ответ, спасибо за заголовки.
JMH
Я на Ubuntu 16.04, и есть процесс Java, имеет 1.2G RES и 4.5G VIRT, показывая из topкоманды. Эта система не имеет никакого обмена, swapon --showничего не возвращает. Как вы это объясните? Если vsz - это swap + разделяемые библиотеки, то в этом случае разделяемые библиотеки превышают 3.3G? Является ли это возможным? Просто очень запутался ...
Аарон Ван
Я не совсем уверен. Посмотрите на этот ответ об использовании виртуальной памяти Java: stackoverflow.com/a/561450/622115 . Краткая версия: VSZ может включать пространство кучи, которое выделено и не используется, а также файлы, отображаемые в память.
17
Отлично. Просто добавь что-нибудь. если вы используете malloc (100 КБ), то на самом деле используйте только 1 КБ. Значение rss равно 1 Кб, а значение vsz равно 100 Кб, даже если здесь нет свопа.
Кени ван
53
RSS - это размер резидентного набора (физически резидентная память - в настоящее время она занимает место в физической памяти машины), а VSZ - размер виртуальной памяти (выделенное адресное пространство - у него есть адреса, выделенные в карте памяти процесса, но это не обязательно фактическая память за этим все прямо сейчас).
Обратите внимание, что в наши дни обычных виртуальных машин физическая память с точки зрения машины может на самом деле не быть реальной физической памятью.
Имейте в виду, предоставляя больше информации, чем то, что аббревиатура означает?
Питикос
10
Минимальный исполняемый пример
Чтобы это имело смысл, вы должны понимать основы подкачки: как работает подкачка x86? и, в частности, что ОС может выделять виртуальную память через таблицы страниц / свою внутреннюю память (виртуальная память VSZ), прежде чем она фактически получит резервное хранилище в ОЗУ или на диске (резидентная память RSS).
Теперь, чтобы увидеть это в действии, давайте создадим программу, которая:
выделяет больше оперативной памяти, чем наша физическая память с mmap
записывает один байт на каждую страницу, чтобы гарантировать, что каждая из этих страниц переходит из виртуальной только памяти (VSZ) в фактически используемую память (RSS)
Виртуальная память VSZ остается постоянной printf '0x%X\n' 0x40009A4 KiB ~= 64GiB( psзначения в КиБ) после mmap.
RSS «реальное использование памяти» увеличивается лениво только при касании страниц. Например:
на первом отпечатке мы имеем extra_memory_committed 0, что означает, что мы еще не коснулись ни одной страницы. RSS - это небольшой файл, 1648 KiBкоторый был выделен для обычного запуска программы, такого как текстовая область, глобальные переменные и т. Д.
на втором отпечатке мы написали к 8388608 KiB == 8GiBстоимости страниц. В результате RSS увеличился ровно на 8GIB до8390256 KiB == 8388608 KiB + 1648 KiB
RSS продолжает расти с шагом 8 ГБ. Последний отпечаток показывает около 24 ГиБ памяти, и до того, как можно было напечатать 32 ГиБ, убийца OOM убил процесс
Итак, мы видим, что интересно, что это был демон MongoDB, который всегда запускался в моем ноутбуке на фоне, который первым вызвал убийцу OOM, предположительно, когда бедняга пытался выделить немного памяти.
Однако убийца ООМ не обязательно убивает того, кто его разбудил.
После вызова ядро печатает таблицу или процессы, включая oom_score:
и далее мы видим, что наш маленький на main.outсамом деле был убит при предыдущем вызове:
[ 7283.479871] Out of memory: Kill process 15665 (main.out) score 865 or sacrifice child
[ 7283.479879] Killed process 15665 (main.out) total-vm:67111332kB, anon-rss:92kB, file-rss:4kB, shmem-rss:30080832kB
[ 7283.479951] oom_reaper: reaped process 15665 (main.out), now anon-rss:0kB, file-rss:0kB, shmem-rss:30080832kB
Также интересно то, что все произошло, по-видимому, так быстро, что до того, как освободившаяся память была учтена, процесс oomснова пробудился DeadlineMonitor:
и на этот раз, что убило какой-то процесс Chromium, который, как правило, мой компьютер нормальная память:
[ 7283.481773] Out of memory: Kill process 11786 (chromium-browse) score 306 or sacrifice child
[ 7283.481833] Killed process 11786 (chromium-browse) total-vm:1813576kB, anon-rss:208804kB, file-rss:0kB, shmem-rss:8380kB
[ 7283.497847] oom_reaper: reaped process 11786 (chromium-browse), now anon-rss:0kB, file-rss:0kB, shmem-rss:8044kB
Протестировано в Ubuntu 19.04, ядро Linux 5.0.0.
Я думаю, что уже много сказано о RSS против VSZ. С точки зрения администратора / программиста / пользователя, когда я проектирую / кодирую приложения, меня больше беспокоит RSZ (резидентная память), и когда вы продолжаете тянуть все больше и больше переменных (в кучу), вы увидите, что это значение возрастает. Попробуйте простую программу для построения распределения памяти на основе malloc в цикле и убедитесь, что вы заполняете данные в этом пространстве malloc. RSS продолжает расти. Что касается VSZ, то это в большей степени сопоставление виртуальной памяти, чем в Linux, и одна из его основных функций, вытекающих из традиционных концепций операционной системы. Управление VSZ осуществляется с помощью управления виртуальной памятью ядра, для получения дополнительной информации о VSZ см. Описание Роберта Лава в mm_struct и vm_struct, которые являются частью базовой структуры данных task_struct в ядре.
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из обзора
Maak
Я предоставил вторую ссылку. Один из них останется в силе
Ответы:
RSS - это размер резидентного набора и используется, чтобы показать, сколько памяти выделено этому процессу и находится в оперативной памяти. Он не включает память, которая выгружается. Он включает память из общих библиотек, пока страницы из этих библиотек фактически находятся в памяти. Он включает в себя всю память стека и кучи.
VSZ - это размер виртуальной памяти. Он включает в себя всю память, к которой может обращаться процесс, включая память, которая выгружается, память, которая выделена, но не используется, и память из общих библиотек.
Таким образом, если процесс A имеет двоичный файл размером 500 КБ и связан с 2500 КБ совместно используемых библиотек, имеет 200 КБ выделенных стеков / кучи, из которых 100 КБ фактически находится в памяти (остальная часть поменялась местами или не используется), и он фактически загрузил только 1000 КБ совместно используемых библиотек. и 400K своего двоичного файла:
Поскольку часть памяти является общей, многие процессы могут использовать ее, поэтому, если вы сложите все значения RSS, вы легко сможете получить больше места, чем в вашей системе.
Память, которая выделяется, также может отсутствовать в RSS, пока она не будет фактически использована программой. Поэтому, если ваша программа выделяет кучу памяти заранее, а затем использует ее со временем, вы можете увидеть, что RSS растет, а VSZ остается прежним.
Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как пропорцию, используемую текущим процессом. Так что, если раньше было два процесса, использующих одну и ту же общую библиотеку:
Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux / unix.
Существует гораздо больше, чем это, чтобы узнать больше, проверьте следующие ссылки:
Также см:
источник
libxml2.so
, общая библиотека будет учитываться в каждом из их RSS, поэтому сумма их RSS будет больше, чем фактическая используемая память.top
команды. Эта система не имеет никакого обмена,swapon --show
ничего не возвращает. Как вы это объясните? Если vsz - это swap + разделяемые библиотеки, то в этом случае разделяемые библиотеки превышают 3.3G? Является ли это возможным? Просто очень запутался ...RSS - это размер резидентного набора (физически резидентная память - в настоящее время она занимает место в физической памяти машины), а VSZ - размер виртуальной памяти (выделенное адресное пространство - у него есть адреса, выделенные в карте памяти процесса, но это не обязательно фактическая память за этим все прямо сейчас).
Обратите внимание, что в наши дни обычных виртуальных машин физическая память с точки зрения машины может на самом деле не быть реальной физической памятью.
источник
Минимальный исполняемый пример
Чтобы это имело смысл, вы должны понимать основы подкачки: как работает подкачка x86? и, в частности, что ОС может выделять виртуальную память через таблицы страниц / свою внутреннюю память (виртуальная память VSZ), прежде чем она фактически получит резервное хранилище в ОЗУ или на диске (резидентная память RSS).
Теперь, чтобы увидеть это в действии, давайте создадим программу, которая:
mmap
main.c
GitHub вверх по течению .
Скомпилируйте и запустите:
где:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
: требуется для Linux, чтобы мы могли сделать вызов mmap больше физической ОЗУ: максимальный объем памяти, который может выделить mallocВыход программы:
Статус выхода:
что по правилу 128 + номер сигнала означает, что мы получили номер сигнала
9
, которыйman 7 signal
говорит , что это SIGKILL , который посылает убийца нехватки памяти Linux .Выходная интерпретация:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(ps
значения в КиБ) после mmap.extra_memory_committed 0
, что означает, что мы еще не коснулись ни одной страницы. RSS - это небольшой файл,1648 KiB
который был выделен для обычного запуска программы, такого как текстовая область, глобальные переменные и т. Д.8388608 KiB == 8GiB
стоимости страниц. В результате RSS увеличился ровно на 8GIB до8390256 KiB == 8388608 KiB + 1648 KiB
Смотрите также: /unix/35129/need-explanation-on-resident-set-size-virtual-size
Журналы убийцы ООМ
Наши
dmesg
команды показали журналы убийцы OOM.Точная интерпретация этих вопросов была задана по адресу:
Самая первая строка журнала была:
Итак, мы видим, что интересно, что это был демон MongoDB, который всегда запускался в моем ноутбуке на фоне, который первым вызвал убийцу OOM, предположительно, когда бедняга пытался выделить немного памяти.
Однако убийца ООМ не обязательно убивает того, кто его разбудил.
После вызова ядро печатает таблицу или процессы, включая
oom_score
:и далее мы видим, что наш маленький на
main.out
самом деле был убит при предыдущем вызове:В этом журнале упоминается,
score 865
что этот процесс имел, предположительно, самый высокий (худший) показатель убийцы OOM, как упомянуто по адресу: /unix/153585/how-does-the-oom-killer-decide-which- процесс на поражение-первыхТакже интересно то, что все произошло, по-видимому, так быстро, что до того, как освободившаяся память была учтена, процесс
oom
снова пробудилсяDeadlineMonitor
:и на этот раз, что убило какой-то процесс Chromium, который, как правило, мой компьютер нормальная память:
Протестировано в Ubuntu 19.04, ядро Linux 5.0.0.
источник
Я думаю, что уже много сказано о RSS против VSZ. С точки зрения администратора / программиста / пользователя, когда я проектирую / кодирую приложения, меня больше беспокоит RSZ (резидентная память), и когда вы продолжаете тянуть все больше и больше переменных (в кучу), вы увидите, что это значение возрастает. Попробуйте простую программу для построения распределения памяти на основе malloc в цикле и убедитесь, что вы заполняете данные в этом пространстве malloc. RSS продолжает расти. Что касается VSZ, то это в большей степени сопоставление виртуальной памяти, чем в Linux, и одна из его основных функций, вытекающих из традиционных концепций операционной системы. Управление VSZ осуществляется с помощью управления виртуальной памятью ядра, для получения дополнительной информации о VSZ см. Описание Роберта Лава в mm_struct и vm_struct, которые являются частью базовой структуры данных task_struct в ядре.
источник
Они не управляются, но измеряются и, возможно, ограничены (см.
getrlimit
Системный вызов, также в getrlimit (2) ).RSS означает размер резидентного набора (часть вашего виртуального адресного пространства, расположенная в оперативной памяти).
Вы можете запросить виртуальное адресное пространство процесса 1234 , используя процедурный (5) с
cat /proc/1234/maps
и его статус (включая потребление памяти) черезcat /proc/1234/status
источник