Comment puis-je donner à nouveau les dents tueuses OOM?

12

À l'époque, je maudissais le tueur OOM pour être trop agressif et tuer les applications que j'utilisais. Maintenant, alors que je regarde périodiquement mon système thrash pendant 15 minutes à cause d'un programme mal comporté, puis que j'ai finalement recours à une mise hors tension forcée car il ne répond pas au clavier, je me rends compte que je l'avais mieux que je ne le pensais à l'époque.

Comment puis-je restaurer l'OOM-killer à ses anciennes méthodes sanguinaires?

Avdi
la source
1
Jetez un œil aux programmes à l'origine d'un problème et limitez la quantité de mémoire qu'ils peuvent aspirerlimits.conf
LawrenceC

Réponses:

4

Je diminuerais la quantité d'espace de swap dont vous disposez. Les installations typiques tentent de nos jours d'allouer autant de swap qu'il y a de mémoire physique (ou parfois deux fois plus). Le problème est que lorsque quelque chose se passe mal, le système passe en une mort spirale de tenter de « mélanger » les choses de la mémoire sur le disque, et à l' arrière, et il commence à faire si une grande partie de ce qu'il n'a pas le temps de répondre à l'entrée utilisateur.

Dans les bons jours, des processus entiers étaient échangés sur disque (et retour), donc de gros échanges étaient nécessaires.

Dans les systèmes de mémoire virtuelle modernes, la mémoire est échangée en blocs (plutôt qu'en processus entiers), vous pouvez donc vous en tirer avec des échanges plus petits. Dans votre scénario, il vaudrait mieux que les processus soient tués, donc l'exécution avec un swap plus petit fera que le MOO commencera à tuer les processus plus tôt (plutôt que de laisser le système passer des quantités excessives de temps à échanger des trucs vers / depuis le disque).

Brian Stevens
la source
Je n'ai aucun échange, et mon système se bloque pendant plus de 20 minutes lorsque j'ai une boucle javascript infinie en chrome que pousse sur un tableau ou quelque chose. J'ai besoin de OOMK pour déclencher avant que mon système ne soit inutile, pas bien après.
JasonWoof
0

Voici ce qui a fonctionné pour moi:

echo 1 > /proc/sys/vm/oom_kill_allocating_task

C'est juste pour cette botte. Vous pouvez tester en exécutant ce qui suit dans l'onglet console de l'inspecteur de votre navigateur:

a = []; while (true) { a.push(1); }

Si vous êtes satisfait de ce paramètre, vous pouvez définir la valeur par défaut pour toutes les futures bottes:

echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf
JasonWoof
la source