Используя ps, я могу увидеть размер, vsize (такой же, как у top VIRT?) И rss (такой же, как у top 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, просто mmap большой файл (1 ГБ), затем прочтите его полностью: файл с mmaped будет загружен в ОЗУ, а VIRT, SHR и RSS каждый будет немного больше 1 ГБ, поэтому SHR + RSS> ВИРТ.