Что такое rss память в linux

Обновлено: 08.07.2024

Управление памятью позволяет процессам перемещаться между оперативной памятью и жестким диском во время выполнения программы. Более того, этот процесс отслеживает каждую ячейку памяти для корректного выделения процессов и освобождения памяти. Физическая память — это основная память, в которой находятся выполняющиеся в данный момент программы. С другой стороны, виртуальная память увеличивает емкость основной (физической) памяти (за счет жесткого диска) для выполнения программ, размер которых превышает объемы установленной в компьютере физической памяти.

Что такое физическая память?

Запуская и исполняя программы, процессор напрямую обращается к физической памяти. Обычно программы хранятся на жестком диске. Время доступа процессора к диску значительно превышает аналогичное время доступа к физической (оперативной) памяти. Чтобы процессор мог выполнять программы быстрее, они сначала помещаются в физическую (оперативную) память. После завершения своей работы, они возвращаются обратно на жесткий диск. Освобожденная таким образом память может быть выделена новой программе. При выполнении данные программы называются процессами.

Что такое виртуальная память?

Физическая память vs. Виртуальная память

Основное различие между физической и виртуальной памятью заключается в том, что физическая память относится к оперативной памяти компьютера, подключенной непосредственно к его материнской плате. Именно в ней находятся выполняемые в данный момент программы. А виртуальная память — это метод управления, расширяющий при помощи жесткого диска объем физической памяти, благодаря чему у пользователей появляется возможность запускать программы, требование к памяти которых превышает объем установленной в компьютере физической памяти.

Физическая память Виртуальная память
Непосредственно установленная в компьютере оперативная память. Метод управления памятью, с помощью которого для программ создается иллюзия наличия в системе (физической) памяти, гораздо больше реально установленной.
Работает быстрее. Работает медленнее.
Ограничена размером чипа ОЗУ. Ограничена размером жесткого диска.
Может напрямую обращаться к процессору. Не может напрямую обращаться к процессору.
Использует swapping. Использует paging.

Рассмотрим данные пункты:

Физическая память является фактической памятью.

Виртуальная память является логической памятью.

Физическая память быстрее виртуальной памяти.

Физическая память ограничена размером чипа ОЗУ.

Виртуальная память ограничена размером жесткого диска.

Физическая (оперативная) память использует swapping. Swapping — это концепция управления памятью, при которой всякий раз, когда системе для хранения данных некоторого процесса не хватает оперативной (физической) памяти, она берет её из вторичного хранилища (например, жесткого диска), сбрасывая на него временно неиспользуемые данные. В Linux есть специальная программа управления памятью, которая управляет этим процессом. Всякий раз, когда ОЗУ не хватает памяти, программа управления памятью ищет все те неактивные блоки данных (страницы), присутствующие в ОЗУ, которые не использовались в течение длительного времени. Когда она успешно находит подобные блоки, то перемещает их в память подкачки (например, на жесткий диск). Таким образом, освобождается пространство оперативной памяти, и, следовательно, его можно использовать для некоторых других программ, которые нуждаются в срочной обработке.

Виртуальная память использует paging. Paging — это метод выделения памяти, при котором разным несмежным блокам памяти назначается фиксированный размер. Размер обычно составляет 4 КБ. Paging всегда выполняется между активными страницами (pages).

Команды для управления памятью в Linux

Давайте рассмотрим некоторые команды для управления памятью в Linux.

Файл /proc/meminfo

Файл /proc/meminfo содержит всю информацию, связанную с памятью. Для просмотра данного файла используйте команду cat:


Эта команда выводит множество параметров, связанных с памятью. Чтобы получить информацию о физической памяти из файла /proc/meminfo, используйте:

$ grep MemTotal /proc/meminfo


Чтобы получить информацию о виртуальной памяти из файла /proc/meminfo, используйте:

$ grep VmallocTotal /proc/meminfo



Команда top

Команда top позволяет отслеживать процессы и использование системных ресурсов в Linux в режиме реального времени. Когда вы запустите команду, то заметите, что значения в выходных данных продолжают изменяться с некоторым небольшим интервалом:


В верхней части отображается текущая статистика использования системных ресурсов. Нижняя часть содержит информацию о запущенных процессах. Вы можете перемещаться вверх и вниз по списку с помощью клавиш со стрелочками вверх/вниз и использовать q для выхода.

Команда free

Команда free отображает объем свободной и используемой памяти в системе.


Значения для каждого поля указаны в кибибайтах (КиБ).

Чтобы получить вывод в более удобочитаемом формате, используйте:



Команда vmstat

