如何根据内存使用情况分析Erlang程序?

时间:2010-05-12 23:21:53

标签: erlang profiling

我想进一步提高现有Erlang程序的效率。首先,我想确定瓶颈,然后决定进一步优化的位置。

我尝试了fprof,但它只提供有关总运行时间和平均运行时间的信息。我最希望看到类似于fprof输出的日志,但是关于函数和进程的平均和总内存使用情况。


对于初学者来说,分析单个模块就足够了,它不会产生进程,只会调用它的函数。这已经有所帮助,因为我可以将程序分离到不同的模块进行测试。


典型的可疑点是,正在处理更大的列表。

此处++的用法已通过lists:reverse([Head|Tail])语法解析。

我也在考虑使用ETS表而不是Lists来处理超过几百个元素的情况。

提前谢谢你!

4 个答案:

答案 0 :(得分:20)

为了自己的利益做一些广告:我刚才写了一个小的erlang gen_server,它记录并记录系统统计信息,并结合一个小的perl脚本来解析它们并输出漂亮的图表。

我发现在负载下进行内存监视等非常有用,因为它允许您持续监视内存使用情况的详细视图,同时测试不同的内容。

erlang部分是非侵入性的,一个简单的gen_server,你可以从任何地方开始,你可以把它放在你的监督树下。您可以配置轮询频率等,它将以简单的json格式将统计信息写入文件。

然后perl脚本在其上运行,并聚合日志以绘制图表。有基类,如果你知道一点perl,你可以轻松编写一个类来记录和绘制你想要的任何自定义参数。

该脚本可以从以下网址获取:https://github.com/Amadiro/erlang-statistics

示例图表(泄漏原子的Erlang节点):Sample Chart http://monoc.mo.funpic.de/ram-usage-vs-time.png

希望这可以帮助你:)

答案 1 :(得分:4)

完美的出发点是“Erlang效率指南”中的“概要分析”部分:

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

答案 2 :(得分:3)

@brainiac,我在github上发布了erlang-statistics repo的新网址:https://github.com/Amadiro/erlang-statistics(通过搜索找到它; - ))。

答案 3 :(得分:3)

作为一个更具生产能力的解决方案,如果你真的需要某种总内存消耗图,我可以推荐收集erlang客户端https://github.com/athoune/erlang-collectd

但是对于更精细的内存信息,您可以使用process_info(Pid, [memory])获取特定Pid和shell命令i()的内存信息,以获取包含内存和运行时信息的所有进程的列表。 还有像etop这样的用途。

但是没有像fprof那样的分析器,而是用于内存使用。

有关详细信息,请参阅http://www.erlang.org/faq/how_do_i.html#id52731