Profilerstellung für die kmalloc-Nutzung

Profilerstellung für die kmalloc-Nutzung

Ich scheine einen Speicherverlust im Kernelspeicher zu haben. Slab zeigt, dass kmalloc-4096 kontinuierlich und in gleichmäßigem Tempo wächst, bis es alle RAM-Ressourcen des Systems monopolisiert und einen Swap erzwingt.

Free zeigt einen Großteil dieser Speichernutzung als Cache an, verweigert aber die Freigabe bei Bedarf oder sogar bei Markierung zur manuellen Löschung. Ein Beispiel für das, was wir sehen:

$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
              total        used        free      shared  buff/cache   available
Mem:            15G        4.4G        166M        280M         10G        104M
Swap:           15G        7.8G        8.1G
              total        used        free      shared  buff/cache   available
Mem:            15G        4.4G        186M        280M         10G        115M
Swap:           15G        7.8G        8.1G

Sollte ich kmalloc profilieren, um das Leck zu ermitteln? Wenn ja, wie gehe ich dabei vor?

Dies ist eine Standardinstallation von Ubuntu 16.04 auf einem Intel i5 Skylake.

$ uname -a
Linux fire 4.4.0-78-generic #99-Ubuntu SMP Thu Apr 27 15:29:09 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

Antwort1

Die „Synchronisierung“ reduziert den Buff/Cache nicht, sondern fordert lediglich an, dass die Daten an die Blockgeräte gesendet werden. Der Sinn des Caches besteht darin, dass die Daten in den RAM-Caches verbleiben. Das Senden einer 3 an drop_caches wartet auch nicht darauf, dass die Caches gelöscht werden. Könnten Sie vor dem „Freigeben“ ein „sleep 60“ hinzufügen? Dies könnte etwas Zeit zum Löschen des Speichers geben, bevor eine Meldung von „Freigeben“ erfolgt.

Das Hinterlassen von „watch -n60 cat /proc/meminfo“ könnte dabei helfen, den wachsenden Speicherbereich anzuzeigen, aber Cache und Buff sind nicht nur Lecks. Indem sie Speicher verbrauchen, erfüllen sie ihren Zweck und nutzen die verfügbaren Ressourcen Ihres Systems optimal.

Wenn ein Prozess auf die Festplatte ausgelagert wird, bedeutet das nicht automatisch, dass etwas Schlimmes passiert ist. Der Kernel tut das Richtige, wenn dieser Prozess nicht alle seine Seiten verwendet und inaktiv ist. Es besteht eine vernünftige Chance, dass auf einem Webserver der Inhalt im WWW-Stamm benötigt wird, bevor eine Kopie von Mutt im GNU-Bildschirm ausgeführt wird, wenn sich der Benutzer beispielsweise abgemeldet hat.

Wenn Sie immer noch der Meinung sind, dass der Kernel den RAM über Module verbraucht, können Sie dies mit folgendem Befehl etwas genauer untersuchen:

awk '{ print $2" "$1 }' /proc/modules  | sort -n

Verwenden Sie ZFS? Das verbraucht ziemlich viel RAM, aber wie der Cache versucht es, die Festplatten-E/A für den Fall der Fälle im RAM zu halten.

verwandte Informationen