2010-05-12 29 views
19

我想進一步提高現有Erlang程序的效率。首先,我想找出瓶頸,然後決定在哪裏進一步優化。如何根據內存使用情況描述Erlang程序?

我試過fprof,但它只給出關於總運行時間和平均運行時間的信息。我最希望看到類似於fprof輸出的日誌,但是就功能和進程而言,平均和總內存使用量方面。


對於初學者來說就足夠了剖析單個模塊,不產卵過程,只是它的功能將被調用。這已經有所幫助了,因爲我可以將程序分離到不同的模塊進行測試。


典型的可疑點是,正在處理更大的名單。

這裏的++的用法已被lists:reverse([Head|Tail])類似的語法解決。

我也在考慮使用ETS表格而不是列表來處理超過幾百個元素的情況。

謝謝您提前!

+1

+1。爲了支持分析:) – 2010-05-13 09:17:29

+0

我懷疑在列表中使用ets表將會在空間方面具有優勢,無論表/ ets表有多大(列表每個元素只有一個指針的開銷) - 通常表只有及時給你一個優勢。 – Amadiro 2010-05-14 12:42:59

回答

20

做一些廣告爲了我自己:我寫了一個小二郎gen_server前一陣子,是記錄和日誌系統統計數據,並結合一個小Perl腳本來解析它們並輸出漂亮的圖表。

我發現它非常適合在負載下進行內存觀看等,因爲它可以讓您持續監視內存使用情況的詳細視圖,同時還可以測試不同的事情。

erlang部分是非侵入性的,一個簡單的gen_server,你可以從任何地方開始,你可以把它放在你的監督樹下。您可以配置輪詢頻率等,它會以簡單的json格式將統計信息寫入文件。

然後,perl腳本將其運行並聚合日誌以繪製圖表。有基類,如果你知道一點perl,你可以很容易地寫一個類來記錄和繪製你想要的任何自定義參數。

該腳本可以從以下地址獲得:https://github.com/Amadiro/erlang-statistics

示例圖表(泄漏原子二郎山節點):Sample Chart http://monoc.mo.funpic.de/ram-usage-vs-time.png

希望這有助於你:)

+0

+1這看起來很有希望。我會看看。謝謝! – cdlf 2010-05-14 15:10:17

4

完美的出發點是從二郎效率指南概要分析部分:

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

+1

謝謝你的回答,但是我在Erlang效率指南中提到的工具的問題是它們都專注於運行時,並且我需要與內存使用相關的信息。 – cdlf 2010-05-13 12:24:48

3

@brainiac,我張貼新網址在github上的erlang-statistics repo:https://github.com/Amadiro/erlang-statistics(通過搜索找到;-))。

+0

感謝發佈,前一段時間我在github上更改了顯示名稱,並沒有注意到它使所有舊的存儲庫URL失效。哎呀!無論如何,url https://github.com/Amadiro/erlang-statistics是正式版本。 – Amadiro 2011-11-20 19:13:45

3

如果您真的需要某種類型的總內存消耗圖,那麼作爲一個更符合生產要求的解決方案,我可以推薦collectd 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