Какой инструмент и опцию Valgrind использовать для исследования распределения ОЗУ для каждой функции? - PullRequest
3 голосов
/ 05 апреля 2020

Я никогда не использовал Valgrind, но я думаю, что этот инструмент может помочь мне с моим вопросом. Буду благодарен за любую помощь. В моем коде R я использую пакет MixedModels Julia. Я интегрирую Julia в R, используя пакет JuliaCall. Я работаю с очень большими наборами данных (~ 1 GB, ~ 4x10^6 наблюдения) и на этапе моделирования (mixed models) выделяется много оперативной памяти (~ 130 GB), большая часть которой не возвращается в систему после окончания расчетов. Я хотел бы проанализировать код и увидеть весь стек R и Julia функций . Для меня очень важно понять, какие функции вызываются при mixed models вычислении с Julia (особенно низкоуровневые функции, скорее всего написанные в C / C ++), и сколько памяти использует каждая из этих функций . Также важно понимать, на что именно расходуется память, что именно происходит в RAM, когда выполняются функции из пакета MixedModels. Возможно, понимание этого поможет мне улучшить производительность кода и уменьшить выделение памяти. Возможно, для моих задач будет полезен какой-то другой инструмент (вместо Valgrind) - я буду очень благодарен за соответствующие рекомендации!

1 Ответ

0 голосов
/ 06 апреля 2020

Valgrind содержит несколько инструментов, два или три из которых могут быть вам полезны.

Однако первое, что вам нужно сделать, это уменьшить размер вашей модели. У Valgrind большие затраты времени и памяти. Запуск Valgrind в приложении, которое выделяет 130 ГБ памяти, вероятно, будет чрезвычайно медленным. Однако, если вы просто уменьшите размер своих данных, полученные вами сведения все равно должны быть действительными.

Первый инструмент, который следует рассмотреть, - memcheck. Это наиболее часто используемый инструмент Valgrind. В дополнение к другим типам ошибок, он может обнаружить утечки памяти. Выполнить

valgrind --leak-check=full --show-reachable=yes {your app} {your app arguments}

Необходимо проверить вывод, чтобы определить, есть ли утечки или удерживается ли память (возможно, для последующего повторного использования).

Следующий инструмент, который следует рассмотреть, - massif. Это профилировщик кучи памяти. Он сгенерирует график изменения использования памяти за время выполнения вашего приложения. Запустите

valgrind --tool=massif {your app} {your app arguments}

. Это сгенерирует текстовый файл, который можно увидеть либо с помощью визуализатора массива (графическое приложение kde5), либо с помощью ms_print (часть дистрибутива Valgrind), командной строки инструмент, который будет генерировать график ascii-art. Кроме того, если вы используете относительно свежую версию Valgrind, вы можете использовать опции xtree с massif и сгенерировать текстовый файл, который вы можете загрузить в kcachegrind (другое графическое приложение kde5). Это даст вам «древовидное» представление о том, какие вызовы выделяют сколько памяти.

Наконец, есть DHAT (exp-dhat, если вы используете более старую версию Valgrind). Это профилирует использование кучи памяти. Он сгенерирует текстовый файл, который вы можете загрузить из html файла, который является частью дистрибутива Valgrind. (Или просто текстовый файл с более старыми версиями). Используйте --tool=dhat, чтобы использовать его. Этот инструмент может помочь отследить память, которая либо не используется, либо используется редко и может быть освобождена раньше при выполнении программы.

Возможно, вы захотите взглянуть и на другие инструменты. Например, в инструментах Google perf есть компонент heapprofiler.

...