【问题标题】:How to profile an Erlang program in terms of memory usage?如何根据内存使用情况分析 Erlang 程序?
【发布时间】:2011-02-18 21:21:40
【问题描述】:

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

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


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


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

这里++的用法已经被lists:reverse([Head|Tail])这样的语法解决了。

我也在考虑使用 ETS 表格而不是列表来处理包含数百个元素的案例。

提前谢谢你!

【问题讨论】:

  • 我怀疑使用 ets 表而不是列表在空间方面会是一个优势,无论列表/ets 表有多大(列表每个元素只有一个指针的开销)--ets表格通常只会在时间上为您提供优势。

标签: erlang profiling


【解决方案1】:

为我自己做一些广告:前段时间我写了一个小 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

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    完美的起点是 Erlang Efficiency Guide 中的 Profiling 部分:

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

    【讨论】:

    • 感谢您的回答,但是我对 Erlang 效率指南中提到的工具的问题是它们都专注于运行时,我需要内存使用相关的信息。
    【解决方案3】:

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

    【讨论】:

    • 感谢发帖,不久前我在 github 上更改了我的显示名称,并没有注意到它使所有旧的存储库 URL 无效。哎呀!无论如何,网址github.com/Amadiro/erlang-statistics是正式版。
    【解决方案4】:

    如果您确实需要某种总内存消耗图表,我可以推荐 collectd erlang client https://github.com/athoune/erlang-collectd 作为更适合生产的解决方案。

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

    但是没有像 fprof 这样的分析器,只是为了内存使用。

    详情请参考http://www.erlang.org/faq/how_do_i.html#id52731

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 2011-06-09
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多