Puede.
Hay dos condiciones diferentes de falta de memoria que puede encontrar en Linux. Lo que encuentre depende del valor de sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
Introducción:
el núcleo puede realizar lo que se denomina "sobrecompromiso de memoria". Esto es cuando el núcleo asigna a los programas más memoria de la que realmente está presente en el sistema. Esto se hace con la esperanza de que los programas no usen toda la memoria que asignaron, ya que esto es algo bastante común.
overcommit_memory = 2
Cuando overcommit_memory
se establece en 2
, el kernel no realiza ningún compromiso excesivo en absoluto. En cambio, cuando se asigna memoria a un programa, se garantiza el acceso para tener esa memoria. Si el sistema no tiene suficiente memoria libre para satisfacer una solicitud de asignación, el kernel simplemente devolverá un error para la solicitud. Depende del programa manejar con gracia la situación. Si no comprueba que la asignación se realizó correctamente cuando realmente falló, la aplicación a menudo encontrará una falla de seguridad.
En el caso de la segfault, debe encontrar una línea como esta en la salida de dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
Esto at 0
significa que la aplicación intentó acceder a un puntero no inicializado, que puede ser el resultado de una llamada de asignación de memoria fallida (pero no es la única forma).
overcommit_memory = 0 y 1
Cuando overcommit_memory
se establece en 0
o 1
, se habilita el sobrecompromiso, y los programas pueden asignar más memoria de la que realmente está disponible.
Sin embargo, cuando un programa quiere usar la memoria que le fue asignada, pero el núcleo descubre que en realidad no tiene suficiente memoria para satisfacerlo, necesita recuperar algo de memoria. Primero intenta realizar varias tareas de limpieza de memoria, como vaciar cachés, pero si esto no es suficiente, terminará un proceso. Esta terminación es realizada por el OOM-Killer. El OOM-Killer observa el sistema para ver qué programas están usando qué memoria, cuánto tiempo han estado ejecutándose, quién los está ejecutando y una serie de otros factores para determinar cuál es el que se mata.
Después de que el proceso ha finalizado, la memoria que estaba usando se libera y el programa que acaba de causar la falta de memoria ahora tiene la memoria que necesita.
Sin embargo, incluso en este modo, a los programas todavía se les pueden denegar las solicitudes de asignación. Cuando overcommit_memory
es así 0
, el kernel intenta adivinar cuándo debería comenzar a denegar las solicitudes de asignación. Cuando se establece en 1
, no estoy seguro de qué determinación utiliza para determinar cuándo debe rechazar una solicitud, pero puede rechazar solicitudes muy grandes.
Puede ver si el OOM-Killer está involucrado mirando la salida de dmesg
y encontrando mensajes como:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB