What is RSS and VSZ in Linux memory management
What are RSS and VSZ in Linux memory management? In a multithreaded environment how can both of these can be managed and tracked?
6 Answers 6
RSS is the Resident Set Size and is used to show how much memory is allocated to that process and is in RAM. It does not include memory that is swapped out. It does include memory from shared libraries as long as the pages from those libraries are actually in memory. It does include all stack and heap memory.
VSZ is the Virtual Memory Size. It includes all memory that the process can access, including memory that is swapped out, memory that is allocated, but not used, and memory that is from shared libraries.
So if process A has a 500K binary and is linked to 2500K of shared libraries, has 200K of stack/heap allocations of which 100K is actually in memory (rest is swapped or unused), and it has only actually loaded 1000K of the shared libraries and 400K of its own binary then:
Since part of the memory is shared, many processes may use it, so if you add up all of the RSS values you can easily end up with more space than your system has.
The memory that is allocated also may not be in RSS until it is actually used by the program. So if your program allocated a bunch of memory up front, then uses it over time, you could see RSS going up and VSZ staying the same.
There is also PSS (proportional set size). This is a newer measure which tracks the shared memory as a proportion used by the current process. So if there were two processes using the same shared library from before:
Threads all share the same address space, so the RSS, VSZ and PSS for each thread is identical to all of the other threads in the process. Use ps or top to view this information in linux/unix.
There is way more to it than this, to learn more check the following references:
Что такое RSS и VSZ в управлении памятью Linux
Что такое RSS и VSZ в управлении памятью Linux? В многопоточной среде, как можно управлять и отслеживать обе эти функции?
Таким образом, если процесс A имеет двоичный файл размером 500 КБ и связан с 2500 КБ совместно используемых библиотек, имеет 200 КБ выделенных стеков / кучи, из которых 100 КБ фактически находится в памяти (остальная часть поменялась местами или не используется), и он фактически загрузил только 1000 КБ совместно используемых библиотек. и 400K своего двоичного файла:
Поскольку часть памяти является общей, многие процессы могут использовать ее, поэтому, если вы сложите все значения RSS, вы легко сможете получить больше места, чем в вашей системе.
Память, которая выделяется, также может отсутствовать в RSS, пока она не будет фактически использована программой. Поэтому, если ваша программа выделяет кучу памяти заранее, а затем использует ее со временем, вы можете увидеть, что RSS растет, а VSZ остается прежним.
Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как пропорцию, используемую текущим процессом. Так что, если раньше было два процесса, использующих одну и ту же общую библиотеку:
Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux / unix.
Существует гораздо больше, чем это, чтобы узнать больше, проверьте следующие ссылки:
Что такое RSS и VSZ в управлении памятью Linux
Что такое RSS и VSZ в управлении памятью Linux? В многопоточной среде, как можно управлять и отслеживать обе эти функции?
Таким образом, если процесс A имеет двоичный файл размером 500 КБ и связан с 2500 КБ совместно используемых библиотек, имеет 200 КБ выделенных стеков/кучи, из которых 100 КБ фактически находится в памяти (остальная часть поменялась местами или не используется), и он фактически загрузил только 1000 КБ совместно используемых библиотек. и 400K своего двоичного файла:
Поскольку часть памяти является общей, многие процессы могут использовать ее, поэтому, если вы сложите все значения RSS, вы можете легко получить больше места, чем в вашей системе.
Память, которая выделяется, также может отсутствовать в RSS, пока она не будет фактически использована программой. Таким образом, если ваша программа выделяет кучу памяти заранее, а затем использует ее со временем, вы можете увидеть, что RSS растет, а VSZ остается прежним.
Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как пропорцию, используемую текущим процессом. Итак, если раньше было два процесса, использующих одну и ту же общую библиотеку:
Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux/unix.
Существует гораздо больше, чем это, чтобы узнать больше, проверьте следующие ссылки:
Обратите внимание, что в наши дни обычных виртуальных машин физическая память с точки зрения машины может на самом деле не быть реальной физической памятью.
Я думаю, что много уже было сказано о 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
Что такое RSS и VSZ в управлении памятью Linux
Что такое RSS и VSZ в управлении памятью Linux? В многопоточной среде, как можно управлять и отслеживать оба из них?
ОТВЕТЫ
Ответ 1
Таким образом, если процесс A имеет двоичный файл размером 500 КБ и связан с 2500 КБ совместно используемых библиотек, имеет 200 КБ выделенных стеков/кучи, из которых 100 КБ фактически находятся в памяти (остальная часть поменялась местами или не используется), и он фактически загрузил только 1000 КБ совместно используемых библиотек. и 400K своего двоичного файла:
Поскольку часть памяти является общей, многие процессы могут использовать ее, поэтому, если вы сложите все значения RSS, у вас может легко оказаться больше места, чем в вашей системе.
Память, которая выделяется, также может отсутствовать в RSS, пока она не будет фактически использована программой. Таким образом, если ваша программа выделяет кучу памяти заранее, а затем использует ее со временем, вы можете увидеть, что RSS растет, а VSZ остается прежним.
Существует также PSS (пропорциональный размер набора). Это более новая мера, которая отслеживает общую память как пропорцию, используемую текущим процессом. Итак, если раньше было два процесса, использующих одну и ту же общую библиотеку:
Все потоки имеют одинаковое адресное пространство, поэтому RSS, VSZ и PSS для каждого потока идентичны всем другим потокам в процессе. Используйте ps или top для просмотра этой информации в linux/unix.
Это намного больше, чем это, чтобы узнать больше, проверьте следующие ссылки:
Ответ 2
Обратите внимание, что в эти дни обычных виртуальных машин физическая память с точки зрения компьютера может быть не реальной физической памятью.
Ответ 3
Я думаю, много уже сказано, о RSS против VSZ. С точки зрения администратора/программиста/пользователя, когда я разрабатываю/кодирует приложения, меня больше беспокоит RSZ (память резидента), так как когда вы продолжаете тянуть все больше и больше переменных (нагроможденных), вы увидите это значение, стреляющее вверх. Попробуйте простую программу для построения распределения пространства на основе malloc в цикле и убедитесь, что вы заполняете данные в этом пространстве malloc’d. RSS продолжает двигаться вверх. Что касается VSZ, то это скорее виртуальное отображение памяти, которое делает linux, и одна из его основных функций, полученных из обычных концепций операционной системы. Управление VSZ выполняется с помощью управления виртуальной памятью ядра, для получения дополнительной информации о VSZ см. Описание Роберта Лава на mm_struct и vm_struct, которые являются частью основной структуры данных task_struct в ядре.
Ответ 4
Пример минимального запуска
Чтобы это имело смысл, вы должны понимать основы пейджинга: Как работает пейджинг на x86? и, в частности, чтобы ОС могла распределять виртуальную память через таблицы страниц/ведение внутренней памяти (виртуальная память VSZ) ) до того, как на самом деле будет резервное хранилище в ОЗУ или на диске (резидентная память RSS).
Теперь, чтобы увидеть это в действии, давайте создадим программу, которая:
Скомпилируйте и запустите:
Журналы убийцы OOM
Наши команды dmesg показали журналы убийцы OOM.
Точная интерпретация этих вопросов была задана по адресу:
Самая первая строка журнала была:
Итак, мы видим, что интересно, что демон MongoDB всегда работал на моем ноутбуке в фоновом режиме, который первым запускал убийцу OOM, предположительно, когда бедняга пытался выделить немного памяти.
Однако убийца ООМ не обязательно убивает того, кто его разбудил.
После вызова ядро печатает таблицу или процессы, включая oom_score :
и далее мы видим, что наш маленький main.out действительно был убит при предыдущем вызове:
Также интересно то, что все, по-видимому, произошло так быстро, что до учета освобожденной памяти процесс oom снова был пробужден процессом DeadlineMonitor :
и на этот раз это убило какой-то процесс Chromium, который, как правило, является обычным занятием памяти моего компьютера:
Протестировано в Ubuntu 19.04, ядро Linux 5.0.0.
Ответ 5
Они не управляются, но измеряются и, возможно, ограничены (см. getrlimit системный вызов, также в getrlimit (2)).
RSS означает размер резидентного набора (часть вашего виртуального адресного пространства, расположенная в оперативной памяти).
Вы можете запросить виртуальное адресное пространство процесса 1234 с помощью proc (5) с cat /proc/1234/maps и его состоянием (включая потребление памяти) через cat /proc/1234/status
Перевыделение памяти в Linux и admin_reserve_kbytes
Кому сложно понять что такое перевыделение памяти, то для сравнения можно привести пример с продажей билетов, скажем в кино. К примеру, в кинотеатре всего 100 мест, а мы продали 1000 в надежде, что не все купившие билеты дойдут до кинотеатра и востребуют свои места. Но, » сталося не так як гадалося «:
Дабы подобного беспредела не происходило на Linux сервере мы обязательно должны ограничить рамки перевыделения памяти, что дополнительно избавит от необходимости тратить ресурсы на эвристику, например:
Обычно, относительно «вменяемые» приложения при запуске запрашивают не более чем в 3 раза больше памяти, чем им реально требуется, а значит vm.overcommit_ratio=300 должно быть вполне достаточно в большинстве случаев. При таком раскладе будет доступно оперативки: РАМ * (overcommit_ratio/100) + SWAP. Скажем, у нас РАМ 2048 МБ и СВОП 5120, тогда получим: 2048 * 3 + 5120 = 11264 МБ около того.
vm.overcommit_memory=2 совместно с vm.overcommit_ratio=300 определяет границы реальных возможностей системы виртуальной памяти, а OOM killer (OOM: out-of-memory) в свою очередь прибивая пизданутые процессы и/или их чилдов помогает остальным процессам пребывать в равновесии с системными ресурсами.
При vm.overcommit_memory=1 система считает, что в наличии неограниченное количество памяти и выделяет её без ограничений до тех пор пока она вся реально не закончится.
VSZ and RSS Linux memory
man admin_reserve_kbytes
The amount of free memory in the system that should be reserved for users with the capability cap_sys_admin.
admin_reserve_kbytes defaults to min(3% of free pages, 8MB)
That should provide enough for the admin to log in and kill a process, if necessary, under the default overcommit ‘guess’ mode.
Systems running under overcommit ‘never’ should increase this to account for the full Virtual Memory Size of programs used to recover. Otherwise, root may not be able to log in to recover the system.
How do you calculate a minimum useful reserve?
sshd or login + bash (or some other shell) + top (or ps, kill, etc.)
For overcommit ‘guess’, we can sum resident set sizes (RSS). On x86_64 this is about 8MB.
For overcommit ‘never’, we can take the max of their virtual sizes (VSZ) and add the sum of their RSS. On x86_64 this is about 128MB.
Changing this takes effect whenever an application requests memory.
Что такое cap_sys_admin и с чем его едят
Отобразить список процессов и назначенный им список capabilities-флагов можно с помощью pscap из пакета libcap-ng-utils :
Как распределяется admin_reserve_kbytes
Ответ: а хрен его знает, документация по данному флагу об этом умалчивает.
Давайте «погульчитаем» документацию по admin_reserve_kbytes где говорится, что:
Замечено, что на процессы запускаемые от root-a через systemd эта самая зарезервированная в размере admin_reserve_kbytes оперативка не выделяется, а просто себе болтается без дела, и в этом можно убедится опытным путём.
Опыт №1
Только после полного отключения блокировщика скриптов и рекламы на этом месте появится полезная подсказка/ссылка/код/пример конфигурации/etc!
Запустив скрипт получим сумму значений VmSize и VmRSS всех процессов выданных прогой pscap :
Из результата видим, что рекомендуемое значение для admin_reserve_kbytes основанное на «VSZ + RSS» в данном случае составило 2166444 kB.
Увы, документация не уточняет какая именно » amount of free memory » резервируется параметром admin_reserve_kbytes = это от суммы СВОПа+РАМы или от одной РАМы? Вероятнее всего, от суммы СВОПа+РАМы.
Потому, как все системные процессы из списка pscap уже запросили память при запуске и она была им выделена, то в условиях:
Опыт №2
Однако, запуская все те же процессы, что были до перезагрузки, среди которых был и браузер palemoon :
На значении чуть выше 8128504 кб браузер был «забит» и перед смертью выдал » fork(): Невозможно выделить память «. Аналогичный результат можно получить при попытке запуска хрона:
Итоги опытов
В итоге опытным путём мы убедились, что на процессы запускаемые от имени root через systemd зарезервированная память из admin_reserve_kbytes не выделяется, а просто себе болтается без дела как до, так и после перезагрузки.
Вероятно выделение памяти из admin_reserve_kbytes для пользователей с флагом cap_sys_admin происходит при интерактивном взаимодействии с машиной, например при авторизации по SSH/SU и т.п.
Как дать пользователю возможности cap_sys_admin
cap_sys_admin для su-пользователей CentOS 6/7
Значение для admin_reserve_kbytes
Значение admin_reserve_kbytes по-умолчанию
Вот, пожалуйста, не у одного меня возник подобный вопрос на данную тему:
На машине с Debian Stretch где » MemTotal: 250400 kB » и vm.overcommit_memory = 0 составило vm.admin_reserve_kbytes = 7616
Однако на другой машине с той же ОС Debian Stretch где » MemTotal: 5083092 kB » и vm.overcommit_memory = 0 составило vm.admin_reserve_kbytes = 8192
Таким образом, admin_reserve_kbytes:
Оптимальное значение для admin_reserve_kbytes
OOM killer
Немного про OOM killer (OOM: out-of-memory).
This enables or disables killing the OOM-triggering task in out-of-memory situations.
If this is set to zero, the OOM killer will scan through the entire tasklist and select a task based on heuristics to kill. This normally selects a rogue memory-hogging task that frees up a large amount of memory when killed.
If this is set to non-zero, the OOM killer simply kills the task that triggered the out-of-memory condition. This avoids the expensive tasklist scan.
If panic_on_oom is selected, it takes precedence over whatever value is used in oom_kill_allocating_task.
The default value is 0.
Если это значение равно нулю, убийца OOM просканирует весь список задач и выберет задачу для уничтожения на основе эвристики. Обычно он выбирает задачу, которая при уничтожении освободит больше всего памяти.
Если для этого параметра установлено ненулевое значение, убийца OOM просто завершает задачу, которая вызвала состояние нехватки памяти. Это позволяет избежать дорогостоящего сканирования списка задач.
Рекомендуемый контент
А тут же ж мог быть рекомендуемый контент от гугла 
Вы не любите рекламу!? Напрасно!:) На нашем сайте она вовсе ненавязчивая, а потому для нашего сайта можете полностью отключить AdBlock (uBlock/uBlock Origin/NoScript) и прочие блокировщики рекламы! AdBlock/uBlock может препятствовать нормальной работе системы поиска по сайту, отображению рекомендуемого контента и прочих сервисов Google. Рекомендуем полностью отключить блокировщик рекламы и скриптов, а также разрешить фреймы (aka iframe).
