Empêchez Ubuntu de geler, même si la mémoire système est faible

24

Parfois, je travaille avec d'énormes décharges de données que je souhaite conserver en mémoire pour le traitement. Parfois, je calcule mal la quantité de mémoire que mon programme va produire, ou un débogueur multiplie l'utilisation de la mémoire par un facteur qui dépasse ma mémoire disponible.

Chaque fois que je démarre un processus gourmand en mémoire, voici ce que j'attends d'un système d'exploitation sain: essayez de manger toute la mémoire libre, puis demandez à d'autres processus non essentiels de bien abandonner la mémoire dont ils n'ont pas besoin, puis écrire pour échanger.

Voici ce que Ubuntu fait pour moi: manger toute la mémoire libre, puis demander au système d'exploitation d'échanger tous les services essentiels (session gnome, terminal, clavier), puis geler et attendre que je débranche la prise d'alimentation.

Deux questions:

  1. Comment un système d'exploitation peut-il supposer que quelque chose pourrait être si important qu'il est possible d'arrêter d'écouter les entrées de l'utilisateur?
  2. Comment puis-je dire à Ubuntu de ne jamais échanger les services essentiels et de toujours réagir aux entrées des utilisateurs, même si un processus stupide essaie de consommer plus de ressources que le système n'en fournit.
Klamann
la source
Combien de RAM avez-vous installé? Quelle est la taille de votre swap (dans le terminal, tapez swaponpour le savoir)? Cheers, Al
heynnema
3
16 Go de RAM et 16 Go de swap. Mais ce n'est pas le point ici, ce problème ne peut pas être résolu en ajoutant plus de mémoire.
Klamann
1
Essayez l'une des deux choses. 1) changez le swappinessparamètre à 10, c'est- vm.swappiness = 10à- dire: dans /etc/sysctl.conf. Recherchez ici la permutation pour plus d'informations à ce sujet. 2) Si l'échange n'est pas utile ... Même si vous ne voulez pas ... augmenter la taille de votre fichier d'échange à 1,5x16G et voir si cela aide. Tiens moi au courant. Cheers, Al
heynnema
1
@Klamann Je suis d'accord que l'ajout de swap ne résoudra pas le problème. Une fois que vous avez un programme cassé consommant toute la RAM + SWAP, l'ajout de SWAP supplémentaire ne fait que retarder l'inévitable.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix, comme je l'ai dit, vm.swappiness=10doit être AJOUTÉ à sysctl.conf. Une personne expérimentée pourrait même utiliser la commande sysctl à la volée, pour définir vm.swappiness = 10, sans modifier le fichier sysctl.conf. A bientôt, Al ps: en attente de réponse de l'OP.
heynnema

Réponses:

5

Je n'ai toujours pas de solution au problème, mais je peux proposer deux solutions de contournement qui pourraient intéresser les autres:

1) earlyoom

C'est un service qui surveille l'utilisation de la mémoire et tue le processus qui consomme le plus de mémoire lorsqu'un certain seuil est atteint (voir aussi ceci et cette question concernant le tueur OOM dans le noyau linux)

Je l'ai testé avec un processus de démonstration qui demande indéfiniment de la mémoire en petits morceaux. Voici ma première impression: lorsque je démarre le processus escroc, il mange rapidement toute ma RAM. L'échange commence alors, le système ne répond plus. Quelques secondes plus tard, le système est de nouveau en ligne. Le journal de earlyoom montre qu'il a tué le processus de consommation de mémoire après que l'utilisation de la mémoire et du swap ait atteint 90%.

Il y a toujours le décalage ennuyeux lorsque l'échange commence et après la fin du processus, certaines parties d'autres processus restent généralement en échange jusqu'à ce qu'elles soient demandées, mais c'est un début.

2) désactivez simplement le swap

Je sais que c'est un sujet controversé , mais pour les systèmes de bureau et en particulier les machines de développement où il peut arriver de temps en temps qu'un processus essaie de consommer toute votre mémoire, cela a du sens: sans échange, le tueur OOM fonctionne simplement comme prévu. Lorsque vous manquez de mémoire, il trouve le meilleur processus pour tuer et s'en débarrasse. Pas de décalage, pas de retard.

