¿Puedo hacer que la máquina virtual use espacio de intercambio (archivo de intercambio) como memoria al realizar una sobrecompromiso?

¿Puedo hacer que la máquina virtual use espacio de intercambio (archivo de intercambio) como memoria al realizar una sobrecompromiso?

Estoy haciendo algunos experimentos con VM y KVM. Estoy tratando de darme cuenta del hecho del compromiso excesivo y el espacio de intercambio. Al principio, permítanme mostrarles la configuración del sistema y la configuración asociada que realicé para este experimento.

Mi sistema informático host tiene:

  1. Memoria (DRAM): 16 GB
  2. espacio de intercambio (partición de intercambio): 32 GB
  3. SSD: 512GB

y mi VM tiene:

  1. Memoria: 4GB
  2. espacio de intercambio (partición de intercambio): 8 GB
  3. Capacidad del disco virtual: 20 GB

Si limito el recurso de memoria de la VM de 4 GB a 1 GB mediante la interfaz cgroup. En esta situacióncompromiso excesivoocurre. Luego traté de resolver esto porespacio-wapy revisadovmstatsi funcionó o no. Parece que no utiliza el espacio de intercambio como memoria.

¿Por qué mi VM no usó espacio de intercambio durante una situación de compromiso excesivo?

Respuesta1

Creo que la parte que te estás perdiendo es lo que significa "compromiso excesivo".

El compromiso excesivo no es un truco que se pueda utilizar para tener más recursos de los que ha obligado al sistema a tener. Es una técnica para actuar como si hubiera más recursos.

El concepto básico es que la mayoría de los programas asignarán más memoria de la que realmente utilizan. Por ejemplo, pueden asignar 32 KB de RAM para leer un archivo de sólo 57 bytes. Lo leen y de hecho usan una página de memoria para eso. Pero aún quedaban 32.000 asignados. Tenga en cuenta que este ejemplo es de los años 90 y, hoy en día, la asignación y el archivo son mayores, pero el punto es que la memoria adicional sigue siendo un compromiso que nunca se recopilará.

Si no me equivoco, esto incluso sucede en algunos programas que no lo hacen conscientemente, porque cargan bibliotecas que lo hacen, e incluso cargar esas bibliotecas lo hace: el vinculador asigna suficiente memoria para la biblioteca, pero solo las rutinas. que realmente se invocan se cargan realmente. Probablemente será memoria compartida, por lo que el efecto se minimiza, pero sigue ahí.

La cantidad de compromiso excesivo que se produce depende en gran medida de los programas invocados y de cómo se utilizan. Si un programa se ejercita muy a fondo, probablemente utilizará más de algunas de sus bibliotecas. Los programas que llaman a calloc en lugar de malloc no muestran un compromiso excesivo, porque calloc escribe en cada byte del espacio asignado, lo que requiere que el sistema operativo cumpla con el compromiso solicitado, incluso si la porción real de esa memoria que se utilizará será mucho menor. Algunos programas son mucho más cuidadosos al asignar solo la cantidad exacta de memoria que necesitan, mientras que otros dependen del sistema operativo para soportar un compromiso excesivo que les permita ser pragmáticos en sus estructuras de datos.

Si las aplicaciones en su servidor que ha limitado a usar 1 GB realmente logran intentar acceder a un GB completo de páginas, utilizará el intercambio de 8 GB que configuró para poder usar. Pero no usa eso para comprometerse demasiado. Técnicamente, no utiliza un compromiso excesivo hasta que asigna más allá de los 9 GB de VM que realmente tiene.

Dicho esto, esto es Linux, y lo que recuerdo al intentar llevar a Linux a la máxima asignación de memoria sin permitir un compromiso excesivo es que tiende a fallar un poco pronto: mantuvo cierta reserva para varias cosas, como una pequeña cantidad de caché de archivos y demás. . Esa experiencia fue hace más de una década, pero no veo ninguna razón particular para que eso cambie; Tener memoria para poder realizar E/S de archivos es importante.

información relacionada