Этот вопрос освещен здесь очень подробно.
Как вы измеряете использование памяти приложением или процессом в Linux?
Из блога статьи Понимание использования памяти в Linux , ps
не является точным инструментом для использования для этого намерения.
Почему
ps
"неправильно"В зависимости от того, как вы на это смотрите,
ps
не сообщается о реальном использовании памяти процессами. На самом деле он показывает, сколько реальной памяти занимал бы каждый процесс, если бы он был единственным запущенным процессом . Конечно, на типичном компьютере с Linux в каждый момент времени выполняется несколько десятков процессов, а это означает, что сообщаемые номера VSZ и RSSps
почти наверняка неверны .
ps
это даже не показывает - он показывает номера виртуальной и резидентной памяти, где виртуальный - это максимальный объем памяти, который процесс теоретически мог бы использовать, это был единственный процесс (никогда), использовавший каждую отдельную страницу, которую он выделил (никогда не бывает) и не отображать и не отображать какие-либо страницы (маловероятно). Пока резидент показывает, сколько виртуальной памяти сейчас сопоставлено с физической.virt > usage > res
Однако, как правило, в 64-битной системеvirt ~= res*10
это очень широкий диапазон.Ответы:
С помощью
ps
подобных инструментов вы получите только количество страниц памяти, выделенных этим процессом. Этот номер правильный, но:не отражает фактический объем памяти, используемой приложением, только объем памяти, зарезервированный для него
может вводить в заблуждение, если страницы совместно используются, например, несколькими потоками или с использованием динамически связанных библиотек
Если вы действительно хотите знать, какой объем памяти фактически использует ваше приложение, вам нужно запустить его в профилировщике. Например,
valgrind
может дать вам представление об объеме используемой памяти и, что более важно, о возможных утечках памяти в вашей программе. Инструмент профилирования кучи Valgrind называется «массив»:Как объясняется в документации по valgrind , вам нужно запустить программу через valgrind:
Massif записывает дамп снимков использования памяти (например
massif.out.12345
). Они обеспечивают, (1) график использования памяти, (2) для каждого снимка, запись о том, где в вашей программе была выделена память. Отличным графическим инструментом для анализа этих файлов является массив-визуализатор . Но я обнаружилms_print
, что простой текстовый инструмент, поставляемый с valgrind, уже очень помог.Чтобы найти утечки памяти, используйте (по умолчанию)
memcheck
инструмент valgrind.источник
Попробуйте команду pmap :
источник
gnome-system-monitor
Трудно сказать наверняка, но вот две «близкие» вещи, которые могут помочь.
даст вам виртуальный размер (VSZ)
Вы также можете получить подробную статистику из файловой системы / proc, перейдя в
/proc/$pid/status
Наиболее важным является VmSize, который должен быть близок к тому, что
ps aux
дает.источник
gnome-system-monitor
В последних версиях Linux используйте подсистему smaps . Например, для процесса с PID 1234:
Он точно скажет вам, сколько памяти он использует в то время. Что еще более важно, он разделит память на приватную и разделяемую, чтобы вы могли определить, сколько памяти использует ваш экземпляр программы, без учета памяти, разделяемой между несколькими экземплярами программы.
источник
pmap
это более простой интерфейс к нему.Нет простого способа рассчитать это. Но некоторые люди пытались получить хорошие ответы:
источник
ps_mem
иsmem
очень полезным для мер конечного пользователя, в то время как, например.pmap
Очень подробный вывод ориентирован на разработчиков ... позволяет извлечь использование памяти Firefox для каждого шрифта, аддона, библиотеки, например. Спасибо всем опыта. @Bash, @thomasruther.gnome-system-monitor
Используйте smem , который является альтернативой ps, который вычисляет USS и PSS для процесса. То, что вы хотите, это, вероятно, PSS.
USS - уникальный размер набора. Это количество неразделенной памяти, уникальной для этого процесса (представьте, что это U для уникальной памяти). Он не включает общую память. Таким образом , это будет под -report объем памяти процесса , использование, но полезно , если вы хотите игнорировать общую память.
PSS - Размер пропорционального набора. Это то, что вы хотите. Он складывает уникальную память (USS) вместе с долей общей памяти, деленной на количество процессов, совместно использующих эту память. Таким образом, это даст вам точное представление о том, сколько фактической физической памяти используется на процесс - с разделяемой памятью, действительно представленной как совместно используемая. Подумайте о том, что P для физической памяти.
Как это сравнивается с RSS, как сообщили PS и другие утилиты:
Примечание: SEMM также может (необязательно) выводить графики, такие как круговые диаграммы и тому подобное. ИМО тебе ничего не нужно. Если вы просто хотите использовать его из командной строки, как если бы вы использовали ps -A v, вам не нужно устанавливать рекомендуемую зависимость python-matplotlib.
источник
Используйте это как root, и вы можете получить четкий вывод об использовании памяти каждым процессом.
ПРИМЕР ВЫХОДА:
источник
x=2
вывода pid и пользователя.Как насчет
time
?Не встроенный в Bash,
time
а тот, который вы можете найтиwhich time
, например,/usr/bin/time
Вот то, что это покрывает, на простом
ls
:источник
brew install gnu-time
затем используйте,gtime
если вы находитесь на macOS.Это отличная сводка инструментов и проблем: ссылка на archive.org
Я процитирую это, так, чтобы больше разработчиков фактически прочитало это.
источник
Помимо решений, перечисленных в ваших ответах, вы можете использовать команду Linux "top"; Он обеспечивает динамическое представление работающей системы в режиме реального времени, дает информацию об использовании процессора и памяти для всей системы, а также для каждой программы, в процентах:
фильтровать по pid программы:
фильтровать по имени программы:
«top» предоставляет также некоторые поля, такие как:
VIRT - Virtual Image (kb): общий объем виртуальной памяти, используемой задачей
RES - Резидентный размер (КБ): физическая память без перестановки, используемая задачей; RES = КОД + ДАННЫЕ.
ДАННЫЕ - Данные + размер стека (КБ): объем физической памяти, выделенный для выполнения, отличного от исполняемого кода, также известный как размер «резидентного набора данных» или DRS.
SHR - Размер общей памяти (КБ): объем общей памяти, используемой задачей. Он просто отражает память, которая потенциально может использоваться другими процессами.
Ссылка здесь .
источник
На это нет однозначного ответа, потому что вы не можете точно определить объем памяти, используемый процессом. Большинство процессов в Linux используют разделяемые библиотеки. Например, предположим, что вы хотите вычислить использование памяти для процесса 'ls'. Вы считаете только память, используемую исполняемым файлом 'ls' (если бы вы могли ее изолировать)? Как насчет libc? Или все эти другие библиотеки, необходимые для запуска «ls»?
Вы можете утверждать, что они используются другими процессами, но «ls» не может быть запущен в системе без их загрузки.
Кроме того, если вам нужно знать, сколько памяти требуется процессу для планирования емкости, вы должны рассчитать, сколько использует каждая дополнительная копия процесса. Я думаю, что / proc / PID / status может дать вам достаточно информации об использовании памяти за один раз. С другой стороны, valgrind даст вам лучший профиль использования памяти в течение всего времени жизни программы
источник
pmap
Если ваш код на C или C ++, вы можете использовать
getrusage()
который возвращает вам различные статистические данные об использовании памяти и времени вашего процесса.Однако не все платформы поддерживают это и возвращают 0 значений для параметров использования памяти.
Вместо этого вы можете посмотреть на виртуальный файл, созданный в
/proc/[pid]/statm
(где[pid]
он заменен идентификатором вашего процесса. Вы можете получить его изgetpid()
).Этот файл будет выглядеть как текстовый файл с 7 целыми числами. Вероятно, вас больше всего интересуют первое (все использование памяти) и шестое (использование памяти данных) числа в этом файле.
источник
getpid()
, потому что я не знаюgetprocessid()
функции в C / C ++ под Linux.Valgrind может отображать подробную информацию, но значительно замедляет работу целевого приложения и в большинстве случаев меняет поведение приложения.
Exmap был тем, чего я еще не знал, но, похоже, вам нужен модуль ядра для получения информации, что может быть препятствием.
Я предполагаю, что все хотят знать, что «использование памяти» WRT заключается в следующем ...
В linux объем физической памяти, который может использовать один процесс, можно условно разделить на следующие категории.
Ма анонимная отображенная память
МН назвал отображенную память
Утилита, включенная в Android под названием showmap , довольно полезна
источник
Еще три способа попробовать:
ps aux --sort pmem
Сортирует вывод по
%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Сортировка с использованием труб.
top -a
Начинается сортировка сверху
%MEM
(Извлечено отсюда )
источник
top
и, вероятно, другие не дают точного представления о памяти, фактически используемой процессом. Например, у меня 64 ГБ ОЗУ, и у меня есть 10postgres
процессов, каждый из которых сообщает 16 ГБ RES и 25% MEM. Конечно, они не могут все использовать 25% ... У каждого также есть 15 ГБ SHR, и кажется, что они разделяют это.источник
sed | awk
и оно работает в Busybox v1.23.2:sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Я пользуюсь
htop
; Это очень хорошая консольная программа, похожая на Windows Task Manager.источник
htop
и лучше, чем top, но все же он покажет вам все потоки из разных приложений, не группируя их, что делает его почти таким же бесполезным, как и top.Если процесс не использует слишком много памяти (или потому, что вы ожидаете, что это так, или какая-то другая команда дала это начальное указание), и процесс может выдержать остановку на короткий период времени, вы можете попробовать используйте команду gcore.
Проверьте размер сгенерированного файла ядра, чтобы понять, сколько памяти использует конкретный процесс.
Это не будет работать слишком хорошо, если процесс использует сотни мегабайт или гигабайтов, поскольку генерация ядра может занять несколько секунд или минут в зависимости от производительности ввода-вывода. Во время создания ядра процесс останавливается (или «замораживается»), чтобы предотвратить изменения памяти. Так что будь осторожен.
Также убедитесь, что в точке монтирования, где генерируется ядро, достаточно места на диске и что система не будет негативно реагировать на файл ядра, создаваемый в этом конкретном каталоге.
источник
Я использую Arch Linux и есть этот замечательный пакет под названием
ps_mem
Пример вывода
источник
Ниже в командной строке вы увидите общий объем памяти, используемый различными процессами, работающими на компьютере с Linux, в МБ.
источник
Хороший тест для более «реального» использования - открыть приложение, затем запустить
vmstat -s
и проверить статистику «активной памяти». Закройте приложение, подождите несколько секунд и запуститеvmstat -s
снова. Тем не менее, очевидно, что приложение активно использовало много активной памяти.источник
Получить Вальгринд. дайте ему свою программу для запуска, и она расскажет вам много об использовании памяти.
Это относится только к случаю программы, которая работает некоторое время и останавливается. Я не знаю, сможет ли valgrind получить доступ к уже запущенному процессу или не должен останавливать такие процессы, как демоны.
источник
Редактировать: это работает на 100% хорошо только при увеличении потребления памяти
Если вы хотите отслеживать использование памяти данным процессом (или группой, использующей общее имя, например
google-chrome
, вы можете использовать мой bash-скрипт:это будет постоянно искать изменения и распечатывать их.
источник
Если вы хотите что-то быстрее, чем профилирование с помощью Valgrind, а ваше ядро старше и вы не можете использовать smaps, ps с опциями отображения резидентного набора процесса (с
ps -o rss,command
) может дать вам быстрое и разумное_aproximation_
представление о реальном количестве используется не подкачанная память.источник
Я хотел бы предложить вам использовать поверх. Вы можете найти все об этом на этой странице . Он способен обеспечить все необходимые KPI для ваших процессов, а также может записывать в файл.
источник
atop -R
. Чтобы показать сводный толчокp
для каждого пользователя , для сортировки по использованию памяти нажмите" M "изнутри сверху. Это дает значения, аналогичные smem.Проверьте сценарий оболочки, чтобы проверить использование памяти приложением в Linux . Также доступно на GitHub и в версии без вставки и до н .
источник
Еще один голос за Valgrindздесь, но я хотел бы добавить, что вы можете использовать такой инструмент, как Alleyoop, чтобы помочь вам интерпретировать результаты, сгенерированные valgrind.
Я использую эти два инструмента все время, и у меня всегда есть скудный код без утечек, чтобы гордо показать его;)
источник
Хотя этот вопрос, похоже, касается проверки запущенных в данный момент процессов, я хотел увидеть пиковую память, используемую приложением от начала до конца. Помимо valgrind, вы можете использовать tstime , что намного проще. Он измеряет использование высокопроизводительной памяти (RSS и виртуальная). Из этого ответа .
источник
Основано на ответе на связанный вопрос .
Вы можете использовать SNMP, чтобы получить память и процессорное использование процесса на определенном устройстве в сети :)
Требования:
Ноты:
HOST-RESOURCES-MIB :: hrSWRunPerfCPU - это количество сантисекунд общих ресурсов ЦП системы, потребляемых этим процессом. Обратите внимание, что в многопроцессорной системе это значение может увеличиваться более чем на одну сантисекунду за одну сантисекунду реального времени (настенных часов).
HOST-RESOURCES-MIB :: hrSWRunPerfMem - это общий объем реальной системной памяти, выделенной для этого процесса.
**
Скрипт мониторинга процесса:
**
источник
/ prox / xxx / numa_maps дает некоторую информацию там: N0 = ??? N1 = ???. Но этот результат может быть ниже, чем фактический результат, поскольку он учитывает только те, которые были затронуты.
источник
Используйте встроенный инструмент GUI для системного монитора , доступный в Ubuntu
источник