2015-02-13 5 views
0

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

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

То, что я пытаюсь найти -

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

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

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

+0

Использование Профилирование, для памяти взять heapdumps на регулярные промежутки времени и анализировать для поиска методов, которые занимают большую часть памяти. –

+1

Не могли бы вы объяснить это маленькой деталью - я новичок в Linux. @ Nachiket. Если возможно, укажите пример кода и т. Д. –

ответ

1

Вы можете использовать ps (возможно, с watch) или top или htop, чтобы посмотреть на потребление памяти процессами. Например, если у вас есть три processes ИЗОДРОМНЫХ 1234, 2345 и 3456 (вы можете найти эти ИДП с помощью ps|grep programname или pidof или pgrep ... и т.д.) вы можете запустить

watch ps -F 1234 2345 3456 

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

Если несколько функций необходимо большое количество памяти

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

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

заметить также, что если ваша программа вызывает malloc то free правильно, освобожденная память не всегда возвращается к ОСАМ: большинство malloc реализаций будут пытаться «держать» free -d память немедленно многоразовыми в будущего звонков в malloc

Прочитайте wikipages на garbage collection, на memory leak и memory management, в частности, на C dynamic memory allocation.RTFM malloc(3) & mmap(2)mmap используется malloc) & proc(5)/proc/ может быть использован для запроса карты памяти и состояния, используйте cat /proc/$(pidof yourprogram)/maps и т.д. ...) & setrlimit(2) (что позволяет ограничить, например, с ulimit встроенной командой из bash, доступная память) & ps(1) & watch(1) & pgrep(1) & pidof(1). Read also Advanced Linux Programming

+0

Вверху, htop, ps не дает метод мудрого процессора и использования памяти. Согласно моим знаниям :) Пользователь просит использовать метод разумного использования. –

+0

Как я могу увидеть, в какой момент времени запоминается индивидуальная функция памяти приложения? –

+0

Как я пытаюсь объяснить, ваш вопрос не имеет никакого смысла. –

2

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

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

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

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

Я надеюсь, что вы теперь ясно :)