Articulo de referencia

Fuera de memoria

Mensaje de error de memoria insuficiente en un sistema que ejecuta Debian 12 (núcleo de Linux 6.1.0-28). El error de falta de memoria ( OOM , por sus siglas en inglés) es una si...

Mensaje de error de memoria insuficiente en un sistema que ejecuta Debian 12 (núcleo de Linux 6.1.0-28).

El error de falta de memoria ( OOM , por sus siglas en inglés) es una situación a menudo indeseada en el funcionamiento de un ordenador , en la que no se puede asignar memoria adicional para su uso por parte de los programas o el sistema operativo . En tal caso, el sistema no podrá cargar ningún programa adicional y, dado que muchos programas pueden cargar datos adicionales en la memoria durante su ejecución, dejarán de funcionar correctamente. Esto suele ocurrir porque se ha asignado toda la memoria disponible, incluido el espacio de intercambio del disco .

Historia

Históricamente, la condición de falta de memoria era más común que ahora, ya que las primeras computadoras y sistemas operativos estaban limitados a pequeñas cantidades de memoria RAM física debido a la incapacidad de los primeros procesadores para direccionar grandes cantidades de memoria, así como a consideraciones de costo. Desde la llegada de la memoria virtual, que abrió la puerta al uso del espacio de intercambio, la condición es menos frecuente. Casi todos los programas modernos esperan poder asignar y liberar memoria libremente en tiempo de ejecución, y tienden a fallar de forma incontrolada (bloquearse) cuando no se cumple esa expectativa; los programas más antiguos a menudo asignaban memoria solo una vez, verificaban si tenían suficiente para realizar todo su trabajo y luego no esperaban más. Por lo tanto, fallaban inmediatamente con un mensaje de error de "memoria insuficiente" (OOME) o funcionaban como se esperaba.

Los primeros sistemas operativos, como MS-DOS, carecían de soporte para la multitarea . A los programas se les asignaba memoria física que podían usar según sus necesidades. La memoria física solía ser un recurso escaso, y cuando se agotaba por aplicaciones como aquellas con la función de finalización y permanencia en el sistema , no se podían iniciar más aplicaciones hasta que se cerraran las que estaban en ejecución.

Los sistemas operativos modernos proporcionan memoria virtual, en la que a los procesos se les asigna un rango de memoria, pero donde esta memoria no se corresponde directamente con la RAM física real. La memoria virtual puede estar respaldada por la RAM física, un archivo de disco mediante mmap (en derivados de Unix ) o MapViewOfFile (en Windows), o espacio de intercambio, y el sistema operativo puede mover las páginas de memoria virtual según sea necesario. Dado que la memoria virtual no necesita estar respaldada por memoria física, su agotamiento es poco frecuente, y generalmente existen otros límites impuestos por el sistema operativo al consumo de recursos. (Por ejemplo, Windows utiliza la contabilidad de cargos de confirmación para limitar el tamaño de la memoria virtual).

Tal como predice la ley de Moore , la cantidad de memoria física en todos los ordenadores ha crecido de forma casi exponencial, aunque esto se compensa en cierta medida con el aumento del tamaño de los programas y archivos. En algunos casos, un ordenador con soporte para memoria virtual, donde la mayor parte de los datos cargados reside en el disco duro, puede quedarse sin memoria física pero no sin memoria virtual, lo que provoca una paginación excesiva . Esta situación, conocida como saturación de memoria , suele dejar el ordenador inutilizable hasta que se cierran algunos programas o se reinicia. Por estos motivos, las aplicaciones en ordenadores modernos rara vez encuentran un mensaje de falta de memoria.

Sin embargo, todavía es posible encontrarse con una condición de OOM en una computadora moderna. El caso típico de OOM en computadoras modernas ocurre cuando el sistema operativo no puede crear más memoria virtual, porque todos sus dispositivos de respaldo potenciales se han llenado o el usuario final los ha deshabilitado. La condición puede surgir debido a la copia en escritura después de fork().

Recuperación

