2009-12-08 7 views
26

Gibt es eine gebrauchsfertige Lösung, um den Speicherverbrauch vom Anfang des Systems zu protokollieren? Ich möchte die Daten in eine einfache Textdatei oder eine Datenbank schreiben, damit ich sie später analysieren kann.Wie wird der Speicherverbrauch unter Linux protokolliert?

Ich arbeite an Linux 2.4-basierten Embedded-System. Ich muss das Problem im Zusammenhang mit Speicherverbrauch debuggen. Meine Anwendung startet automatisch bei jedem Systemstart. Ich brauche den Weg, um die Daten mit Zeitstempeln aus regelmäßigen Abständen (so oft wie möglich) zu bekommen, damit ich das Problem aufspüren kann.

Die Symptome meines Problems: beim Systemstart startete meine Hauptanwendung und GUI, um die Hauptparameter des Systems zu visualisieren. GUI basierend auf GTK + (X-Server). Wenn ich GUI und X-Server deaktiviere, funktioniert meine Anwendung OK. Wenn ich GUI und X Server aktiviere, funktioniert es nicht, wenn ich 256 MiB oder 512 MiB physischen Speicher auf dem Motherboard installiert habe. Wenn ich 1 GiB Speicher installiert habe, ist alles in Ordnung.

+0

Das sieht ähnlich wie diese Frage: http://stackoverflow.com/questions/131303/linux-how-to-measure-actual-memory-usage-of-an-application-or-process – monksy

+0

Does Ihre App läuft zumindest einige Zeit, bevor sie abstürzt? –

+0

Ja, frühere Versionen werden im selben System mit OK ausgeführt. Jetzt entwickeln wir eine neue Version und beginnen dieses Problem zu lösen. – bialix

Antwort

23

Ein kleines Skript wie

rm memory.log 
while true; do free >> memory.log; sleep 1; done 
+0

tatsächlich, das ist sehr nah an dem, was ich brauche. Ich kann Zeitstempel selbst hinzufügen. – bialix

+9

'frei -s 1> memory.log'; Dies verursacht nicht die Kosten für die Einführung eines neuen Prozesses in jeder Sekunde.Es hat jedoch keinen Zeitstempel. (Ich weiß, das ist ein alter Post, aber ich habe nach dem gleichen gesucht, und auch andere). –

+1

In einigen Versionen von free ist es erforderlich, dass Sie die Anzahl der Male angeben, die Sie mit -c aufgrund eines Fehlers drucken möchten. Sonst zeigt es die fehlerfreie: Sekunden Argument '1 'fehlgeschlagen – Sputnik

2

Man könnte so etwas wie

vmstat X >> mylogfile 

in ein Startskript setzen. Da sich Ihre Anwendung bereits im Start befindet, können Sie diese Zeile am Ende des Initialisierungsskripts hinzufügen, das Ihre Anwendung bereits verwendet.

+0

Danke für den Hinweis, obwohl ich die Daten öfter als jede Sekunde protokollieren muss. – bialix

3

Es gibt ein Programm namens

sar 

auf * nix-Systemen (wobei X Anzahl der Sekunden zwischen den Log-Meldungen ist). Sie könnten versuchen, dies zu verwenden, um die Speichernutzung zu überwachen. Es nimmt Messungen in regelmäßigen Abständen vor. Do a

man sar 

für weitere Details. Ich denke, die Option ist -r für Speichermessungen, -i, um das Intervall anzugeben, das Sie möchten.

+1

Definitiv leistungsfähiger als die anderen vorgeschlagenen Lösungen, obwohl ein bisschen mehr umständlich einzurichten. – Ale

4

Ich denke, das Hinzufügen ein crontab-Eintrag wird genug

*/5 * * * * free -m >> some_output_file 

Es gibt auch andere Werkzeuge wie SeaLion, New Relic, Server Density etc, die die gleichen fast tun, sondern sind viel einfacher zu installieren und zu konfigurieren. Mein Favorit ist SeaLion, da es kostenlos ist und auch eine tolle Timeline-Ansicht von rohen Ausgaben gängiger Linux-Befehle bietet.

+0

+1 für Sealion, die schnellste Anmeldung/Setup EVER. Die ganze Sache dauerte ungefähr 6 Sekunden - ich tippte meine Email ein, ein Passwort. Ich habe einen einzigen Befehl in ssh und Boom meine Statistiken erschienen. – rgvcorley

17

Das folgende Skript druckt Zeitstempel und eine Kopfzeile.

#!/bin/bash -e 

echo "  date  time $(free -m | grep total | sed -E 's/^ (.*)/\1/g')" 
while true; do 
    echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')" 
    sleep 1 
done 

Die Ausgabe sieht so aus (getestet auf Ubuntu 15.04, 64-Bit).

 date  time   total  used  free  shared buffers  cached 
2015-08-01 13:57:27   24002  13283  10718  522  693  2308 
2015-08-01 13:57:28   24002  13321  10680  522  693  2308 
2015-08-01 13:57:29   24002  13355  10646  522  693  2308 
2015-08-01 13:57:30   24002  13353  10648  522  693  2308