Что такое RSS и VSZ в управлении памятью Linux
Что такое RSS и VSZ в управлении памятью Linux? В многопоточной среде, как можно управлять и отслеживать оба из них?
tuban 24 окт. 2011, в 21:21
Поделиться
возможная копия Понимания логов Linux oom-killer
msangel 17 окт. 2013, в 22:21
Поделиться:
4 ответа
RSS — это размер резидентного набора и используется, чтобы показать, сколько памяти выделено для этого процесса и находится в ОЗУ. Он не включает в себя замененную память. Он включает в себя память из разделяемых библиотек, пока страницы из этих библиотек фактически хранятся в памяти. Он включает в себя всю стек и кучу памяти.
VSZ — это размер виртуальной памяти. Он включает в себя всю память, доступ к которой может получить процесс, включая заменяемую память и память из разделяемых библиотек.
Итак, если процесс A имеет 500K двоичный файл и связан с 2500K разделяемых библиотек, имеет 200K распределений стека/кучи, из которых 100K фактически находится в памяти (остальная часть заменена), и только на самом деле загрузила 1000K разделяемых библиотек и 400K собственного двоичного файла:
RSS: 400K + 1000K + 100K = 1500K VSZ: 500K + 2500K + 200K = 3200K
Поскольку часть памяти является общей, многие процессы могут ее использовать, поэтому, если вы добавите все значения RSS, вы можете легко получить больше места, чем ваша система.
Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как долю, используемую текущим процессом. Итак, если раньше было два процесса с использованием одной и той же разделяемой библиотеки:
PSS: 400K + (1000K/2) + 100K = 400K + 500K + 100K = 1000K
Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам процесса. Используйте ps или top для просмотра этой информации в linux/unix.
Для этого есть больше возможностей, чтобы узнать больше о следующих ссылках:
- http://manpages.ubuntu.com/manpages/en/man1/ps.1.html
- https://web.archive.org/web/20120520221529/http://emilics.com/blog/article/mconsumption.html
jmh 10 янв. 2014, в 17:07
Поделиться
Я считаю, что RSS включает в себя память из динамически связанных библиотек. Если есть 3 процесса, использующих libxml2.so , общая библиотека будет учитываться в каждом из их RSS, поэтому сумма их RSS будет больше, чем фактическая используемая память.
nfm 30 апр. 2014, в 00:30
Это правильно. Я исправил свой ответ, спасибо за заголовки.
jmh 30 апр. 2014, в 16:08
Я на Ubuntu 16.04, и есть процесс Java, имеет 1.2G RES и 4.5G VIRT, показанные из top команды. Эта система не имеет подкачки, swapon —show ничего не возвращает. Как вы это объясните? Если vsz — это swap + разделяемые библиотеки, то в этом случае общие библиотеки превышают 3.3G? Является ли это возможным? Просто очень запутался .
Aaron Wang 22 июнь 2017, в 13:42
Я не совсем уверен. Посмотрите на этот ответ об использовании виртуальной памяти Java: stackoverflow.com/a/561450/622115 . Короткая версия: VSZ может включать пространство кучи, которое выделено и не используется, а также файлы, отображаемые в память.
jmh 28 июнь 2017, в 16:38
Отлично. Просто добавь что-нибудь. если вы используете malloc (100 КБ), то на самом деле используйте только 1 КБ. Значение rss равно 1 Кб, а vsz равно 100 Кб, даже если здесь нет свопа.
keniee van 25 фев. 2018, в 02:31
Да, это хороший момент. Я могу добавить, что память, которая является неправильной, но еще не использованной, будет отображаться так.
jmh 27 март 2018, в 23:39
Есть ли команда для возврата PSS процесса?
Roman Gaufman 11 май 2018, в 20:25
Показать ещё 5 комментариев
RSS — это размер резидентного набора (физически резидентная память — это в настоящее время занимает пространство в физической памяти аппарата), а VSZ — размер виртуальной памяти (выделено адресное пространство — это адреса, выделенные на карте памяти процесса, t обязательно любая фактическая память за всем этим прямо сейчас).
Обратите внимание, что в эти дни обычных виртуальных машин физическая память с точки зрения компьютера может быть не реальной физической памятью.
caf 25 окт. 2011, в 11:56
Поделиться
Имейте в виду, предоставляя больше информации, чем то, что аббревиатура означает?
Pithikos 04 окт. 2016, в 18:12
Я думаю, много уже сказано, о RSS против VSZ. С точки зрения администратора/программиста/пользователя, когда я разрабатываю/кодирует приложения, меня больше беспокоит RSZ (память резидента), так как когда вы продолжаете тянуть все больше и больше переменных (нагроможденных), вы увидите это значение, стреляющее вверх. Попробуйте простую программу для построения распределения пространства на основе malloc в цикле и убедитесь, что вы заполняете данные в этом пространстве malloc’d. RSS продолжает двигаться вверх. Что касается VSZ, то это скорее виртуальное отображение памяти, которое делает linux, и одна из его основных функций, полученных из обычных концепций операционной системы. Управление VSZ выполняется с помощью управления виртуальной памятью ядра, для получения дополнительной информации о VSZ см. Описание Роберта Лава на mm_struct и vm_struct, которые являются частью основной структуры данных task_struct в ядре.
Anugraha Sinha 02 авг. 2015, в 15:57
Поделиться
Они не управляются, а измеряются и, возможно, ограничены (см. getrlimit системные вызовы).
Basile Starynkevitch 24 окт. 2011, в 20:32
Поделиться
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы. — Из обзора
Maak 01 март 2018, в 01:52
Я предоставил вторую ссылку. Один из них останется в силе
Basile Starynkevitch 01 март 2018, в 06:08
Ещё вопросы
- 1 Приложение магазина C #, получающее переменные данные Json
- 1 Средние данные с одинаковым ключом в массиве словаря
- 0 Добавить параметр в locationChangeStart
- 1 Python, построить три графика в plt.subplots (2,2)?
- 1 Клонировать массив с оператором распространения и добавить встроенный
- 0 JQuery: добавить обработчик подтверждения с функциями привязки / включения и триггера
- 0 Javascript, как мне создать массив дат?
- 1 Строковый параметр слишком длинный. извлечение данных из базы данных в шаблон слова
- 0 Как я могу перенаправить с нового URL на предыдущий URL в веб-просмотре, используя angularjs?
- 0 Sublime Text 2: завершение HTML-тега не работает, и я не могу его отключить
- 0 Необработанное исключение, не похоже, что что-то не так
- 0 Наименование Conseqences в браузере
- 0 Возврат через все функции
- 0 как удалить разрыв строки между тегом span в HTML
- 0 Изменить цвет метки на активном поле ввода
- 0 in_array, похоже, не работает с массивами
- 1 Изменение формы массива Python определенным образом
- 0 Вложенные элементы div не расположены должным образом
- 0 JQuery выделяет элемент меню изображением, когда пользователь выбирает его и меняет цвет фона при наведении
- 0 Конвертировать плоский массив PHP в многомерный массив
- 1 Передача текста и значения в ComboBox
- 1 Потоки для медленных операций в приложении MVC
- 1 Как просмотреть HTML-файл в частичном представлении ASP.NET MVC (не Razor)
- 1 Разрешение службы ServiceStack и определение типа контента
- 0 Анимированный заголовок с jquery на пользовательской прокрутке
- 0 Избегание случайных указателей в условиях, включающих AND
- 0 Слияние сложных массивов
- 1 Самый простой метод для анализа сетевой активности
- 0 Программа останавливается при вызове конструктора, c ++
- 1 Могу ли я отформатировать тип данных TIME на JavaDB?
- 0 Вызов href из JavaScript
- 1 SmartGWT ScrollBar отсутствует при использовании SectionStack в Window
- 1 Секунда весны: перехватить URL-адрес легко обойти?
- 0 использование CSS-перехода при опрокидывании другого элемента
- 1 Создать именованный кортеж из подмножества ключей dict [duplicate]
- 1 Сравнение файлов — содержимое может быть неупорядоченным
- 0 jQuery — конфликт фантазии
- 1 ModuleNotFoundError, пока пакет уже установлен
- 1 Элемент [control_name] не является известным элементом. Это может произойти, если на веб-сайте произошла ошибка компиляции или отсутствует файл web.config
- 0 Как создать ассоциативный массив php из грязных данных
- 0 C ++ Редактирование текстового файла
- 1 Звук не играет ожидаемое количество раз
- 0 Встроенный диалог в Tab Control не может работать во втором диалоге, MFC
- 1 Установка переменных среды в WinDbg
- 0 Доступ к элементам HTML Parent, Child, Sibling в Angular JS
- 1 Как нанести несколько второстепенных сюжетов на фоновое изображение с помощью matplotlib?
- 0 SQL-запрос для определения всех изображений в узлах?
- 0 о сравнении чисел с плавающей точкой в C ++
- 0 Отключение выбора, когда флажок установлен
- 0 Как напечатать значение указателей, указывающих на тип класса c ++
Sysadminium
В этой статье будет рассмотрена общая информация о том, как в Linux используется оперативная память. Разберём основные моменты и термины.
Оглавление скрыть
Общая информация
Вся оперативная память в системе Linux делится на страницы. Страница — это минимальная единица памяти, с которой происходит работа. По размеру страницы разделяются на:
Помимо страниц память делится на зоны:
- DMA — эта зона занимает 16MB;
- DMA32 — эта зона занимает 4 GB и существует только на 64-разрядных системах;
- Normal — вся остальная память.
Зоны DMA и DMA32 содержат страницы, которые совместимы с режимом DMA. Режим DMA (direct memory access) — это прямой доступ к памяти со стороны периферийного устройства без участия процессора. Если оборудование работает с памятью в режиме DMA, то оно занимает память из этой зоны и не может брать страницы из зоны Normal.
В оперативной памяти хранятся:
- данные ядра;
- данные процессов;
- файлы, которые были прочитаны с жесткого диска или записаны на него.
За выделение оперативной памяти отвечает ядро Linux.
Виртуальная и резидентная память
Выделяемая память процессу может быть либо резидентная, либо виртуальная. В листинге ниже видно у процессов резидентную (rss) и виртуальную память (vsz). Эта память отображается в KB.
$ ps -C apache2 -o pid,user,rss,vsz,comm PID USER RSS VSZ COMMAND 403 root 7316 11188 apache2 405 www-data 7032 1216200 apache2 406 www-data 11128 1216200 apache2
Виртуальная память (VSZ) — это память которую выделили процессу, но не факт что он успел в эту память что-то записать.
Резидентная память (RSS) — это память которую процесс занял, то есть что-то сохранил в виртуальную память. Именно резидентная память показывает сколько процесс потребляет физической памяти.
Приложение может запросить много памяти, а использовать малую её часть. Поэтому почти всегда rss меньше чем vsz.
Раздел или файл подкачки
Раздел подкачки (SWAP) — это раздел на жестком диске, куда помещаются:
- редко используемые данные из резидентной памяти;
- любые данные при нехватки физической памяти.
Если какие-то данные из rss сбрасываются в swap то rss освобождается, а vsz нет. От сюда следует что данные процесса, которые лежат в swap, входят в виртуальную память этого процесса.
Linux умеет работать не только с разделом подкачки, но и с файлом подкачки. То есть данные из резидентной памяти могут сбрасываться в специальный файл, который лежит на жёстком диске.
И файл и раздел подкачки имеет тот же самый формат что и оперативная память. То есть данные в оперативной памяти хранятся в виде страниц, и в подкачку сбрасываются в виде таких же страниц.
Память процессов
Посмотреть более подробно на используемую память процесса поможет файл /proc//status. Из предыдущего листинга видно что процесс с номером pid=406 занимает 11128 KB памяти.
$ grep Rss /proc/406/status RssAnon: 8328 kB RssFile: 2736 kB RssShmem: 64 kB
- RssAnon — rss не сопоставляемая с каким-нибудь файлом на диске;
- RssFile — rss сопоставляемая с каким-нибудь файлом на диске;
- RssShmem — rss разделяемая память, которая может использоваться другими процессами (Shared Memory);
В этом же файле можно посмотреть на виртуальную память:
$ grep Vm /proc/406/status VmPeak: 1281736 kB VmSize: 1216200 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 11128 kB VmRSS: 11128 kB VmData: 225044 kB VmStk: 132 kB VmExe: 316 kB VmLib: 5024 kB VmPTE: 240 kB VmSwap: 0 kB
- VmPeak — пиковый размер использования виртуально памяти;
- VmSize — размер виртуальной памяти в данный момент;
- VmHWM — пиковый размер использования резидентной памяти;
- VmRSS — размер резидентной памяти в данный момент;
- VmExe — код приложения;
- VmLib — используемые библиотеки;
- VmSwap — часть данных сброшенная на раздел подкачки.
Когда память выделяется процессу то обычно выделяется не одна страница памяти, а какой-то блок. Такой блок страниц памяти называется virtual memory area (VMA). Такой группе сразу назначаются права:
- r — можно читать данные из памяти;
- w — можно записывать данные в памяти;
- e — можно выполнять исполняемые файлы.
Также группе назначаются и друге параметры, например:
- p — приватная память для данного процесса;
- s — общая память (shared memory).
Страничный кеш
Больше всего в системе память занимает страничный кеш (Page Cache). Вся работа с файлами на диске (запись или чтение) идет через Page Cache. Запись в linux всегда быстрее чтения, так как запись вначале идет в Page Cache, а затем сбрасывается на диск. А при чтении ядро ищет файл в Page Cache, и если не находит читает файл с диска. Узнать сколько сейчас система тратит памяти на Page Cache можно выполнив команду free:
$ free -h total used free shared buff/cache available Mem: 976Mi 74Mi 764Mi 0,0Ki 137Mi 765Mi Swap: 974Mi 0B 974Mi
Страничный кеш показан в колонке buff/cache. Как мы видим у нас занято 137MB страничным кешем. Хотя тут не только Page Cache, тут также находится Buffer, который тоже связан с файлами на диске.
Посмотреть информацию по Page Cache и Buffer отдельно можно в файле /proc/meminfo:
$ egrep "^Cach|^Buff" /proc/meminfo Buffers: 16012 kB Cached: 101220 kB
При создании нового файла, запись идет в cache, а страницы памяти для этого файла помечаются как грязные (dirty). Раз в какой-то промежуток времени грязные страницы сбрасываются на диск, и если таких страниц будет слишком много, то они тоже сбросятся на диск. Управлять этим можно через параметры sysctl ( $ sudo nano /etc/sysctl.conf ):
- vm.dirty_expire_centisecs — интервал сброса грязных страниц на диск в сотых долях секунд (100 = 1с);
- vm.dirty_ratio — объем оперативной памяти в процентах который может быть выделен под Page Cache.
$ sudo sysctl vm.dirty_expire_centisecs vm.dirty_expire_centisecs = 3000 $ sudo sysctl vm.dirty_ratio vm.dirty_ratio = 20
Существует утилита — vmtouch, она может показать какой процент указанного файла находится в страничном кеше. Но её нужно скачивать из git и устанавливать:
$ sudo apt update $ sudo apt install git make gcc $ git clone https://github.com/hoytech/vmtouch.git $ cd vmtouch $ make $ sudo make install $ vmtouch /etc/passwd Files: 1 Directories: 0 Resident Pages: 1/1 4K/4K 100% Elapsed: 6.3e-05 seconds
Видно что весь файл /etc/passwd сейчас находится в Page Cache (Resident Pages).
Узнать объем грязных страниц можно из файла /proc/meminfo. А команда sync записывает грязные страницы на диск:
$ grep Dirty /proc/meminfo Dirty: 24 kB # sync $ grep Dirty /proc/meminfo Dirty: 0 kB
HugePages
Поговорим немного про большие страницы HugePages. Особенности таких страниц:
- размер таких страниц равен 2MB;
- приложение должно уметь работать с такими страницами;
- эти страницы никогда не сбрасываются в swap.
Выделить под HugePages страницы можно параметром sysctl:
- vm.nr_hugepages = (так если указать 1024 то выделится 1024*2МБ=2048MB).
- vm.hugetlb_shm_group = — только члены этой группы могут использовать HugePages.
После исправления /etc/sysctl.conf нужно перезагрузиться и посмотреть на результат в файле /proc/meminfo:
$ egrep "HugePages_T|HugePages_F" /proc/meminfo HugePages_Total: 1024 HugePages_Free: 1024
Выделено 1024 страниц и все они свободны. При этом у нас 2GB памяти не сможет использоваться обычными приложениями, которые не умеют работать с HugePages. Поэтому не всегда нужно выделять HugePages.
Итог
Вот мы и узнали как в Linux используется оперативная память. Оперативная память разбивается на страницы по 4KB, а при определенных настройках можно выделить большие страницы (2MB), которые называются HugePages. Ещё оперативная память в Linux разбивается на зоны: DMA, DMA32, Normal.
В оперативной памяти хранятся данные пользовательских процессов, данные ядра и файлы которые дублируются с диска.
Память которая выделяется процессам может быть виртуальная (vsz) или резидентная (rss). При этом память выделяется блоками страниц, которые называются virtual memory area (VMA). И этому блоку назначаются определенные атрибуты.
Есть раздел подкачки, куда сбрасывается резидентная память при необходимости.
Работа с файлами на диске также идет через оперативную память, для этого выделяется Cache и Buffer. Страницы которые изменились в памяти но не изменились на диске помечаются грязными (Dirty). Грязные страницы записываются на диск по расписанию или утилитой sync.
Файлы для исследование памяти:
Утилиты для исследования памяти:
Настраивать работу с памятью можно через параметры sysctl (/etc/sysctl.conf):
- vm.dirty_expire_centisecs — интервал сброса грязных страниц;
- vm.dirty_ratio — объем оперативной памяти в процентах который может быть выделен под Page Cache;
- vm.nr_hugepages — число больших страниц, которые нужно выделить;
- vm.hugetlb_shm_group — группа, члены которой могут работать с большими страницами.
вывод ps — разница между использованием памяти VSZ и RSS
Команда ps в системах Linux — это утилита командной строки по умолчанию, которая может дать нам представление о процессах, которые выполняются в данный момент. Он может дать нам много полезной информации об этих процессах, включая их PID (идентификатор процесса), TTY, пользователя, запускающего команду или приложение, и многое другое.
В выводе команды ps есть два столбца, о которых мало кто говорит. Это столбцы VSZ (размер виртуальной памяти) и RSS (размер постоянного набора). Оба столбца дают нам информацию о том, сколько памяти использует процесс. В этом руководстве мы рассмотрим их значение и то, как интерпретировать данные, которые они показывают нам в команде ps в Linux.
В этом уроке вы узнаете:
- Как интерпретировать номера VSZ и RSS в выводе команды ps
Столбцы VSZ и RSS в выводе команды ps
ВСЗ и РСС
Столбцы VSZ и RSS появляются в выводе команды ps , как показано на снимке экрана ниже. Значения отображаются в килобайтах для каждого процесса, запущенного в системе.
Столбцы VSZ и RSS в выводе команды ps
VSZ — размер виртуальной памяти. Это размер памяти, который Linux выделил процессу, но это не обязательно означает, что процесс использует всю эту память. Например, многие приложения имеют функции для выполнения определенных задач, но могут не загружать их в память до тех пор, пока они не потребуются. Linux использует подкачку по запросу, которая загружает страницы в память только после того, как приложение попытается их использовать.
Размер VSZ, который вы видите, учел все эти страницы, но это не означает, что они были загружены в физическую память. Поэтому размер VSZ обычно не является точным показателем того, сколько памяти использует процесс, а скорее указывает на максимальный объем памяти, который процесс может использовать, если он загружает все свои функции и библиотеки в физическую память.
RSS – это размер резидентного набора. Это размер памяти, который процесс в настоящий момент использует для загрузки всех своих страниц. На первый взгляд может показаться, что номер RSS — это реальный объем физической памяти, которую использует системный процесс. Однако общие библиотеки подсчитываются для каждого процесса, что делает отчет об использовании физической памяти менее точным.
Вот пример. Если в вашей системе Linux есть две программы для редактирования изображений, они, вероятно, используют многие из одних и тех же библиотек обработки изображений. Если открыть одно из приложений, в оперативную память загрузится необходимая библиотека. Когда вы открываете второе приложение, оно не загружает дублирующую копию библиотеки в оперативную память и просто использует ту же копию, которую использует первое приложение. Для обоих приложений столбец RSS будет учитывать размер общей библиотеки, даже если она была загружена только один раз. Это означает, что размер RSS часто является завышенной оценкой объема физической памяти, фактически используемой процессом.
Если вы пытаетесь отслеживать использование памяти в вашей системе Linux, есть более точные методы, чем числа RSS и VSZ. Эти столбцы удобны для определенных целей, но не тогда, когда вам просто нужна простая разбивка использования памяти в вашей системе. См. наше руководство о том, как отслеживать использование оперативной памяти в Linux, чтобы узнать, как лучше это сделать.
Заключительные мысли
В этом руководстве мы узнали о столбцах VSZ и RSS из выходных данных команды ps . Обе эти колонки вызывают путаницу у новичков, и их нелегко объяснить без помощи примеров. Они предлагают нам важные измерения того, сколько памяти использует процесс, но не всегда точны в отношении того, сколько физической памяти используется в данный момент. Для этого мы предлагаем лучшие предложения в другом нашем руководстве.