Как профилировать программу Erlang с точки зрения использования памяти?
Я хотел бы еще больше повысить эффективность существующей программы Erlang. Сначала я хотел бы определить узкие места, а затем решить, где еще можно оптимизировать.
Я пробовал fprof
, но он дает только информацию об общем и среднем времени исполнения. Мне больше всего хотелось бы увидеть журнал, похожий на вывод fprof, но с точки зрения среднего и общего использования памяти в отношении функций и процессов.
Для начала достаточно было бы профилировать один модуль, который не порождает процессы, только вызываемые функции. Это уже помогло бы, поскольку я мог бы разделить программу на отдельные модули для тестирования.
Типичные подозрительные точки, где обрабатываются более крупные списки.
Здесь использование ++
было разрешено с помощью lists:reverse([Head|Tail])
как синтаксис.
Я также рассматриваю использование таблиц ETS вместо списков для случаев с более чем несколькими сотнями элементов.
Спасибо заранее!
Ответы
Ответ 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
Надеюсь, это поможет вам:)
Ответ 2
Идеальной отправной точкой является раздел профилирования из руководства по эффективности Erlang:
http://www.erlang.org/doc/efficiency_guide/profiling.html
Ответ 3
@brainiac, я размещаю новый url для репозиции erlang-statistics на github: https://github.com/Amadiro/erlang-statistics (нашел его путем поиска;-)).
Ответ 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.