Ich versuche eine gute Formel herauszufinden, wie viel Speicher verfügbar ist. Ich verwende momentan die folgende Formel: freeMem = MemFree + Buffers + Cached - Shmem
. Nach dieser Formel verliert mein eingebettetes System jedoch Speicher. Jetzt frage ich mich, ob ich ein Speicherleck habe, also habe ich kmemleak
im Kernel aktiviert. Laut mpatrol
, valgrind
und coverity
habe ich keine Lücken im Benutzerbereich. Gibt es ein Leck im Kernelraum oder ist meine Formel deaktiviert? Beachten Sie, dass ich für dieses Gerät keinen Swap habe.
Der Speicher von userland wird nicht in /proc/meminfo
angezeigt, da der Kernel Speicher zugewiesen hat (egal ob Sie free () in Ihrer userland App verwenden oder nicht, es wird entweder mit der mmap zugewiesen ( ) syscall oder brk () / sbrk () und der Kernel verfolgt die im Userland zugewiesenen Seiten, sonst wären wir in ernsthaften Schwierigkeiten;).
Ich verstehe nicht genau, wie Sie auf Ihren Glauben gekommen sind, dass Ihre Erinnerungen ausgelaufen sind? Hier ist ein guter Link redhat / meminfo wenn du es noch nicht gelesen hast, was jede Statistik wirklich erklärt bedeutet.
Ihrer Berechnung für den "freien Speicher" fehlt eine Sache - sie sollte SReclaimable
(für den wiedergewinnbaren Slab-Cache) zum effektiv freien Speicher hinzufügen.
Wenn sich dadurch die langsame Reduzierung des effektiv freien Speichers im Laufe der Zeit nicht ändert, sollten Sie in regelmäßigen Abständen Snapshots von /proc/meminfo
erstellen und ermitteln, in welcher Zeile der Anstieg angezeigt wird.
Wenn es die SUnreclaim
-Zeile ist, die ansteigt, können Sie in /proc/slabinfo
nachsehen, um die Verwendung Ihrer Kernel-Platte zu sehen und den Schuldigen zu identifizieren. Es ist möglich, dass es einfach die Speicherfragmentierung ist, die Sie beobachten, und es wird sich eventuell über einen längeren Zeitraum beruhigen.
Vereinbar mit auxv - Die Verwendung von / proc / meminfo ist wahrscheinlich nicht die beste Methode, um den Arbeitsspeicher des Benutzers zu verfolgen, da er Speicher enthält, der von allen Benutzerprozessen zugewiesen wird. Dadurch ist es schwierig, den Verbrauch Ihres Prozesses einzuschränken.
Eine bessere Möglichkeit, den gesamten von Ihrem Prozess verbrauchten Speicher zu verfolgen, wäre die Verwendung von top (1)
und die Betrachtung von VIRT (einschließlich Speicherauslagerung) oder RES (die nur physischen Speicher umfasst).
Aber wenn du / proc / meminfo benutzen willst, wäre die Formel, die ich verwenden würde:
MemTotal = MemFree + Cache + Puffer + SwapCached
... beachten Sie, dass dies nur für Daten gilt, nicht für Code. Der größte Teil von MemTotal - (Menge rechts neben der Gleichung) sollte Ihr Kernel-Image sein.
Für meine Systeme verwende ich den folgenden Befehl, um zu überprüfen, wie viel Speicher verbraucht wird:
%Vor%Dies fügt den Gesamtprozentsatz des verwendeten Speichers für alle laufenden Prozesse hinzu.
Tags und Links memory-leaks linux linux-kernel embedded-linux