Команда vmstat — это инструмент мониторинга производительности в Linux, который предоставляет полезную информацию о процессах, памяти, операциях ввода-вывода, подкачке, диске и планировании процессора, а также приводит статистику виртуальной памяти вашей системы.

Что такое RSS и VSZ в управлении памятью Linux? В многопоточной среде, как можно управлять и отслеживать обе эти функции?

RSS - это размер резидентного набора, который используется, чтобы показать, сколько памяти выделено этому процессу и находится в оперативной памяти. Он не включает память, которая выгружается. Он включает в себя память из общих библиотек, пока страницы из этих библиотек фактически находятся в памяти. Он включает в себя всю память стека и кучи.

VSZ - это размер виртуальной памяти. Он включает в себя всю память, к которой может обращаться процесс, включая память, которая выгружается, память, которая выделена, но не используется, и память из общих библиотек.

Таким образом, если процесс A имеет двоичный файл размером 500 КБ и связан с 2500 КБ совместно используемых библиотек, имеет 200 КБ выделенных стеков/кучи, из которых 100 КБ фактически находится в памяти (остальная часть поменялась местами или не используется), и он фактически загрузил только 1000 КБ совместно используемых библиотек. и 400K своего двоичного файла:

Поскольку часть памяти является общей, многие процессы могут использовать ее, поэтому, если вы сложите все значения RSS, вы можете легко получить больше места, чем в вашей системе.

Память, которая выделяется, также может отсутствовать в RSS, пока она не будет фактически использована программой. Таким образом, если ваша программа выделяет кучу памяти заранее, а затем использует ее со временем, вы можете увидеть, что RSS растет, а VSZ остается прежним.

Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как пропорцию, используемую текущим процессом. Итак, если раньше было два процесса, использующих одну и ту же общую библиотеку:

Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux/unix.

Существует гораздо больше, чем это, чтобы узнать больше, проверьте следующие ссылки:

RSS - это размер резидентного набора (физически резидентная память - в настоящее время она занимает место в физической памяти машины), а VSZ - размер виртуальной памяти (выделенное адресное пространство - у него есть адреса, выделенные в карте памяти процесса, но это не обязательно фактическая память за этим все прямо сейчас).

Обратите внимание, что в наши дни обычных виртуальных машин физическая память с точки зрения машины может на самом деле не быть реальной физической памятью.

Я думаю, что много уже было сказано о RSS против VSZ. С точки зрения администратора/программиста/пользователя, когда я проектирую/кодирую приложения, меня больше беспокоит RSZ (резидентная память), поскольку, когда вы продолжаете тянуть все больше и больше переменных (в кучу), вы увидите, что это значение возрастает. Попробуйте простую программу для построения распределения памяти на основе malloc в цикле и убедитесь, что вы заполняете данные в этом пространстве malloc. RSS продолжает двигаться вверх. Что касается VSZ, то это в большей степени отображение виртуальной памяти, чем в Linux, и одна из его основных функций, вытекающих из традиционных концепций операционной системы. Управление VSZ осуществляется с помощью управления виртуальной памятью ядра, для получения дополнительной информации о VSZ см. Описание Роберта Лава в mm_struct и vm_struct, которые являются частью базовой структуры данных task_struct в ядре.

Они не управляются, но измеряются и, возможно, ограничены (см. getrlimit системный вызов, также on getrlimit (2) ).

RSS означает размер резидентного набора (часть вашего виртуального адресного пространства, расположенная в оперативной памяти).

Вы можете запросить виртуальное адресное пространство процесса 1234, используя proc (5) с cat /proc/1234/maps и его статусом (включая потребление памяти) через cat /proc/1234/status

Еще одним ресурсом, подлежащим распределению между процессами, является оперативная память. В Linux, как и во многих других современных операционных системах, для управления памятью используют механизм страничного отображения, реализуемого ядром операционной системы при помощи устройства управления памятью — W:[MMU]. При этом процессы работают с виртуальными адресами (virtual address) «воображаемой» памяти, отображаемыми устройством MMU на физические адреса (physical address) настоящей оперативной памяти.

Для отображения вся оперативная память (RAM) условно разбивается на «гранулы» — страничные кадры размером в 4 Кбайт, которые затем выделяются процессам. Таким образом, память процесса условно состоит из страниц (page), которым в специальных таблицах страниц (page table) сопоставлены выделенные страничные кадры (page frame).

При выполнении процесса преобразование его виртуальных адресов в физические выполняется устройством MMU «на лету» при помощи его. индивидуальной таблицы страниц.

