¿Por qué QEMU no puede asignar la memoria si las cachés de Linux son demasiado grandes?

9

Si uso mi máquina [Ubuntu 16.04 64 bit, kernel 4.4] por un tiempo, QEMU necesita que se eliminen los cachés del kernel, de lo contrario, no logrará asignar la RAM.

¿Por que sucede?

Esta es una muestra de ejecución:

~$ 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
fuente
44
Porque no tienes ningún intercambio.
Michael Hampton

Respuestas:

19

No todos los datos almacenados en caché se pueden descartar de inmediato. Por ejemplo, las páginas sucias almacenadas en caché deben volver a escribirse en el disco antes de que puedan eliminarse de la RAM. No tiene intercambio, así que hasta que esas escrituras se completen, simplemente no hay suficiente espacio disponible para QEMU.

Realmente debería agregar una cantidad razonable de intercambio. No puede esperar que el administrador de memoria haga un buen trabajo con una mano atada a la espalda.

David Schwartz
fuente
1
Como pregunta teórica (ya que me gustaría aprender más sobre cómo funciona realmente la administración de memoria), ¿por qué el administrador no puede retrasar (bloquear) los intentos de asignación de memoria de QEMU mientras se vuelven a escribir las páginas sucias?
nanofarad
2
@hexafraction Solo una suposición: probablemente sea técnicamente posible (pero podría agregar una complejidad significativa, no estoy seguro), pero los desarrolladores del kernel probablemente argumentarán que no hay necesidad de esa característica, porque el único problema que resuelve es causado por no tener intercambio, que también causa otros problemas, todos los cuales se solucionan si solo habilita el intercambio y deja que el núcleo administre la memoria de la manera en que ya está codificado para que funcione bien.
mtraceur
1
@hexafraction El kernel no tiene idea de que es algo sensato. Para algunas aplicaciones, eso no tiene sentido, por lo que no es la política general. QEMU optó por no hacer eso.
David Schwartz
2
@hexafraction Realmente, ¿le gustaría que esperar 30 segundos o varios minutos - - para su malloc()llamada a tal vez encontrar suficiente memoria?
Michael Hampton
3
@hexafraction Piénsalo de esta manera. Si el núcleo teóricamente tuviera esta característica para bloquear un tiempo si un malloc fallara, no habría forma de lograr el comportamiento actual sin API adicionales. Por otro lado, la implementación actual permite que el software que quiera esperar y reintentar un tiempo vuelva a intentar malloc en un ciclo lento hasta que esté satisfecho.
Vality