Warum erscheint durchgesickerter Speicher in kernel_task malloced, und warum kann OS X ihn nicht durch Müll sammeln


11

Mir wurde zuvor gesagt, dass ein Zeichen dafür, dass eine Anwendung einen Speicherverlust aufweist, kernel_taskein großer Speicherbedarf ist, der üblicherweise in der Größenordnung von Gigabyte liegt. Wenn ein Fehler kextdiese Speichernutzung verursacht, würden wir eine Diskrepanz zwischen dem zugewiesenen Speicher und den erwarteten zugewiesenen Speichern erwarten, d. H.

diff <(kextstat|tr -s ' ' | cut -d ' ' -f 5) <(kextstat| tr -s ' ' | cut -d ' ' -f 6) 

würde etwas anderes als die Wörter "Wired" und "Name" zurückgeben.

Während ich meine Diplomarbeit schrieb, habe ich festgestellt, dass das Ändern eines PDFs, während es in der Vorschau geöffnet ist, häufig zu schlechten Ereignissen führt: Gelegentlich kann die Speichernutzung von kernel_taskauf etwa acht Gigabyte oder mehr ansteigen. Wenn ich die Vorschau beende, kehrt sie sofort zum Normalzustand zurück . Offensichtlich stimmt etwas nicht - und Preview verliert unter diesen Bedingungen Speicher.

Meine Frage lautet also: Wenn ich weiß, dass ein Prozess durch eine plötzliche und unerwartete Vergrößerung des Footprints von RAM ausgelaufen ist kernel_task, warum kann OS X dann nicht wissen, dass etwas schief gelaufen ist? Wenn das Beenden von Preview mein fehlendes malloc()Gedächtnis wiederherstellt , warum führt Darwin die Speicherbereinigung nicht automatisch für mich durch?

Habe ich ein grundlegendes Missverständnis darüber, wie Speicherverwaltung funktioniert?

EDIT: (15.9.15)

Hier ist eine Demonstration dessen, wovon ich spreche. Zuallererst bemerke ich eine hohe Speichernutzung durch kernel_task(Hinweis: Die Vorschau ist geöffnet und wird mit 333 MiB RAM am unteren Rand des Aktivitätsmonitors angezeigt):

Hohe Kernel-Speichernutzung

Befolgen Sie die hilfreichen Bemerkungen von Ashley unten, um herauszufinden, wie viel jeder Text verwendet:

$ kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

...
...
...
   1249280 com.apple.driver.DspFuncLib
   1769472 com.apple.nvidia.driver.NVDAGK100Hal
   2629632 com.apple.nvidia.driver.NVDAResman
   6184960 com.apple.driver.AirPort.Brcm4360
$

Also keine große Menge. Mein Computer verfügt sowohl über diskrete als auch über integrierte GPUs. Ihre Treiber verwenden nur wenige MiB Kabel-RAM. Lassen Sie uns in meiner Vermutung die Vorschau beenden und untersuchen, was mit dem Speicherbedarf von kernel_task:

Das Töten der Vorschau hilft

Die Vorschau ist weg und der Speicherbedarf des Kernels ist dramatisch gesunken. Es gibt immer noch keine Hinweise auf eine Änderung der Kext-Verwendung: Die Ausgabe des obigen Befehls bleibt unverändert.

Bearbeiten : Fehler als Nr. 22701036 gemeldet. Ich warte immer noch auf eine Antwort von Apple. Es gibt nichts besonders Interessantes, wenn Sie den Prozess in ActivityMonitor überprüfen, aber vielleicht fehlt mir etwas.


Ich bin über zwei Dinge verwirrt - könnten Sie das klarstellen? 1) Ich denke, Ihr diffBefehl vergleicht die Spalten Sizeund Wiredaus der kextstatAusgabe. Ich bin damit einverstanden, dass Size"zugeordneter Speicher" ist, aber ich glaube nicht, dass Wired"erwartet wird, zugewiesen zu werden" ( man kextstatbeschreibt es als "die Anzahl der verkabelten Bytes des Kernel-Speichers, die der Text belegt"). 2) Sehen Sie die Diskrepanz zwischen Sizeund Wiredwann Sie das Problem mit der Vorschau haben?
Ashley

1) Sie haben Recht - ich vergleiche die Elemente in Größe und Verkabelt von kextstat. Mein Verständnis ist , dass , wenn ein kext undicht ist , dann die zugeteilten Bytes und jene , dass der Kernel weiß , sind zugewiesen wird anders sein. In diesem Fall habe ich das dort abgelegt, um zu zeigen, dass ich keinen undichten Text habe - also 2) tritt dies nicht auf, wenn die Vorschau RAM isst. Stattdessen kernel_taskwächst viel. Ich werde versuchen, dieses Problem neu zu erstellen und ein Foto zu machen :-).
Landak

