Используя ps, я могу видеть размер, vsize (такой же, как у VIRT вершины?) И rss (такой же, как у RES у вершины?). (Еще одна, которую я вижу сверху - это SHR.)
Может ли кто-то резюмировать для меня, что означают эти разные области?
Используя ps, я могу видеть размер, vsize (такой же, как у VIRT вершины?) И rss (такой же, как у RES у вершины?). (Еще одна, которую я вижу сверху - это SHR.)
Может ли кто-то резюмировать для меня, что означают эти разные области?
Ответы:
Короче говоря:
Виртуальный размер: это объем адресного пространства, которым управляет процесс. Виртуальное адресное пространство содержит все, к чему процесс может получить доступ через указатели (ссылки на адреса в памяти). Например, если ваша программа получает доступ к кадровому буферу вашей видеокарты, эта память сопоставляется с виртуальным пространством процесса и получает адрес, который хранится в указателе. Отображенные в память файлы и анонимные сопоставления также учитываются в размере виртуального адресного пространства. Практически все в виртуальном размере. Если вы суммируете размер всех диапазонов адресов, перечисленных в /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.