Hors échange - que se passe-t-il?

8

Sur ma machine Debian VM avec 512 Mo de RAM et 348 Mo de swap, que se passera-t-il si j'ouvre un fichier de 1 Go dans un éditeur et que je manque de mémoire?

Va-t-il planter le système? Sinon, comment Linux va-t-il gérer cela?

Ne serait-il pas judicieux d'installer Swapspace donc si nécessaire, il sera créé suffisamment de swap automatiquement et dynamiquement?

sudo apt-get install swapspace
rubo77
la source
Pourquoi ne lui donnez-vous pas plus de Swap?
guntbert
L'espace disque dur est cher sur ma machine virtuelle
rubo77
1
Notez que certains éditeurs se contentent de mapper le fichier et ne le chargent pas tout de suite, cela résout entièrement le problème car ils utilisent le fichier source lui-même comme «échange».
Vality

Réponses:

17

Cela dépend des paramètres que vous utilisez, en particulier de la surcharge de mémoire ( /proc/sys/vm/overcommit_memory; voir man 5 procpour plus de détails).

Si la surcharge de mémoire est désactivée, la tentative d'allocation de mémoire de l'éditeur (et éventuellement d'autres programmes tentant en même temps) échouera. Ils obtiendront un résultat d'échec de l'appel système. C'est à chaque programme de gérer cela, bien qu'un résultat malheureusement courant soit que le programme plante. L'éditeur peut également, par exemple, simplement refuser d'ouvrir le fichier.

Si la surcharge mémoire est activée, l'appel système demandant de la mémoire peut bien réussir. Dans ce cas, lorsque la mémoire est réellement accessible, le noyau remarquera sa mémoire insuffisante et tuera un processus pour récupérer de la mémoire. Ce processus peut être ou non l'éditeur. Le choix est régi par oom_score(le résultat de plusieurs heuristiques du noyau) et oom_score_adj(configuré) de chaque processus sur le système. Celles-ci figurent également dans la page de manuel proc (5).

derobert
la source
5

Il y a un énorme problème sous Linux dans ce cas si vous vous approchez de la condition de mémoire insuffisante - vous remarquerez que l'ensemble de votre système ne répond plus du tout car il commence beaucoup de permutation. Même le curseur de votre souris peut devenir si «lent» que vous ne pouvez pas démarrer un terminal et tuer manuellement un processus de mangeur de mémoire incriminé. Cela est dû au grand nombre d'opérations sur disque.

Pour éviter cette situation, personnellement, je désactive généralement complètement le swap, donc le noyau Linux est toujours réactif et dans le pire des cas, le tueur de mémoire insuffisante (OOM) tuera certains processus. La logique du processus tué par le MOO dépend de la version du noyau.

La réponse est donc non - n'activez pas l'allocation dynamique de swap. Vous ferez face à un blocage de la machine.

Il est facile de l'essayer avec un programme qui alloue constamment de la mémoire en boucle. Enregistrer ce programme dans un fichier texte, memeater.c:

#include <stdlib.h>

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

Ensuite, compilez-le:

$ gcc memeater.c -o memeater

et courir:

$ ./memeater

Essayez-le avec swap, sans swap et avec votre allocation de swap dynamique.

En outre, gardez à l'esprit que dans la plupart des cas, cette condition de MOO se produit en raison d'un bogue dans le logiciel (fuite de mémoire) ou que vous avez fait quelque chose de mal comme «charger ce fichier de 10 Go dans l'éditeur» ou «exécuter trop de redimensionnements de fichiers graphiques en parallèle» et faire la conclusion: avez-vous besoin de swap ou non?

gena2x
la source
1
+1 pour avoir suggéré la méthode simple de le tester vous
rubo77
1
Il répond à la deuxième question "est-ce une bonne idée d'utiliser l'allocation dynamique de swap".
gena2x
@ gena2x Oui, c'est une très bonne idée, car elle rend votre système plus réactif dans des situations surchargées, au lieu de tuer vos tâches les unes après les autres. -1. Bien que le meilleur si vous avez une grande partition de swap fixe, mais il a une autre cause (fragmentation de swap réduite).
peterh
Si vous avez un gros échange fixe, votre système ne répondra plus, car il essaiera d'échanger les tâches actives sur le disque et les échangera pour toujours.
gena2x