Подтвердить что ты не робот

Как профилировать программу Erlang с точки зрения использования памяти?

Я хотел бы еще больше повысить эффективность существующей программы Erlang. Сначала я хотел бы определить узкие места, а затем решить, где еще можно оптимизировать.

Я пробовал fprof, но он дает только информацию об общем и среднем времени исполнения. Мне больше всего хотелось бы увидеть журнал, похожий на вывод fprof, но с точки зрения среднего и общего использования памяти в отношении функций и процессов.


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


Типичные подозрительные точки, где обрабатываются более крупные списки.

Здесь использование ++ было разрешено с помощью lists:reverse([Head|Tail]) как синтаксис.

Я также рассматриваю использование таблиц ETS вместо списков для случаев с более чем несколькими сотнями элементов.

Спасибо заранее!

4b9b3361

Ответ 1

Сделав рекламу ради себя, я написал немного erlang gen_server некоторое время назад, которая записывает и записывает системную статистику в сочетании с небольшим perl script, который анализирует их и выводит довольно диаграммы.

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

Элемент erlang довольно неинтрузивный, простой gen_server, который вы можете начать с любого места, вы можете просто поместить его под свое дерево наблюдения. Вы можете настроить частоту опроса и т.д., И он будет записывать статистику в файл в простом json формате.

Затем выполняется над perl script и агрегирует журналы для рисования диаграмм. Существуют базовые классы, и если вы знаете немного perl, вы можете легко написать класс для записи и диаграммы любого настраиваемого параметра, который вы хотите.

script можно получить из: https://github.com/Amadiro/erlang-statistics

Пример диаграммы (Erlang node, который утечки атомов): Пример диаграммы http://monoc.mo.funpic.de/ram-usage-vs-time.png

Надеюсь, это поможет вам:)

Ответ 4

В качестве более готового к выпуску решения я могу порекомендовать собирать erlang client https://github.com/athoune/erlang-collectd, если вам действительно нужны какие-то общие графики потребления памяти.

Но для получения более подробной информации о памяти вы можете использовать process_info(Pid, [memory]) для получения информации о памяти для конкретной команды Pid и оболочки i() для списка всех процессов с памятью и информацией о времени выполнения. Существует также такая утилита, как etop.

Но нет такого профилировщика, как fprof, но для использования памяти.

Подробнее см. http://www.erlang.org/faq/how_do_i.html#id52731.