Как профилировать программу Erlang с точки зрения использования памяти? - PullRequest
20 голосов
/ 13 мая 2010

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

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


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


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

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

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

Заранее спасибо!

Ответы [ 4 ]

20 голосов
/ 13 мая 2010

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

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

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

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

Сценарий можно получить по адресу: https://github.com/Amadiro/erlang-statistics

Пример диаграммы (узел Эрланга, который пропускает атомы): Пример диаграммы http://monoc.mo.funpic.de/ram-usage-vs-time.png

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

4 голосов
/ 13 мая 2010

Идеальной отправной точкой является раздел профилирования из Руководства по эффективности Erlang:

http://www.erlang.org/doc/efficiency_guide/profiling.html

3 голосов
/ 06 ноября 2012

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

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

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

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

3 голосов
/ 31 мая 2011

@ brainiac, я выкладываю новый URL-адрес для репозитория erlang-statistics на github: https://github.com/Amadiro/erlang-statistics (найден при поиске; -)).

...