Los núcleos de sistemas operativos como Linux intentarán recuperarse de este tipo de condición OOM terminando uno o más procesos, un mecanismo conocido como OOM Killer . [ 1 ] [ 2 ] Linux 4.6 (lanzado en mayo de 2016) introdujo cambios en las situaciones OOM, mejorando la detección y la confiabilidad. [ 3 ] [ 4 ] La conciencia de cgroup en OOM killer se implementó en el núcleo de Linux 4.19 lanzado en octubre de 2018, que agrega la capacidad de terminar un cgroup como una sola unidad. [ 5 ]

Debido a la activación tardía de OOM Killer en algunos sistemas Linux, [ 6 ] existen varios demonios y parches del kernel que ayudan a recuperar la memoria de una condición OOM antes de que sea demasiado tarde.

  • earlyoom[ 7 ]
  • nohang[ 8 ]
  • systemd-oomd
  • Los parches del kernel PSI (pressure stall information) y el oomddemonio que los acompaña se fusionaron en el kernel de Linux 4.20. [ 9 ] [ 10 ]

Límites de memoria por proceso

Además de los límites de memoria física del sistema, algunos sistemas limitan la cantidad de memoria que cada proceso puede usar. Generalmente, se trata de una cuestión de política, y esta limitación también puede ocurrir cuando el sistema operativo tiene un espacio de direcciones mayor que el disponible a nivel de proceso. Algunos sistemas de 32 bits de gama alta (como aquellos con Extensión de Dirección Física habilitada) vienen con 8 gigabytes o más de memoria del sistema, aunque cualquier proceso individual solo puede acceder a 4 GB en un modelo de memoria plana de  32 bits .

Un proceso que supera su límite por proceso y luego intenta asignar más memoria encontrará una condición de error. Por ejemplo, la función estándar de C para asignar memoria, malloc(), devolverá NULL si falla la asignación y una aplicación bien comportada debería manejar esta situación. C++ estándar operator newlanzará bad_allocen caso de fallo, aunque no necesariamente cuando se agota la RAM física, sino más bien cuando falla la asignación de memoria virtual. En Java , si la Máquina Virtual de Java (JVM) se queda sin memoria, lanzará OutOfMemoryError, y en C# , OutOfMemoryExceptionse lanza un . Las bibliotecas POCO C++ tienen una OutOfMemoryExceptionclase que lanza si se MemoryPoolqueda sin memoria.

Referencias

  1. OOM Killer de Linux
  2. "Cómo configurar el mecanismo de eliminación de procesos por falta de memoria de Linux" . Consultado el 19 de febrero de 2015 .
  3. "Hacia un manejo de memoria fuera de línea más predecible y confiable [ LWN.net ] " . lwn.net .
  4. "Linux_4.6 - Linux Kernel Newbies" . kernelnewbies.org .
  5. "Linux_4.19 - Linux Kernel Newbies" . kernelnewbies.org .
  6. "Núcleo de Linux: ¿Es posible hacer que el OOM killer intervenga antes?" . Super User . Consultado el 7 de marzo de 2021 .
  7. rfjakob (7 de marzo de 2021), rfjakob/earlyoom , GitHub , consultado el 7 de marzo de 2021
  8. Avramov, Alexey (5 de marzo de 2021), hakavlad/nohang , GitHub , consultado el 7 de marzo de 2021
  9. "linux-psi.git - Métricas de presión de recursos de Linux" . git.cmpxchg.org . Archivado del original el 22 de enero de 2021. Consultado el 7 de marzo de 2021 .
  10. facebookincubator/oomd , Incubadora de Facebook, 3 de marzo de 2021 , consultado el 7 de marzo de 2021
  • Manejo de falta de memoria
  • Artículo " Minimización del uso de memoria para la creación de subprocesos de aplicaciones " Archivado el 12 de junio de 2006 en Wayback Machine por Greg Nakhimovsky
  • Artículo " Cómo domar al asesino OOM " de Goldwyn Rodrigues
  • Artículo " Cuando Linux se queda sin memoria " de Mulyadi Santosa
  • Artículo " Cómo gestionar los errores de "Memoria insuficiente" archivado el 25/02/2021 en Wayback Machine " por John Boyland
Obtenido de " https://en.wikipedia.org/w/index.php?title=Out_of_memory&oldid=1353212512 "