Vous pouvez désactiver l'échange pour la session en cours avec sudo swapoff -aou rendre la modification permanente .


La bonne solution au problème serait bien sûr que le système reste réactif lorsque la mémoire principale est épuisée et qu'il commence à échanger la mémoire comme s'il n'y avait pas de lendemain, mais cela ne semble pas se produire de si tôt.

Klamann
la source
1
J'ai désactivé l'échange et mon système passe directement d'une mémoire faible (<100 Mo) au gel. Comment puis-je savoir si le tueur OOM est activé?
Michael
0

Essayez l'une des deux choses suivantes:

1) changez le paramètre de swappiness de son paramètre par défaut de 60, à 10, c'est -à- dire: ajoutez vm.swappiness = 10 à /etc/sysctl.conf (dans le terminal, tapez sudo gedit /etc/sysctl.conf), puis redémarrez le système. Recherchez ici la permutation pour plus d'informations à ce sujet.

2) Si l'échange n'est pas utile ... même si vous ne voulez pas ... augmenter la taille de votre fichier d'échange à 1,5x16G et voir si cela aide.

Tiens moi au courant. À la vôtre, Al

heynnema
la source
J'ai configuré une machine virtuelle pour exécuter des tests, car le redémarrage de mon système d'exploitation toutes les quelques secondes est vraiment ennuyeux. Ubuntu 16.04, 2 Go de RAM, 3 Go de swap, 20 Go de disque. Ensuite, j'ai exécuté un script qui consomme beaucoup de mémoire: avec la permutation par défaut (60), le système se bloque et après quelques minutes, je l'ai arrêté car le temps de récupération était inacceptable. Avec swappiness 10, le système se bloque pendant quelques secondes, puis il accepte l'entrée mais vous ne pouvez démarrer aucun processus (par exemple toppour tuer le porc de la mémoire). Après environ une minute, le processus est tué. Pas parfait, mais on se rapproche.
Klamann
Tenez-nous au courant. La machine virtuelle n'émulera pas vraiment votre système d'exploitation réel, mais elle vous permettra de jouer avec les paramètres. Je serai curieux de savoir si l'échange vous aide à résoudre votre problème. Cheers, Al
heynnema
Ah bien. Le progrès! Lisez un peu sur l'échange. Vous pouvez jouer un peu avec la valeur. Cheers, Al
heynnema
Quelle quantité de swap était utilisée lorsque le système a gelé? Cheers, Al
heynnema
2
pourquoi, à quoi ça sert? plus de mémoire n'empêchera pas le système de se coincer si j'aspire cette mémoire aussi.
Klamann
0

J'ai résolu un problème similaire. Je ne sais pas si mon expérience vous convient peut-être ...

Récemment, j'ai publié un guide sur la façon d'installer linux sur les périphériques LVM en boucle démarrant à partir d'USB (donc sans avoir à installer grub sur le disque interne, en le laissant comme original). Voici le guide: https://github.com/DareDevil73/linux-on-loopback-usb .

Ensuite, je suis tombé dans le problème de gel sur une charge de mémoire élevée et j'ai observé une utilisation anormale de l'espace de swap (toute la RAM consommée et l'utilisation de swap proche de zéro). De toute évidence, la partition d'échange LVM a été montée et fonctionne correctement, mais je ne sais pas pourquoi le noyau ne l'a pas utilisée comme prévu.

J'ai essayé une solution alternative. J'ai créé un fichier de bouclage de swap (pas LVM) et le gel a disparu. Maintenant, le fichier d'échange est utilisé comme il le serait, et le système d'exploitation ne se fige jamais!

Veuillez consulter https://github.com/DareDevil73/linux-on-loopback-usb#known-issues pour obtenir des informations plus approfondies.

Antonio Petricca
la source
Veuillez développer les liens en réponses.
Konrad Gajewski