Tueur OOM ne fonctionne pas?


41

Si j'ai bien compris, lorsque le système est presque vide, le noyau devrait commencer à tuer les processus pour récupérer de la mémoire. Mais dans mon système, cela ne se produit pas du tout.

Supposons un script simple qui alloue beaucoup plus de mémoire que ce qui est disponible dans le système (un tableau contenant des millions de chaînes, par exemple). Si j’exécute un script comme celui-ci (en tant qu’utilisateur normal), il n’obtient que toute la mémoire jusqu’à ce que le système se bloque complètement (seul SysRQ REISUB fonctionne).

La partie étrange ici est que lorsque l'ordinateur se bloque, le voyant du disque dur s'allume et reste ainsi jusqu'à ce que l'ordinateur soit redémarré, que je dispose ou non d'une partition de swap montée!

Donc mes questions sont:

  1. Ce comportement est-il normal? Il est étrange qu'une application exécutée en tant qu'utilisateur normal puisse planter le système de cette manière ...
  2. Puis-je faire en sorte qu'Ubuntu supprime automatiquement ces applications lorsqu'elles ont trop (ou plus) de mémoire?

Information additionnelle

  • Ubuntu 12.04.3
  • Noyau 3.5.0-44
  • RAM: ~ 3,7 Go à partir de 4 Go (partagé avec la carte graphique). *

    $ tail -n+1 /proc/sys/vm/overcommit_*
    ==> /proc/sys/vm/overcommit_memory <==
    0
    
    ==> /proc/sys/vm/overcommit_ratio <==
    50
    
    $ cat /proc/swaps
    Filename                Type        Size    Used    Priority
    /dev/dm-1                               partition   4194300 344696  -1
    

Je ne sais pas pourquoi ça ne marche pas. Essayez d' tail -n+1 /proc/sys/vm/overcommit_*ajouter la sortie. Voir aussi ici: Comment configurer oom-killer
kiri

Alors, que se passe-t-il avec votre espace d'échange? Pouvez-vous publier des sorties vmstat telles que #vmstat 1 100 ou quelque chose du genre? et montrez-nous aussi cat / etc / fstab. Ce qui devrait arriver, c'est que vous utilisiez une certaine quantité de mémoire, vous devriez commencer à écrire en swap. Les processus de destruction ne doivent pas se produire avant que la mémoire et l'espace de swap ne soient "saturés".
J0h

essayez aussi #swapon -a
j0h

