Perché QEMU non può allocare la memoria se le cache di Linux sono troppo grandi?


9

Se uso la mia macchina [Ubuntu 16.04 64 bit, kernel 4.4] per un po ', QEMU ha bisogno di eliminare le cache del kernel, altrimenti non riuscirà ad allocare la RAM.

Perché succede?

Questa è una corsa di esempio:

~$ 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

4
Perché non hai alcuno scambio.
Michael Hampton,

Risposte:


19

Non tutti i dati memorizzati nella cache possono essere immediatamente eliminati. Ad esempio, le pagine sporche memorizzate nella cache devono essere riscritte su disco prima di poter essere rimosse dalla RAM. Non hai swap, quindi fino a quando quelle scritture non sono complete, semplicemente non c'è abbastanza spazio disponibile per QEMU.

Dovresti davvero aggiungere una quantità ragionevole di swap. Non puoi aspettarti che il gestore della memoria faccia un buon lavoro con una mano legata dietro la schiena.


1
Come domanda teorica (poiché vorrei saperne di più su come funziona effettivamente la gestione della memoria) perché il gestore non può ritardare (bloccare) i tentativi di allocazione della memoria di QEMU mentre le pagine sporche vengono riscritte?
nanofarad,

2
@hexafraction Solo un'ipotesi: è probabilmente tecnicamente possibile (ma potrebbe aggiungere una complessità significativa, non sono sicuro), ma gli sviluppatori del kernel probabilmente sostengono che non c'è bisogno di quella funzionalità, perché l'unico problema che risolve è causato dal non avere swap, che causa anche altri problemi, tutti risolti se si abilita lo scambio e si lascia che il kernel gestisca la memoria nel modo in cui è già codificato per fare bene.
mtraceur,

1
@hexafraction Il kernel non ha idea che sia una cosa sensata da fare. Per alcune applicazioni, non ha senso, quindi non è la politica generale. QEMU ha deciso di non farlo.
David Schwartz,

2
@hexafraction Davvero, vorresti aspettare 30 secondi - o diversi minuti - affinché la tua malloc()chiamata trovi forse abbastanza memoria?
Michael Hampton,

3
@hexafraction Pensaci in questo modo. Se il kernel avesse teoricamente questa funzione per bloccare un po 'se un malloc altrimenti fallisse, non ci sarebbe modo di ottenere il comportamento attuale senza API aggiuntive. D'altra parte, l'implementazione corrente consente al software che desidera attendere e riprovare un po 'di riprovare malloc in un ciclo lento fino a quando non è soddisfatto.
Validità
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.