53 votes

OOM killer ne fonctionne pas ?

D'après ce que j'ai compris, lorsque le système est proche de ne plus avoir de mémoire libre, le noyau devrait commencer à tuer des processus pour regagner de la mémoire. Mais dans mon système, cela ne se produit pas du tout.

Supposons un simple script qui alloue beaucoup plus de mémoire que celle disponible dans le système (un tableau avec des millions de chaînes, par exemple). Si j'exécute un script de ce type (en tant qu'utilisateur normal), il récupère toute la mémoire jusqu'à ce que le système se bloque complètement (seul SysRQ REISUB fonctionne).

Ce qui est bizarre, c'est que lorsque l'ordinateur se bloque, le disque dur s'allume et reste allumé jusqu'à ce que l'ordinateur soit redémarré, que la partition d'échange soit montée ou non !

Mes questions sont donc les suivantes :

  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. Y a-t-il un moyen de faire en sorte qu'Ubuntu tue automatiquement ces applications lorsqu'elles obtiennent trop (ou le plus) de mémoire ?

Informations complémentaires

  • Ubuntu 12.04.3
  • Noyau 3.5.0-44
  • RAM : ~3.7GB de 4GB (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

47voto

Teresa e Junior Points 1128

A partir de la officiel /proc/sys/vm/* la documentation :

oom_kill_allocating_task

Cela permet d'activer ou de désactiver killi dans les situations de mémoire insuffisante.

Si cette valeur est fixée à zéro, le tueur OOM parcourt l'ensemble de l'échantillon de et sélectionnera une tâche basée sur l'heuristique pour la tuer. [ ] sélectionne normalement une tâche malhonnête, gourmande en mémoire, qui libère une grande mémoire lorsqu'elle est tuée.

Si cette valeur est différente de zéro, l'outil de destruction de la mémoire tue simplement la tâche qui a déclenché la condition de mémoire insuffisante. qui a déclenché la condition de sortie de mémoire. [ ] de la liste des tâches.

Si panic_on_oom est sel utilisée dans oom_kill_allocating_task.

La valeur par défaut est 0.

En résumé, lors de la définition des oom_kill_allocating_task à 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 se contentera de tuer le processus qui a provoqué la saturation de la mémoire.

D'après ma propre expérience, lorsqu'un OOM est déclenché, le noyau n'a plus assez de "force" pour effectuer ce type d'analyse, ce qui rend le système totalement inutilisable.

De plus, il serait plus évident de tuer la tâche qui a causé le problème, et je ne comprends donc pas pourquoi la valeur est fixée à 0 par défaut.

Pour les tests, vous pouvez simplement écrire dans le pseudo-fichier approprié dans /proc/sys/vm/ qui sera annulée au prochain redémarrage :

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

Pour une solution permanente, écrivez à /etc/sysctl.conf ou vers un nouveau fichier sous /etc/sysctl.d/ , avec un .conf extension ( /etc/sysctl.d/local.conf par exemple) :

vm.oom_kill_allocating_task = 1

12voto

int_ua Points 7978

Mise à jour : le problème est résolu.

Réponse de Teresa suffit à contourner le problème et c'est une bonne chose.

En outre, j'ai déposé un rapport de bogue parce qu'il s'agit d'un comportement brisé.

2voto

nelhage Points 1660

Vous pouvez essayer earlyoom Le système de gestion des processus (OOM) est un tueur d'OOM qui opère dans l'espace utilisateur et tente de tuer le processus le plus important dans une situation d'OOM.

-2voto

Chris Points 1

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

Si vous ne voulez pas mettre à jour, changez le vm.swappiness à 10 et si vous avez des problèmes avec votre ram, installez zRAM.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X