Vielen Dank! Warte eine Sekunde: Ich schreibe nur eine Antwort, die helfen könnte.
Ashley

Antworten:


6

Der Kern von OS X besteht nicht darin, dass Müll gesammelt wird. Für die libkern C ++ Runtime von IOKit müssen Entwickler ihren eigenen Speicher verwalten.

Mac-Speicherverwaltung

Von Wie funktioniert die Speicherverwaltung unter Mac OS X?

Apple dokumentiert die niedrigsten Ebenen des Mach-Kernels und des virtuellen Speichersubsystems im Web als Teil seiner Entwicklerdokumentation ziemlich gut.

Da dieser Kernel von der Carnegie Mellon University entwickelt wurde , finden Sie Dutzende von Artikeln , die ihn recht einfach beschreiben.

Andere Quellen

Müllabfuhr

Die Speicherbereinigung ist auf Benutzer- oder Anwendungsebene vorhanden. Selbst auf dieser Ebene hilft die Speicherbereinigung nur, wenn die Anwendung alle Ansprüche an den Speicher freigegeben hat. Eine zirkuläre Abhängigkeit kann die Speicherbereinigung zunichte machen. Die Müllabfuhr selbst ist ein sich entwickelndes Forschungsgebiet und schwer zu finden .

Fehler und Speicherlecks melden

Bei Fehlern in OS X geht Speicher verloren. Angesichts der Größe der Codebasis ist dies fast sicher.

Bitte melden Sie reproduzierbare Fehler direkt an Apple . Jeder Fehlerbericht hilft, und vielleicht hilft Ihr Beispiel den Apple-Ingenieuren dabei, die Ursache zu ermitteln.


Das ist enttäuschend, aber zweifellos richtig. Ich habe den Fehler Apple gemeldet - ich finde ihn nur ärgerlich!
Landak

2
Bitte können Sie die Fehlernummer als Bearbeitung für Ihre Frage freigeben. Andere, die Ihre Frage hilfreich finden, können dann doppelte Fehler melden, die Ihr Original notieren. Ein Haufen verwandter Fehler wird dazu beitragen, mehr Engineering-Zeit zu rechtfertigen.
Graham Miln

4

Ich gehe davon aus, dass Ihr Mac über eine integrierte GPU verfügt (z. B. Intel Iris Graphics).

Wenn Sie Ihre Abschlussarbeit in der Vorschau geöffnet haben, wird der Grafikkartenspeicher verwendet, um das Bild ("Textur") des Vorschaufensters und möglicherweise auch einige außerhalb des Bildschirms, aber dekodierte Seiten der Abschlussarbeit zu speichern.

Bei einer integrierten Grafikkarte befindet sich der Videospeicher tatsächlich (teilweise?) Im System-RAM, das von der CPU und der GPU gemeinsam genutzt wird. Bei einigen integrierten Grafikkarten wird die Menge des verwendeten System-RAM dynamisch zugewiesen (siehe Apple HT204349 ).

Ich würde vermuten, dass Sie zeitweise einen Fehler im Grafikkartentreiber und / oder in der Vorschau sehen, der den Systemspeicher nicht korrekt freigibt, wenn die Vorschau Ihre Abschlussarbeit als PDF neu lädt. (Dieser Fehler wird jedoch dadurch behoben, dass OS X / der Treiber den Speicher korrekt freigibt, wenn die Vorschau beendet wird.)

Sie können versuchen, die Ausgabe von zu überprüfen kextstatund festzustellen, ob die Zahlen in der SizeSpalte zunehmen, wenn das Problem auftritt. Meine Theorie ist, dass die von Ihnen erwähnte Erhöhung um 8 GB auf den Grafikkartentreiber zurückzuführen ist.

Der folgende Befehl (von einem Kommentar zu dieser verwandten und interessanten Antwort ) sortiert die Ausgabe den kextstates einfacher zu machen , um zu sehen , welche kext die meisten Speicher verwendet (obwohl Notieren Sie sich diese Art durch die WiredSpalte ... gibt es eine ähnliche, einfache Beschwörung in diesem Antworten Sie mit einer Erklärung, wenn Sie dies optimieren möchten.

kextstat | awk 'NR==1{ printf "%10s %s\n", $5, $6; } NR!=1{ printf "%10d %s\n", $5, $6; }' | sort -n

Gute Vermutung - und vielen Dank für eine nützliche, sortierte Ausgabe von kextstat. Es sieht jedoch immer noch nicht so aus, als ob dies tatsächlich der Fall ist: Während des Vorschau-Verschlingens blieb der Speicherbedarf von com.apple.nvidia.driver.*unverändert. Ich habe meine Frage bearbeitet, um dies widerzuspiegeln.
Landak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.