Программа, использующая максимальную память в Linux

Скажем, в linux запущено 3-4 приложения, интенсивно использующих память, например, любое приложение для обработки видео. Эти приложения используют разный объем оперативной памяти, и их схемы доступа к памяти также различаются. Кроме того, скажем, эти приложения работают на разных ядрах.

Допустим, все эти программы работают в течение 5 секунд.

Что я пытаюсь найти -

  1. Какие функции среди этих приложений используют максимум памяти в конкретный момент? Мне нужно имя первых 2-3 функций, которые занимают максимальный ресурс памяти.

  2. Если нескольким функциям одновременно требуется большой объем памяти (который превышает пороговое значение), каковы их имена и как долго им требуется такой большой объем памяти.

Мне нужна помощь в этом - не могу понять, как действовать дальше. Поможет ли вычисление промаха кеша с помощью инструмента perf? Я новичок в linux, пожалуйста, напишите с небольшим объяснением. Заранее спасибо.


person Rajarshi Mukherjee    schedule 13.02.2015    source источник
comment
Используйте профилирование, для памяти регулярно делайте дампы памяти и анализируйте, чтобы найти методы, которые занимают больше всего памяти.   -  person Nachiket Kate    schedule 13.02.2015
comment
Не могли бы вы объяснить это немного подробнее, пожалуйста - я новичок в Linux. @ Начикет . Если можно, дайте пример кода и т.д.   -  person Rajarshi Mukherjee    schedule 13.02.2015


Ответы (2)


Вы можете использовать профилировщики, инструменты анализа кучи для получения ресурсов процессора и памяти для каждого метода.

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

Программы используют память для хранения объектов, переменных. Вы можете узнать, какой метод/объект занимает много памяти, посмотрев только на снимок памяти. Вы можете получить дамп памяти или снимок памяти (я не уверен насчет кода c, c++, но, вероятно, есть доступные инструменты и команды). Как только вы получите эти снимки, проанализируйте их на наличие объектов/методов, занимающих самый большой блок памяти.

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

Надеюсь, теперь вам ясно :)

person Nachiket Kate    schedule 13.02.2015

Вы можете использовать ps (возможно, с watch), top или htop для просмотра потребления памяти процессами. Например, если у вас есть три процесса с pid 1234, 2345 и 3456 ( вы можете найти эти pids, используя ps|grep programname или pidof или pgrep и т. д...) вы можете запустить

watch ps -F 1234 2345 3456

Какие функции среди этих приложений используют максимум памяти в конкретный момент?

Если нескольким функциям требуется большой объем памяти

Я предполагаю, что вы говорите о функциях C (или C++) в своем коде. Тогда оба вопроса выше не имеют никакого смысла: потребление памяти является глобальным свойством вашей программы. Когда (а это случается часто) зона памяти выделяется в одной функции (вызов malloc), заполняется в другой и освобождается в третьей (вызов free), нет смысла говорить, какая функция владеет этими данными или потребляет эта память.

Вы можете использовать valgrind (по крайней мере, чтобы убедиться, что у вас нет утечки памяти).

Также обратите внимание, что если ваша программа правильно вызывает malloc, а затем free, освобожденная память не всегда возвращается ОС: большинство реализаций malloc попытаются "сохранить" free-d память для немедленного повторного использования в будущем. звонки на malloc

Прочитайте вики-страницы на сборке мусора, на утечка памяти и память управление, в частности, динамическое выделение памяти C. RTFM malloc(3) и mmap(2) (поскольку mmap используется malloc) и proc(5) (поскольку /proc/ можно использовать для запроса карты памяти и состояния, используйте cat /proc/$(pidof yourprogram)/maps и т. д...) и setrlimit(2) (что позволяет вам ограничить доступную память, например, с помощью ulimit, встроенной в bash, и ps(1) и смотреть(1) & pgrep(1) & pidof(1). Прочтите также Продвинутое программирование в Linux

person Basile Starynkevitch    schedule 13.02.2015
comment
Top, htop, ps не дает разумного использования процессора и памяти. Насколько мне известно :) Пользователь запрашивает мудрое использование метода. - person Nachiket Kate; 13.02.2015
comment
Как я могу увидеть, в какой момент, сколько памяти занимает отдельная функция приложения? - person Rajarshi Mukherjee; 13.02.2015
comment
Как я пытаюсь объяснить, ваш вопрос не имеет никакого смысла. - person Basile Starynkevitch; 13.02.2015
comment
Позвольте мне быть более ясным - у меня есть две программы, которые работают параллельно и которые периодически обращаются к памяти (эту часть я знаю). (чего я не знаю) например. при t=1 программе A требуется 1000 МБ на 1 мс, при t=2 программе B требуется 1000 МБ на 2 мс. Мне нужно найти способ узнать последнюю часть. Какая программа использовала сколько памяти каждую секунду с момента t=1 до t=5? - person Rajarshi Mukherjee; 13.02.2015