Как сообщается об использовании памяти в Linux?
Используя ps, я могу видеть размер, vsize (такой же, как у VIRT вершины?) И rss (такой же, как у RES у вершины?). (Еще одна, которую я вижу сверху - это SHR.)
Может ли кто-то резюмировать для меня, что означают эти разные области?
2 ответа
Короче:
Виртуальный размер: это объем адресного пространства, которым управляет процесс. Виртуальное адресное пространство содержит все, к чему процесс может получить доступ через указатели (ссылки на адреса в памяти). Например, если ваша программа получает доступ к кадровому буферу вашей видеокарты, эта память сопоставляется с виртуальным пространством процесса и получает адрес, который хранится в указателе. Отображенные в память файлы и анонимные сопоставления также учитываются в размере виртуального адресного пространства. Практически все в виртуальном размере. Если вы суммируете размер всех диапазонов адресов, перечисленных в
/proc/<pid>/maps
, он должен вернуть вам примерно то же значение виртуального размера.Резидентный размер: это объем памяти, который принадлежит именно тому процессу, который в данный момент находится в памяти. Это означает, что объем памяти, который не находится в разделе подкачки. Обратите внимание, что части процесса могут находиться в памяти подкачки, даже когда процесс запущен. Операционная система извлечет эти области из раздела подкачки, когда процесс попытается получить к нему доступ. Это должно включать в себя кучу, стеки всех потоков и другие частные отображения. Если вы посмотрите в
/proc/<pid>/maps
,[stack]
,[heap]
и другие анонимные сопоставления (без путей к файлам) либо меняются местами, либо учитываются в резидентном размере.Общий размер: объем памяти, который может принадлежать нескольким процессам. Например, если в память загружено четыре экземпляра одного и того же приложения, у вас будет четыре экземпляра кучи и как минимум четыре стека, по одному для каждого процесса (это резидентная память), но у вас будет только один экземпляр двоичный код программы и ее библиотек. Это общее пространство. Он включает в себя не только двоичный код программы и ее библиотеки, но также файлы локализации, данные программы только для чтения, сегменты общей памяти SysV и POSIX, семафоры и т. Д. Если вы посмотрите на
/proc/<pid>/maps
Большинство отображений, связанных с библиотекой и программными файлами, являются общими.
Обратите внимание, что VIRT содержит объединение RSS и SHR и всегда будет больше, чем любой из них. Там могут быть регионы, которые учитываются как RSS и SHR.
На Джулиано отвечу:
Обратите внимание, что RSS + SHR <= VIRT, всегда.
Это просто ложь. SHR содержит всю виртуальную память, которая может использоваться другими процессами, а RSS содержит всю физическую память в оперативной памяти, которая используется процессом.
Таким образом, вся разделяемая память, находящаяся в настоящее время в ОЗУ, подсчитывается как в SHR, так и в RSS, поэтому SHR + RSS не имеет смысла, поскольку может содержать количество дубликатов.
Чтобы создать процесс с RSS + SHR > VIRT, просто отобразите большой файл (1 ГБ), а затем полностью его прочитайте: файл mmaped будет загружен в ОЗУ, а VIRT, SHR и RSS будут чуть больше 1 ГБ, поэтому SHR + RSS > VIRT.