Warum kann QEMU den Speicher nicht zuordnen, wenn die Linux-Caches zu groß sind?

9

Wenn ich meinen Computer [Ubuntu 16.04 64-Bit, Kernel 4.4] für eine Weile verwende, muss QEMU die Kernel-Caches löschen, da es sonst nicht gelingt, den RAM zuzuweisen.

Warum passiert das?

Dies ist ein Probelauf:

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        5427        3690          56        5931        4803
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1799        9446          56        3803        9414
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1502       10819          56        2727       10784
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
# Now QEMU starts
Marcus
quelle
4
Weil du keinen Tausch hast.
Michael Hampton

Antworten:

19

Nicht alle zwischengespeicherten Daten können sofort verworfen werden. Beispielsweise müssen zwischengespeicherte schmutzige Seiten auf die Festplatte zurückgeschrieben werden, bevor sie aus dem RAM entfernt werden können. Sie haben keinen Swap. Bis diese Schreibvorgänge abgeschlossen sind, ist einfach nicht genügend Speicherplatz für QEMU verfügbar.

Sie sollten wirklich eine angemessene Menge an Swap hinzufügen. Sie können nicht erwarten, dass der Speichermanager mit einer Hand hinter dem Rücken gute Arbeit leistet.

David Schwartz
quelle
1
Als theoretische Frage (da ich mehr darüber erfahren möchte, wie die Speicherverwaltung tatsächlich funktioniert), warum kann der Manager die Speicherzuweisungsversuche von QEMU nicht verzögern (blockieren), während die schmutzigen Seiten zurückgeschrieben werden?
Nanofarad
2
@hexafraction Nur eine Vermutung: Es ist wahrscheinlich technisch möglich (könnte aber eine erhebliche Komplexität hinzufügen, nicht sicher), aber die Kernel-Entwickler würden wahrscheinlich argumentieren, dass diese Funktion nicht erforderlich ist, da das einzige Problem, das sie löst, darin besteht, dass kein Swap vorhanden ist verursacht auch andere Probleme, die alle behoben werden, wenn Sie nur Swap aktivieren und den Kernel seine Speicherverwaltung so ausführen lassen, wie er bereits codiert ist.
mtraceur
1
@hexafraction Der Kernel hat keine Ahnung, dass dies sinnvoll ist. Für einige Anwendungen macht dies keinen Sinn, daher ist dies nicht die allgemeine Richtlinie. QEMU hat sich dagegen entschieden.
David Schwartz
2
@hexafraction Möchten Sie wirklich 30 Sekunden - oder einige Minuten - warten, bis Ihr malloc()Anruf möglicherweise genügend Speicherplatz findet?
Michael Hampton
3
@hexafraction Denken Sie so darüber nach. Wenn der Kernel theoretisch diese Funktion hätte, um eine Weile zu blockieren, wenn ein Malloc andernfalls ausfallen würde, gäbe es keine Möglichkeit, das aktuelle Verhalten ohne zusätzliche APIs zu erreichen. Andererseits ermöglicht die aktuelle Implementierung Software, die eine Weile warten und es erneut versuchen möchte, Malloc in einer langsamen Schleife zu wiederholen, bis es zufrieden ist.
Vality