Именно механизм страничного отображения позволяет эффективно распределять память между процессами путем размещения страниц процессов в произвольные свободные страничные кадры. Кроме этого, механизм страничного отображения позволяет выделять процессам память по требованию, добавляя дополнительные страницы и отображая их на свободные страничные кадры. Аналогично, ненужные процессу страницы могут быть удалены, а соответствующие страничные кадры высвобождены для использования другими процессами.

Виртуальная память

Помимо задачи распределения памяти между процессами, механизм страничного отображения используется ядром операционной системы и для решения задачи нехватки оперативной памяти. При определенных обстоятельствах имеющиеся в распоряжении свободные страничные кадры оперативной памяти могут быть исчерпаны. Одновременно с этим оказывается, что большую часть времени процессы используют лишь малую часть выделенной им памяти, а находясь в состоянии сна, не используют память вовсе.

Увеличить коэффициент полезного использования памяти позволяет еще одна простая идея — высвобождать страничные кадры при помощи выгрузки (page out) неиспользуемых страниц процессов во вторичную память (в специальную область «подкачки» SWAP, например, на диске), а при обращении к выгруженной странице — загружать (page in) ее обратно перед использованием.

За счет такого страничного обмена (paging или page swapping) организуется W:[виртуальная память], т. е. видимость большего количества (оперативной) памяти для размещения процессов, чем есть на самом деле.

В примере из листинга ниже в столбцах VSZ и RSS вывода команды ps показано потребление памяти процессами (в килобайтах). В столбце VSZ (virtual size) указывается суммарный объем всех страниц процесса (в том числе и выгруженных), а в столбце RSS (resident set size) — суммарный объем всех его страничных кадров в оперативной памяти, т. е. ее реальное потребление процессом.

Виртуальная и резидентная память процесса

Отображение файлов в память

Страничный обмен, помимо организации виртуальной памяти, имеет еще одно важнейшее применение. Именно на его основе реализуется незаменимый механизм отображения файлов в память процесса, доступный при помощи системных вызовов mmap/munmap (и дополнительных mlock, mprotect, msync, madvise и др.).

Для отображения файла в память процесса ему выделяют страницы в необходимом количестве, но не страничные кадры. Вместо этого, в таблице страниц формируются такие записи, как будто эти страницы уже были выгружены ранее в отображаемый файл.

При последующем обращении (on demand) процесса к какой-либо странице отображенной памяти, под нее выделяют страничный кадр и заполняют (read) соответствующим содержимым файла. Любые последующие изменения, сделанные процессом в отображенных страницах, сохраняются обратно (write back) в файл, если отображение выполнено «разделяемым» (shared) способом. Для страниц, отображенных «частным» (private) способом, используется принцип COW (copy-on-write), согласно которому любые попытки их изменения (write) приводят к созданию их копий (сору), куда и попадают изменения.

Таким образом, страницы отображенного файла, которые никогда не были востребованы процессом, не будут вовсе занимать оперативной памяти. Это обстоятельство широко используется для «загрузки» в процесс его программы и библиотек. В листинге ниже при помощи команды pmap показана карта (отображения файлов) памяти процесса командного интерпретатора bash.

Карта памяти процесса

$ which bash

$ readelf -l /bin/bash

$ pmap -d 26958

В память процесса интерпретатора отображен исполняемый ELF-файл его программы и ELF-файлы всех библиотек, от которых она зависит. Отображение ELF-файлов выполняется частями — сегментами (при помощи readelf можно получить их список), в зависимости от их назначения. Так, например, сегмент программного кода отображен в страницы, доступные на чтение r и выполнение x, сегмент данных отображен в страницы, доступные на чтение r и запись w, и т. д.

Более того, выделение страниц памяти по требованию в процессе работы процесса реализуется при помощи «воображаемого» отображения некоторого несуществующего, «анонимного файла» [anon] на страничные кадры. Необходимо отметить, что механизм виртуальной памяти при освобождении неиспользуемых страниц выгружает в специальную область подкачки SWAP только «анонимные» страничные кадры и «анонимизированные», полученные копированием при изменении (согласно принципу COW).

Неанонимные измененные кадры выгружаются непосредственно в соответствующие им файлы, а неизмененные освобождаются вовсе без выгрузки, т. к. уже «заранее выгружены».

В примере из листинга ниже иллюстрируются два способа выделения памяти по требованию: явный — при помощи системного вызова mmap с аргументом MAP_ANONYMOUS, и неявный (Доставшийся в наследство от классической ОС UNIX) — при помощи системного вызова brk. Явный способ позволяет выделять новые сегменты памяти процесса, тогда как неявный способ изменяет размер предопределенного «сегмента данных» процесса, позволяя увеличивать и уменьшать его по желанию, перемещая так называемый «break» — адрес конца этого сегмента.