@ j0h Avec swap, cela semble bien fonctionner (après quelque temps, le processus s'est écrasé Allocation failed). Mais sans échange cela ne fait que figer l'ordinateur. Est-il censé fonctionner de cette façon (tuer seulement en utilisant swap)?
Salem

2
Avec SysRq, vous pouvez également appeler le MOO (SysRq + F iirc)
Lekensteyn le

Réponses:


36

De la documentation officielle/proc/sys/vm/* :

oom_kill_allocating_task

Cela active ou désactive la suppression de la tâche qui déclenche le MOO dans des situations de mémoire insuffisante.

Si cette option est définie sur zéro, le tueur de MOO examinera toute la liste de tâches et sélectionnera une tâche en fonction de méthodes heuristiques à éliminer. Cela sélectionne normalement une tâche volumineuse de mémorisation de la mémoire qui libère une grande quantité de mémoire lorsqu'elle est tuée.

Si cette option est définie sur une valeur autre que zéro, le destructeur de MOO supprime simplement la tâche qui a déclenché la condition d'insuffisance de mémoire. Cela évite l'analyse coûteuse de la liste de tâches.

Si panic_on_oom est sélectionné, il est prioritaire sur la valeur utilisée dans oom_kill_allocating_task.

La valeur par défaut est 0.

Pour résumer, lorsqu’il est configuré oom_kill_allocating_tasksur 1, au lieu d’analyser votre système à la recherche de processus à tuer, ce qui est une tâche coûteuse et lente, le noyau va juste tuer le processus qui a causé la perte de mémoire du système.

D'après mes propres expériences, quand un MOO est déclenché, le noyau n'a plus assez de "force" pour effectuer une telle analyse, ce qui rend le système totalement inutilisable.

En outre, il serait plus évident de simplement supprimer la tâche à l'origine du problème. Je ne comprends donc pas pourquoi cette 0option est définie par défaut.

Pour le test, vous pouvez simplement écrire dans le pseudo-fichier approprié /proc/sys/vm/, qui sera annulé lors du prochain redémarrage:

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

Pour un correctif permanent, écrivez ce qui suit dans /etc/sysctl.confou dans un nouveau fichier sous /etc/sysctl.d/, avec une .confextension ( /etc/sysctl.d/local.confpar exemple):

vm.oom_kill_allocating_task = 1

2
A-t-il toujours été mis à 0 dans Ubuntu? Parce que je me souviens que cela tue automatiquement, mais depuis quelques versions, il a cessé de le faire.
Skerit

1
@skerit Ceci, je ne le sais pas vraiment, mais il a été mis à 0 dans les noyaux que j'avais utilisés en 2010 (Debian, Liquorix et GRML).
Teresa e Junior

"En outre, il serait plus évident de simplement tuer la tâche à l'origine du problème, je ne comprends donc pas pourquoi elle est configurée 0par défaut." - parce que le processus qui a demandé de la mémoire n'est pas nécessairement celui qui a "causé le problème". Si le processus A exploite 99% de la mémoire du système, mais que le processus B, qui utilise 0,9%, est celui qui déclenche le tueur de MOO par malchance, B n'a pas "causé le problème" et cela n'a aucun sens de kill B. Si cette stratégie est mise en œuvre, des processus sans mémoire insuffisante risquent d'être tués par hasard en raison de l'utilisation effrénée de la mémoire par un processus différent .
Mark Amery

1
@MarkAmery Le vrai problème est que Linux, au lieu de simplement tuer le processus nécessaire, commence à fonctionner comme un retard, même si elle vm.admin_reserve_kbytespasse à 128 Mo, par exemple . Le réglage vm.oom_kill_allocating_task = 1semble résoudre le problème mais ne le résout pas vraiment (et Ubuntu gère déjà les bombes fourchettes par défaut).
Teresa e Junior

1
Peut-être plus élégantsudo sysctl -w vm.oom_kill_allocating_task=1
Pablo A

9

Mise à jour: le bogue est corrigé.

La réponse de Teresa est suffisante pour résoudre le problème et est bonne.

De plus, j'ai déposé un rapport de bogue parce que c'est définitivement un comportement cassé.


Je ne sais pas pourquoi vous avez été voté, mais cela me semble aussi être un bug du noyau. J'ai écrasé un grand serveur d'université aujourd'hui et tué des processus qui fonctionnaient depuis des semaines ... Merci d'avoir déposé ce rapport de bogue!
shapecatcher

7
Pourrait avoir été corrigé en 2014, en 2018 (et 18.04), le tueur de MOO ne fait encore rien.
skerit

0

Vous pouvez essayer earlyoom , un tueur de MOO qui opère dans l'espace utilisateur et tente de tuer le processus le plus important dans une situation de MOO.


-1

Tout d'abord, je recommande la mise à jour vers 13.10 (nouvelle installation, sauvegardez vos données).

Si vous ne souhaitez pas mettre à jour, remplacez vm.swappiness par 10 et si vous rencontrez des problèmes avec votre RAM, installez zRAM.


2
Je n'étais pas de ceux qui vous ont abaissé votre voix, mais généralement, baisser le volume de jeu vm.swappinessfait plus de mal que de bien, encore plus sur les systèmes souffrant de problèmes de mémoire insuffisante.
Teresa e Junior

Pas lorsque vous compressez d'abord le ram et que vous évitez ensuite d'utiliser le disque qui est beaucoup plus lent et qui peut geler votre ordinateur.
Brask

En théorie, zRAM est une bonne chose, mais il demande beaucoup de ressources processeur et ne vaut généralement pas le coût. La mémoire est généralement beaucoup moins chère que l'électricité. Et, sur un ordinateur portable, où la mise à niveau de la mémoire RAM est plus coûteuse, l'utilisation du processeur est généralement indésirable.
Teresa e Junior

Ce qu’il demande, c’est de disposer d’un système zRAM plus stable et de changer de rapidité, ce qui obligera son système à utiliser davantage de ressources de processeur, mais ce qu’il est limité par des erreurs de mémoire, il veut régler le problème et non une leçon de théorie. de ce qui se passe lorsque vous installez zRAM.
Brask

Il ressort clairement de sa question qu’il pourrait écrire un script inapproprié qui mange plus qu’il ne devrait (et je l’ai déjà fait moi-même). Dans une situation comme celle-ci, vous pouvez regarder le script récupérer des giga-octets de RAM en quelques secondes et zRAM ne viendra pas à la rescousse, car le script ne sera jamais suffisamment satisfait.
Teresa e Junior
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.