Wie zeichnet man auf, wie viel Speicher eine App unter OS X belegt?

0

Ich arbeite auf einem Mac Mini mit OS X 10.8.2. Ich bin ein App-Entwickler, aber in diesem Fall erstelle ich eine App in C ++, sodass ich Xcode für diese Frage nicht verwenden kann. Ich möchte nachverfolgen, wie viel Speicher meine App belegt, möchte ihn jedoch nicht manuell aufzeichnen. Wie mache ich das.

MEHR INFO: Ich möchte es den ganzen Tag aufnehmen. Ich werde die App den ganzen Tag laufen lassen, damit ich Peaks im Speicher vergleichen kann. Ich bin nicht gegen Apps von Drittanbietern, solange diese zuverlässig sind. Vielen Dank.

Josiah
quelle
Nicht wirklich ein Programmierer, aber Valgrind vielleicht?
Slhck
Sie können die Instruments-App verwenden, indem Sie sie an einen beliebigen Prozess anhängen, ohne Xcode selbst zu starten.
Ken
Ich habe das gesehen. Ich sah jedoch keine Möglichkeit, "in der Zeit zurück zu gehen" und die Erinnerung den ganzen Tag anzusehen. Wenn Sie erklären könnten, wie man es benutzt / liest. Das wäre schön.
Josiah

Antworten:

3

Dies sollte mit dem Standardbefehl möglich sein ps. Von man ps:

%mem        %MEM      ratio of the process's resident set size  to the physical
                      memory on the machine, expressed as a percentage.  

rss         RSS       resident set size, the non-swapped physical memory that 
                      a task has used (inkiloBytes). 

vsz         VSZ       virtual memory size of the process in KiB (1024byte units).
                      Device mappings are currently excluded; this is subject
                      to change. 

Das einzige weitere Detail, das Sie benötigen, ist die PID Ihres Prozesses. Wenn Ihre App also myApp heißt, können Sie die PID folgendermaßen ermitteln:

ps x | grep myApp

Welches druckt eine Liste wie folgt:

15909 pts/3    S      0:37 myApp
22583 pts/6    S+     0:00 grep --color myApp

Die erste Spalte ist die Prozess-ID (PID). Wenn Sie dies nun automatisieren möchten, müssen Sie die Zeile mit dem Befehl grep überspringen und die Ausgabe in einer BASH-Variablen speichern:

pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}')

Der awkTeil veranlasst den Befehl, nur das 1. Feld, die PID, zu drucken.


Sie können all dies in einer Zeile zusammenfassen, die den Speicherbedarf Ihrer App jede Minute in einer Datei mit dem Namen speichert memlog.txt:

while sleep 60; do \
    pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}') && \
    ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt ; \
done 
  • while sleep 60 Bewirkt, dass die Bash in einer Endlosschleife ausgeführt wird und 60 Sekunden zwischen den Schleifen wartet
  • sleep 60sagt ihm, er solle 60 Sekunden warten. Ändern Sie diesen Wert, wenn Sie ihn häufiger aktualisieren müssen.

Die resultierende Ausgabe ist eine Datei ( memlog.txt) mit 4 Spalten: die PID Ihrer App, die residente eingestellte Größe, die virtuelle Speichergröße und der Speicherprozentsatz. Zum Beispiel:

4166 25240 633028  0.3
4166 25240 633028  0.3
4166 25240 633028  0.3

Dies kann leicht erweitert werden, um die CPU-Auslastung und eine Zeit für jede Messung einzuschließen. Um beispielsweise die Zeit einzuschließen:

while sleep 60; do \
    date=$(date +%D" "%H:%M:%S);
    echo -n "$date : " >> memlog.txt;
    pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}') && \
    ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; \
done 
terdon
quelle
In der ersten Zeile wird ein Fehler angezeigt. Ich denke nicht während (1); do \ ist richtig. Bitte korrigieren Sie das. Auch wenn das funktioniert, würde ich wirklich etwas visuelleres bevorzugen. Es scheint nicht so, als ob dies schwierig sein sollte.
Josiah
Eigentlich hätte ich gerne so etwas wie Instruments.app oder vielleicht genau dieses Tool. Obwohl es Speicher aufzeichnet, scheint es jedoch nicht den Speicher einer bestimmten Anwendung zu verfolgen.
Josiah
@AceLegend, `dient nur dazu, BASH mitzuteilen, dass der Befehl in der nächsten Zeile fortgesetzt wird, die hier zum leichteren Lesen verwendet wird. Es sollte funktionieren, wenn Sie es einfach kopieren und direkt einfügen. Es funktioniert nicht, wenn Sie es von Hand kopieren. Das Ganze in einer Zeile ist while(1); do date=$(date +%D" "%H:%M:%S); echo -n "$date : " >> memlog.txt; pid=$(ps x | grep myApp | grep -v grep | gawk '{print $1}') && ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; sleep 60 ; done. Was das Visuelle betrifft, würde ich einfach die Werte nehmen und sie zeichnen.
Terdon
Ich verstehe, aber es funktioniert immer noch nicht. Ich habe eine Datei mit der Zeile #! / Bin / bash erstellt, die eine Zeile übersprungen hat. Dann:while(1); do date=$(date +%D" "%H:%M:%S); echo -n "$date : " >> memlog.txt; pid=$(ps x | grep Nightly | grep -v grep | gawk '{print $1}') && ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; sleep 60 ; done
Josiah
Ich habe es dann als memTesting.sh gespeichert und verwendet sudo chmod +x, um es ausführbar zu machen. Dann ./memTesting.sh. Es wird immer noch ein Fehler ausgegeben, der besagt, dass ein unbekannter Befehl verwendet wird.
Josiah