我想进一步提高现有Erlang程序的效率。首先,我想确定瓶颈,然后决定进一步优化的位置。
我尝试了fprof
,但它只提供有关总运行时间和平均运行时间的信息。我最希望看到类似于fprof输出的日志,但是关于函数和进程的平均和总内存使用情况。
对于初学者来说,分析单个模块就足够了,它不会产生进程,只会调用它的函数。这已经有所帮助,因为我可以将程序分离到不同的模块进行测试。
典型的可疑点是,正在处理更大的列表。
此处++
的用法已通过lists:reverse([Head|Tail])
语法解析。
我也在考虑使用ETS表而不是Lists来处理超过几百个元素的情况。
提前谢谢你!
答案 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效率指南”中的“概要分析”部分:
答案 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那样的分析器,而是用于内存使用。