Globo de memoria en el sistema operativo

13

Algunos hipervisores optimizan el uso de la memoria usando un método que se llama globo (al menos así lo llama KVM), este método deduplica la memoria entre máquinas virtuales y establece páginas comunes para solo lectura con copia en escritura.
Esto es más o menos lo contrario de una llamada fork.

¿Es factible implementar en un nivel de SO para procesos (estaba pensando principalmente en la duplicación de memoria cuando navegaba con Chromium con múltiples pestañas en el mismo sitio), ¿ya se ha implementado?

Didi Kohen
fuente

Respuestas:

14

En realidad, lo que ha descrito confunde el globo y la 'fusión de la misma página'. Trataré de elaborar los dos para hacer evidente la distinción.

Globo de memoria

Este es un truco para asegurarse de que parte de la memoria asignada a la máquina virtual invitada siga siendo utilizable por otro invitado o el propio host (cachés, etc.). Se realiza de la siguiente manera:

El kernel invitado se inyecta con un controlador, que monitorea el uso de la memoria del invitado y 'roba' parte de la memoria no utilizada (se la asigna en el espacio de memoria del invitado, asegurándose de que nada en este invitado pueda tocar ese rango).

Luego informa al núcleo del host que, de hecho, puede eliminar estas páginas de memoria del núcleo, que no se utilizarán en el invitado (hasta que el invitado experimente cierta presión de memoria, momento en el cual el globo se desinflará y usará estos rangos de nuevo).

En última instancia, el núcleo puede asignar exactamente la misma memoria a otro invitado y hacer que el uso de la memoria sea mucho más eficiente si los invitados se ejecutan con mucha memoria libre.

La misma fusión de páginas

Esta técnica identifica páginas de memoria idénticas, que por alguna razón ya no están marcadas 'cuasi-solo lectura' con copia en escritura, y las marca como tales.

Ahora, en el nivel del sistema operativo, hay una necesidad limitada de este tipo de trucos. Simplemente, la mayoría de las veces cuando tiene páginas de memoria idénticas, ya son de solo lectura (a veces incluso sin CoW), ya que se trata principalmente de código de aplicaciones, bibliotecas, etc. Se abren de forma nativa a través de un Mapa de Memoria, y así el núcleo puede mantener solo una copia de ellos en el núcleo (si es que hay alguno, también puede localizarlo por completo y permitir que se pague desde la tienda principal según sea necesario).

En el nivel del sistema operativo virtualizado, el mismo principio se aplica correctamente dentro de cada subsistema invitado. Sin embargo, el núcleo del host no tiene idea de si dos de los invitados están ejecutando principalmente el mismo código y, por lo tanto, comparten la misma memoria: los invitados no se comunican para coordinar eso.

Es por eso que ocasionalmente puede escanear todo el sistema en busca de páginas de memoria idénticas: la mayoría de las veces, serán idénticas en el sistema operativo invitado, no dentro de cada una, el kernel invitado hace un trabajo decente manteniendo la memoria ordenada dentro de su rango. Por lo tanto, en el entorno típico de VM, donde un núcleo host maneja más de 50 invitados, el ahorro de memoria puede ser bastante considerable.

Ambos a la vez

El globo y la fusión de la misma página pueden coexistir muy bien, logrando un sobrecompromiso de memoria bastante sustancial para sistemas idénticos.


Para responder a su pregunta, la misma fusión de páginas puede y, a veces, está habilitada a nivel de sistema operativo. Tiene que ver con el intercambio de páginas que se interpretan y, por lo tanto, podría terminar siendo idéntico sin tener el mismo archivo de respaldo.

En su ejemplo de Chromium, los archivos binarios del proceso ya están deduplicados a través del mapa de inicio de solo lectura, comparten exactamente el mismo espacio de memoria. Las memorias caché de página (contenido de las pestañas) generalmente también se comparten entre procesos (copia de escritura de solo lectura) debido a la forma en que se gestiona la memoria caché de disco: el mismo archivo en disco se puede abrir de forma simultánea entre diferentes procesos en la VM -optimal sentido.

La ventaja sería más evidente con el estado compartido de diferentes motores Javascript, pero no estoy seguro de si están asignados exactamente en el mismo diseño de memoria, lo que garantiza que toda la página de memoria sea idéntica.

Esto es diferente en los sistemas móviles. Android, por ejemplo, emplea ampliamente a KSM para deduplicar código idéntico entre diferentes aplicaciones.

En cualquier caso, puede habilitarlo usted mismo en Linux (Kernel SamePage Merging). El controlador exporta varias estadísticas que, después de leer esta respuesta, debería poder interpretar y tomar su propia decisión si es una buena combinación para su propósito.

https://www.kernel.org/doc/Documentation/vm/ksm.txt

qdot
fuente
3
La fusión de la misma página también se conoce como 'memoria trascendente', dependiendo del hipervisor (y la antigüedad de la misma).
Tim Post
Gracias, veo que KSM requiere que la aplicación sea consciente de ello, y desde una búsqueda (rápida), Chromium no es compatible a partir de ahora. Soy consciente de que los binarios están deduplicados, pero me estoy refiriendo principalmente a la salida JIT y las secuencias de comandos sin formato que ponen una gran presión en mi RAM ...
Las secuencias de comandos sin formato en Chromium también se deduplican: aterrizan en la memoria caché del disco como con todos los demás objetos web, y la memoria caché del disco se asigna, no se lee.
qdot
Las secuencias de comandos sin formato se asignan, pero incluso las secuencias de comandos comunes (como jQuery y Angular.js) se replican en la memoria caché y no coinciden entre sí, ya que hay un uso intensivo de CDN y réplicas exactas de los archivos de secuencia de comandos en los distintos servidores del sitio.
Esto probablemente debería terminar en el chat, pero me encantaría ver tus estadísticas del KSM de Linux.
qdot