Comment utiliser oom_score_adj?

24

Le 11.04, /proc/[pid]contient oom_score_adj, mais man procdécrit l'ancien oom_adj. J'ai cherché sur Google sans succès pour toute information sur la façon de l'utiliser.

Ce que je dois arranger, c'est que les processus démarrés par «pbs» ou «gridengine» sont tués avant que quoi que ce soit d'autre ne soit tué. Comment puis je faire ça?

bmargulies
la source
Pour que ce changement soit permanent pour les services gérés par Upstart: Comment définir de façon permanente les ajustements OOM killer pour les démons? .
gertvdijk
C'est déjà une réponse. Il y est lié. :)
gertvdijk
Mais pas sur ce site :-)
bmargulies

Réponses:

13

Basé sur mes propres questions / réponses sur Unix et Linux sur une question similaire.

Comme Stuart l'a très bien souligné dans sa réponse , les valeurs valides sont des entiers compris entre -1000 et 1000 pour oom_score_adj. La plus faible de la valeur, la baisser la chance qu'il va être tué.

Il est très gênant d'avoir à modifier cette valeur encore et encore une fois que vous redémarrez l'application. Les informations sont simplement perdues après la fin du processus. Upstart (le démon init dans Ubuntu), a une option intéressante pour cela de configurer les démons pour s'assurer qu'il est défini chaque fois qu'il a (re) démarré:

oom score

[...] coupure [...]

Exemple:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Donc, fondamentalement, vous pouvez modifier le /etc/init/myservice.conffichier de configuration des services que vous souhaitez modifier, pour inclure une ligne oom score -1000. Je suppose que les services `` pbs '' ou `` gridengine '' dont vous parlez dans votre question sont activés par Upstart, sinon vous aurez besoin d'une autre façon de changer cela définitivement.

gertvdijk
la source
7

Si vous pouvez modifier le script de démarrage générant le processus que vous souhaitez hiérarchiser pour oom-killer, ajoutez ce qui suit au script de démarrage:

echo 1000 > /proc/self/oom_score_adj

La valeur est héritée pour les processus enfants.

user1338062
la source
6

Si vous définissez une valeur élevée (ish) pour oom_adj ou oom_score_adj, ils seront supprimés en premier. par exemple

echo 15 > /proc/[pid]/oom_adj

oom_adj passe de -16 à 15 et comme mentionné ci-dessus oom_score_adj accepte -1000 à 1000

Stuart
la source
Vous devez être root pour cela. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil
2
En fait, vous pouvez augmenter le score de vos processus sans racine ("oui, cela peut être tué"). La diminution (inférieure à 0) nécessite un root.
Piskvor
5

Regarder le code est toujours une bonne idée. Normalement, j'utilise la fonction de recherche de kernel.org, mais c'est actuellement en panne. Github fait aussi du bon travail. J'ai trouvé ça:

Au lieu de cela, un nouveau paramètre ajustable, / proc / pid / oom_score_adj, est ajouté, qui va de -1000 à +1000. Il peut être utilisé pour polariser l'heuristique de telle sorte que certaines tâches ne sont jamais prises en compte pour la mise à mort oom tandis que d'autres peuvent toujours être prises en compte. La valeur est ajoutée directement dans le score badness (), donc une valeur de -500, par exemple, signifie réduire 50% de sa consommation de mémoire par rapport à d'autres tâches soit sur le système, lié à la mempolicy, dans le cpuset, ou partager le même contrôleur de mémoire.

Depuis https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h

falstaff
la source
Merci pour le pointeur, mais j'espère que quelqu'un passera par là et tirera une recette pour tout le problème, ce qui semble être en train de faire en sorte que cette valeur soit définie pour le démon exec de pbs avant de bifurquer tous les travaux.
bmargulies