Sirviendo información sobre Linux desde 1998

Sobre-asignación de memoria.

Imagen de orvtech

La sobre-asignación de memoria lograda con memory_overcommit nos permite ejecutar mas programas y programas mas grandes en equipos con una variedad de configuraciones de memoria física asumiendo que muchos de los programas que están corriendo pidieron mas memoria que lo que en realidad están usando.

El kernel controla la asignación y sobre-asignación de memoria, dejando que un programa reserve mas memoria de la que hay disponible, esto no significa que en realidad esta cantidad de memoria se vaya a usar.

Uno puede manipular el valor de memory_overcommit en el kernel con los valores 0, 1 o 2. Cada uno de estos valores afectan de la siguiente forma la asignación de memoria:

  1. Se usa heurística para asignar la memoria, sobre-asignación de punteros a espacio en memoria son denegados y es usado en la mayoría de los sistemas. Este se asegura que la sobre-asignación no se de a niveles brutales pero que al mismo tiempo se reduzca el uso de el espacio swap. Al usuario root se le permite que asigne un poco mas de memoria en este modo. este es el modo que la mayoría de las instalaciones de linux usan por defecto.
  2. Siempre sobre-asigna, es muy apropiado para aplicaciones científicas.
  3. Nunca sobre-asigna. No se le permite al espacio total de memoria que exceda el tamaño de swap mas un porcentaje configurable (por defecto 50%) de la memoria física (RAM). Dependiendo en este porcentaje, en la mayoría de las situaciones un proceso no sera matado por usar memoria que ya esta asignada a otro proceso pero dará errores de asignación de memoria de acuerdo a la situación.

Cuando podemos asignar 1 a memory_overcommit?

Esta practica es muy común en situaciones donde podemos estar seguros de que no vamos usar toda la RAM que estamos asignándole a estos proceso, por ejemplo en un ambiente de virtualizacion. Tenemos un servidor real con 3GB de RAM, podemos fácilmente crear mas de 6 servidores virtuales, cada uno con 512MB de RAM... sera muy difícil que cada uno de estos servers usen los 512MB al mismo tiempo y dejen al kernel sin RAM.

Cuando asignar memory_overcommit a 2?

En ocasiones hace falta desactivar por completo la sobre-asignación de memoria, usemos el caso de postrgres que ya tiene un sistema para protegerse de esto. Cuando se queda sin memoria, simplemente aborta la transacción y el servicio sigue corriendo sin problema alguno. El usuario puede volver a intentar el query y si la falta de memoria era temporal pues es muy posible que el query pase.

Si tenemos un servidor dedicado a Postgres y no asignamos 2 a memory_overcommit el va a pensar que tiene mas memoria de la disponible y va a intentar usarla por tanto en el caso anterior Posrgres intentara procesar el query que requería mas memoria de la que el sistema disponía. Tan pronto el kernel se de cuenta de que en realidad no tenia esa cantidad de RAM, el kernel matara este proceso y el servicio sera terminado forzosamente, todos los procesos activos serán terminados y las conexiones serán cerradas.

Articulos vinculados:
Archivos swap y paralelización de espacio swap.

Cuanto le pongo de swap a mi instalación de Linux?.

Articulo fuente: Sobre-asignación de memoria