Sin intercambio: ¿qué sucede?

8

En mi máquina Debian VM con 512 MB de RAM y 348 MB de intercambio, ¿qué sucederá si abro un archivo de 1 GB en un editor y me quedo sin memoria?

¿Bloqueará el sistema? O si no, ¿cómo manejará Linux esto?

¿No sería prudente instalar Swapspace para que, de ser necesario, se cree suficiente intercambio de forma automática y dinámica?

sudo apt-get install swapspace
rubo77
fuente
¿Por qué no le das más Swap?
Guntbert
El espacio en el disco duro es costoso en mi VM
rubo77
1
Tenga en cuenta que algunos editores simplemente mapean el archivo y no lo cargan todo por adelantado, esto soluciona el problema por completo, ya que usan el archivo fuente como 'intercambio'.
Vality

Respuestas:

17

Depende de la configuración con la que se esté ejecutando, en particular la sobrecompromiso de memoria ( /proc/sys/vm/overcommit_memory; ver man 5 procpara más detalles).

Si se deshabilita el exceso de memoria, el intento del editor (y posiblemente otros programas que intenten al mismo tiempo) intentar asignar memoria fallará. Obtendrán un resultado de falla de la llamada al sistema. Depende de cada programa manejar esto, aunque un resultado desafortunadamente común es que el programa se bloquee. El editor también puede, por ejemplo, simplemente negarse a abrir el archivo.

Si el exceso de memoria está habilitado, entonces la llamada del sistema que solicita memoria puede tener éxito. En ese caso, cuando se accede realmente a la memoria, el núcleo notará que no tiene memoria y eliminará un proceso para recuperar la memoria. Ese proceso puede o no ser el editor. La elección se rige por oom_score(el resultado de varias heurísticas del núcleo) y oom_score_adj(configurada) de cada proceso en el sistema. Esos también están en esa página de manual de proc (5).

derobert
fuente
5

Hay un gran problema en Linux en este caso si te acercas a la condición de falta de memoria: notarás que todo tu sistema deja de responder porque comienza a intercambiarse mucho. Incluso el cursor del mouse puede volverse tan 'lento' que no puede iniciar un terminal y eliminar manualmente un proceso ofensivo de comedor de memoria. Esto se debe a la gran cantidad de operaciones de disco.

Para evitar esta situación, personalmente normalmente desactivo completamente el intercambio, por lo que el kernel de Linux siempre responde y, en el peor de los casos, el asesino de falta de memoria (OOM) matará algún proceso. La lógica de qué proceso es eliminado por OOM depende de la versión del kernel.

Entonces la respuesta es no: no habilite la asignación dinámica de intercambio. Te enfrentarás a la máquina se cuelga.

Es fácil probarlo con un programa que asigna constantemente algo de memoria en un bucle. Guarde este programa en un archivo de texto memeater.c:

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Luego compílalo:

$ gcc memeater.c -o memeater

y correr:

$ ./memeater

Pruébelo con swap, sin swap y con su asignación dinámica de swap.

Además, tenga en cuenta que, en la mayoría de los casos, esta condición de OOM se debe a un error en el software (pérdida de memoria) o ha hecho algo incorrecto como "cargar este archivo de 10 GB en el editor" o "ejecutar demasiados tamaños de archivos gráficos en paralelo" y hacer La conclusión: ¿Necesita intercambio o no?

gena2x
fuente
1
+1 por sugerir el método simple de probarlo usted mismo
rubo77
1
Responde a la segunda pregunta "¿es buena idea utilizar la asignación dinámica de intercambio"
gena2x
@ gena2x Sí, es una muy buena idea, porque hace que su sistema sea más receptivo en situaciones sobrecargadas, en lugar de matar sus tareas una tras otra. -1. Aunque es mejor si tiene una partición de intercambio grande y fija, pero tiene otra causa (fragmentación de intercambio reducida).
peterh - Restablece a Mónica el
Si tiene un gran intercambio fijo, su sistema dejará de responder porque trataría de intercambiar tareas activas en el disco y las volvería a intercambiar para siempre.
gena2x