2010-05-12 9 views
19

Ich möchte die Effizienz eines bestehenden Erlang-Programms weiter verbessern. Zuerst möchte ich Engpässe identifizieren und dann entscheiden, wo ich weiter optimieren möchte.Wie profiliere ich ein Erlang Programm hinsichtlich der Speichernutzung?

Ich habe fprof versucht, aber es gibt nur Informationen über Gesamt-und durchschnittliche Laufzeit. Am liebsten würde ich ein Protokoll sehen, das der Ausgabe von fprof ähnlich ist, aber hinsichtlich der durchschnittlichen und gesamten Speichernutzung in Bezug auf Funktionen und Prozesse.


Für den Anfang reicht es wäre, ein einzelnes Modul zu profilieren, die Prozesse nicht laichen, würde es nur Funktionen aufgerufen werden. Das würde mir schon helfen, denn ich könnte das Programm auf verschiedene Module zum Testen aufteilen.


Typische verdächtige Punkte sind, wo größere Listen behandelt werden.

Hier wurde die Verwendung von ++ durch lists:reverse([Head|Tail]) wie Syntax aufgelöst.

Ich überlege auch, ETS-Tabellen anstelle von Listen für Fälle mit mehr als ein paar hundert Elementen zu verwenden.

Vielen Dank im Voraus!

+1

+1. Um Profiling zu unterstützen :) –

+0

Ich bezweifele die Verwendung von ETS-Tabellen über Listen wird ein Vorteil in Bezug auf den Raum, egal wie groß die Liste/ETS-Tabelle ist (eine Liste hat nur einen Overhead von einem Zeiger pro Element) - ETS-Tabellen in der Regel geben Sie nur einen Vorteil in der Zeit. – Amadiro

Antwort

20

ein wenig Werbung für meinetwillen tun: Ich habe ein wenig erlang gen_server vor einer Weile geschrieben, dass Aufzeichnungen und Protokolle System Statistiken, kombiniert mit einem kleinen Perl-Skript, das sie analysiert und hübsche Diagramme ausgibt.

Ich fand es sehr nützlich für Speicherüberwachung usw. unter Last, wie es Ihnen ermöglicht, eine detaillierte Ansicht der Speicherauslastung kontinuierlich zu überwachen, während zum Beispiel verschiedene Dinge zu testen.

Der Erlang-Teil ist ziemlich non-intrusive, ein einfacher Gen_Server, den Sie von überall starten können, Sie können es einfach unter Ihre Aufsicht Baum setzen. Sie können die Abfragehäufigkeit usw. konfigurieren und Statistiken in eine Datei in einem einfachen json-Format schreiben.

Das Perl-Skript läuft dann darüber und aggregiert die Protokolle, um Diagramme zu zeichnen. Es gibt Basisklassen, und wenn Sie ein wenig Perl wissen, können Sie einfach eine Klasse schreiben, um alle benutzerdefinierten Parameter zu protokollieren und zu kartieren. https://github.com/Amadiro/erlang-statistics

Beispieldiagramm (Erlang-Knoten, die Atome Lecks): Sample Chart http://monoc.mo.funpic.de/ram-usage-vs-time.png

this helps you :)

+0

+1 Das sieht sehr vielversprechend aus. Ich werde es mir ansehen. Vielen Dank! – cdlf

4

Der perfekte Ausgangspunkt ist die Profilierung Abschnitt aus dem Erlang Efficiency Guide:

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

+1

Vielen Dank für die Antwort, aber mein Problem mit den im Erlang Efficiency Guide erwähnten Tools ist, dass sie sich alle auf die Laufzeit konzentrieren und ich Informationen zur Speichernutzung benötige. – cdlf

3

@brainiac, ich bin Entsendung neue URL

Das Skript kann bezogen werden für erlang-statistics Repo auf GitHub: https://github.com/Amadiro/erlang-statistics (gefunden durch Suche ;-)).

+0

Danke für das Posten, ich habe meinen Anzeigenamen vor einer Weile auf github geändert und nicht bemerkt, dass es alle alten URLs des Repositories ungültig gemacht hat. Hoppla! In jedem Fall ist die URL https://github.com/Amadiro/erlang-statistics die offizielle Version. – Amadiro

3

Als eine mehr produktionsfertige Lösung kann ich Collectd Erlang Client https://github.com/athoune/erlang-collectd empfehlen, wenn Sie wirklich eine Art von Gesamtspeicherverbrauch Graphen benötigen.

Für detailliertere Speicherinformationen können Sie process_info(Pid, [memory]) verwenden, um Speicherinformationen für einen bestimmten PID- und Shell-Befehl i() für eine Liste aller Prozesse mit Speicher- und Laufzeitinformationen abzurufen. Es gibt auch solche utilite als etop.

Aber es gibt keinen solchen Profiler wie fprof, aber für Speicherverbrauch.

Einzelheiten finden Sie unter http://www.erlang.org/faq/how_do_i.html#id52731.

Verwandte Themen