web-dev-qa-db-fra.com

Comment le tueur OOM décide-t-il du processus à tuer en premier?

This answer explique les actions prises par le noyau lorsqu'une situation de MOO est rencontrée sur la base de la valeur de sysctl vm.overcommit_memory.

Quand overcommit_memory est défini sur 0 ou 1, overcommit est activé et les programmes sont autorisés à allouer plus de mémoire que ce qui est réellement disponible.

Maintenant, que se passe-t-il lorsque nous manquons de mémoire dans cette situation? Comment le tueur OOM décide-t-il du processus à tuer en premier?

100
Ramesh

Si la mémoire est épuisée par les processus, au point de menacer la stabilité du système, le tueur OOM entre en scène.

REMARQUE: Il est de la responsabilité de l'OOM Killer de continuer à tuer les processus jusqu'à ce que suffisamment de mémoire soit libérée pour le bon fonctionnement du reste du processus que le noyau tente de s'exécuter.

L'OOM Killer doit sélectionner le meilleur meilleur (s) processus à tuer. Best se réfère ici à ce processus qui libérera la mémoire maximale lors de la destruction et est également le moins important pour le système.

L'objectif principal est de tuer le moins de processus possible, ce qui minimise les dommages causés et maximise en même temps la quantité de mémoire libérée.

Pour faciliter cela, le noyau maintient un oom_score pour chacun des processus. Tu peux voir le oom_score de chacun des processus dans le /proc système de fichiers sous le répertoire pid.

$ cat /proc/10292/oom_score

Plus la valeur de oom_score de tout processus, plus sa probabilité de se faire tuer par le OOM Killer est élevée en cas de mémoire insuffisante.

Comment est la OOM_Score calculé?

Dans l'ensemble de patchs de David, les anciennes heuristiques badness () ont presque entièrement disparu. Au lieu de cela, le calcul se transforme en une simple question de quel pourcentage de la mémoire disponible est utilisé par le processus. Si le système dans son ensemble manque de mémoire, la "mémoire disponible" est la somme de tous les RAM et espace d'échange disponible pour le système).

Si, à la place, la situation OOM est causée par l'épuisement de la mémoire autorisée pour un groupe de contrôle/groupe de contrôle donné, alors la "mémoire disponible" est la quantité totale allouée à ce groupe de contrôle. Un calcul similaire est effectué si les limites imposées par une politique de mémoire ont été dépassées. Dans chaque cas, l'utilisation de la mémoire du processus est réputée être la somme de son ensemble résident (le nombre de RAM pages qu'il utilise) et son utilisation de swap.

Ce calcul produit en conséquence un nombre pour cent-dix; un processus qui utilise chaque octet de la mémoire à sa disposition aura un score de 1000, tandis qu'un processus n'utilisant aucune mémoire obtiendra un score de zéro. Il y a très peu de réglages heuristiques à ce score, mais le code soustrait toujours une petite quantité (30) du score des processus appartenant à la racine sur la notion qu'ils sont légèrement plus précieux que les processus appartenant à l'utilisateur.

Un autre Tweak qui est appliqué consiste à ajouter la valeur stockée dans la variable oom_score_adj de chaque processus, qui peut être ajustée via/proc. Ce bouton permet d'ajuster l'attractivité de chaque processus au tueur OOM dans l'espace utilisateur; la définition de -1000 désactivera entièrement les suppressions de MOO, tandis que la définition de +1000 équivaut à peindre une grande cible sur le processus associé.

Références

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-processhttps://serverfault.com/a/571326

119
Ramesh