Системные вызовы mmap/munmap и brk— выделение и высвобождение памяти

$ ldd hostname

libnsl.so.1 => /lib/i386-linux<-gnu/libnsl.so. 1 (0xb76cf000)

libc.so.6 => /llb/i386-linux-gnu/libc.so.6 (0xb7526000)

/lib/ld-linux. so.2 (0xb770a000)

$ strace hostname

mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYNOMOUS, -1, 0) = 0xb770e000

mmap2(NULL, 122191, PROT_READ, MAP_PRIVATE, 3, 0) = 0bdo76f000

mmap2(0xb76ec000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0x15) = 0xb76ec000

mmap2(0xb76ee000, 6120, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76ее000

mmap2(NULL, 1739484, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb752d000

mmap2(oxb76d0000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_DENYWRITE, 3, 0x1а3) = 0b676d0000

mmap2(0xb76d3000, 10972, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76d3000

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS,. -1, 0) = 0xb752c000

mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb752b000

mprotect(oxb76d0000, 8192, PROT_READ) = 0

mprotect(0xb76eo000, 4096, PROT_READ) = 0

mprobect(0x804b000, 4096, PROT_READ) = 0

mprotect(0xb7731000, 4096, PROT_READ) = 0

munmap(0xb76f0000, 122101) = = 0 ↑ /lib/ld-linux.so.2

brk(0) = 0x9e62000 ↓ /bin/hostname

Трасса команды hostname, показанная в листинге выше, поясняет работу загрузчика и компоновщика, (loader, ld) динамических библиотек ld-linux.

Системный вызов exec отображает для запуска в память процесса не только заданный ELF-файл /bin/hostname, но и (указанный в этом ELF-файле) загрузчик библиотек /lib/ld-linux.so.2, которому и передается управление до самой программы.

Загрузчик библиотек, в свою очередь, отображает в процесс , свой «конфигурационный» файл /etc/ld.so.cache, а затем посегментно отображает файлы всех библиотек и выделяет им требуемую дополнительную память.

Загруженные библиотеки присоединяются (линкуются или же компонуются, linking), к программе /bin/hostname, после чего страницам их отображенных сегментов назначается ©Ф соответствующий режим доступа системным вызовом mprotect. По завершении компоновки отображение конифгурационного файла /etc/ld.so.cache снимается при помощи munmap, а управление передается исходной программе.

Потребление памяти

Суммарное распределение страниц памяти по сегментам процесса можно получить при помощи третьего набора столбцов (активировав его клавишами № команды top, как показано в листинге ниже. В столбце VIRT изображается суммарный объем (в килобайтах) всех страниц процесса, а в столбце RES — объем резидентных «страниц (находящихся в страничных кадрах оперативной памяти). В столбце SWAP указывается объем всех страниц, находящихся во вторичной памяти — как «анонимных» страниц, выгруженных в специальную область подкачки, так и «файловых» страниц, возможно, никогда не загружавшихся в оперативную память.

Столбцы CODE и DATA показывают объемы (в килобайтах) памяти,, выделенной, под сегменты кода и данных, а столбец SHR — объем резидентных страниц, которые используются (или могут быть использованы) совместно с другими процессами.

Распределение памяти по назначению

Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

Cpu(s): 8.6%us, 2.4%sy, 0.0%ni, 88.6%id, 0.4%wa, 0.0%hi, 0.0%si, 0.0%si

Mem: 8192144k total, 7037720k used, 1154424k free, 238984k buffers

Swap: 4104188k total, 35376k used, 4068812k free, 4356372k cached

PID %МЕМ VIRT SWAP RES CODE DATA SHR nFLT nDRT S PR NI %CPU COMMAND

26958 0.1 10288 4936 5352 880 3852 1544 0 0 S 20 0 0 bash

Механизм отображения считывает содержимое файла в страничные кадры только один раз, вне зависимости от количества процессов, отображающих этот файл в свою память. В случае отображения одного файла разными процессами их страницы совместно отображаются на одни и те же страничные кадры, за исключением страниц, скопированных (согласно принципу COW) при изменении.

Интегральная статистика по использованию виртуальной памяти может быть получена при помощи команды free, как показано в листинге ниже.

Статистика использования памяти

$ free -m
total used free shared buffers cached
Mem: 8000 5523 2476 0 219 3430
-/+ buffers/cache: 1873 6126
Swap: 4007 17 3990

Строка Mem: содержит статистику использования оперативной памяти, а строка Swap: — статистику специальной области подкачки. В столбце total указан суммарный объем всех доступных страничных кадров, а в столбцах used и free — суммарные объемы использованных и свободных страничных кадров, соответственно.

В столбце cached указан объем страничного кэша (page cache), т. е. суммарный объем страничных кадров оперативной памяти, использованных под отображение файлов в память. Аналогично, в столбце buffers указывается объем буферного кэша, т. е. суммарный объем памяти, использованной ядром для кэширования «не-отображаемых» сущностей: метаданных файлов, дисковых блоков при прямом вводе-выводе на устройства и пр.

В столбцах used и free строки -/+ buffers/cache указываются объемы использованной и свободной памяти «за вычетом» страничного и буферного кэшей, т. е. «чистая» память, выделенная процессам по требованию под данные, сгенерированные в процессе работы.

В листинге ниже показан пример потребления памяти процессом текстового редактора vi при попытке редактирования громадного файла в 1 Гбайт. Процесс загружает файл целиком, в результате чего он целиком оказывается в резидентных страницах сегмента данных процесса, что естественным образом увеличивает «чистый» расход оперативной памяти системы. После принудительного завершения процесса при помощи команды kill память естественным образом высвобождается.

Потребление памяти процессами

pts/0

$ dd if=/dev/urandom of=big bs=4069 count=262144

262144+0 записей получено

262144+0 записей отправлено

скопировано 1073741824 байта (1,1 GВ), 148,956 с, 7,2 МВ/с

$ ls -lh big

$ free -m
total used free shared buffers cached
Mem: 8000 3947 4052 0 42 2712
-/+ buffers/cache: 1192 6807
Swap: 4007 0 4007

$ vi big

pts/1

$ ps f

PID TTY STAT TIME COMMAND
20595 pts/1 S 0:00 -bash
21087 pts/1 R+ 0:00 \_ ps f
20437 pts/0 S 0:00 -bash
21085 pts/0 Rl+ 0:08 \_ vi big

$ ps up 21685
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
fitz 21085 96.4 21.8 1826416 1786444 pts/0 Sl+ 21:14 0:18 vi big

$ free -m

total used free shared buffers cached

Mem: 8000 5687 2312 0 42 2709
-/+ buffers/cache: 2935 5065
Swap: 4007 0 4007

$ top -b -n1 -p 21085

Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

Cpu(s): 6.0%us, 5.89%sy, 0.2%ni, 83.7%id, 4.3%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 8192144k total, 5826856k used, 2365288k free, 43932k buffers

Swap: 4104188k total, 0k used, 4104188k free, 2777504k cached

PID %МЕМ VIRT SWAP RES CODE DATA SHR nFLT nDRT S PR NI %CPU COMMAND

21085 21.8 1783m 39m 1.7g 2148 1.7g 5676 0 0 S 20 0 0 vi

$ kill 21085

$ free -m

total used free shared buffers cached

Mem: 8000 3945 4054 0 42 2709
-/+ buffers/cache: 1193 6806
Swap: 4007 0 4007

Что такое RSS и VSZ в управлении памятью Linux? Как ими можно управлять и отслеживать в многопоточной среде?

6 ответы

RSS - это размер резидентного набора, который используется, чтобы показать, сколько памяти выделено этому процессу и находится в оперативной памяти. Он не включает память, которая выгружена. Он действительно включает память из разделяемых библиотек, если страницы из этих библиотек действительно находятся в памяти. Он включает всю стековую и кучную память.

VSZ - это размер виртуальной памяти. Он включает всю память, к которой процесс может получить доступ, включая память, которая выгружается, память, которая выделяется, но не используется, и память из общих библиотек.

Итак, если процесс A имеет двоичный файл 500 КБ и связан с 2500 КБ разделяемых библиотек, имеет 200 КБ распределений стека / кучи, из которых 100 КБ фактически находятся в памяти (остальная часть заменена или не используется), и он фактически загрузил только 1000 КБ разделяемых библиотек. и 400 КБ собственного двоичного файла, тогда:

Поскольку часть памяти является общей, ее могут использовать многие процессы, поэтому, если вы сложите все значения RSS, вы легко можете получить больше места, чем есть в вашей системе.

Выделенная память также может не находиться в RSS, пока она не будет фактически использована программой. Итак, если ваша программа заранее выделила кучу памяти, а затем использует ее с течением времени, вы можете увидеть, что RSS растет, а VSZ остается прежним.

Также есть PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает долю разделяемой памяти, используемую текущим процессом. Итак, если раньше было два процесса, использующих одну и ту же разделяемую библиотеку:

Все потоки используют одно и то же адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux / unix.

Есть гораздо больше, чем это, чтобы узнать больше, проверьте следующие ссылки:

Читайте также: