recevoir le signal avant que le processus ne soit tué par le tueur OOM / les groupes de contrôle

11

Dans notre cluster, nous restreignons les ressources de nos processus, par exemple memory ( memory.limit_in_bytes).

Je pense qu'en fin de compte, cela est également géré via le tueur OOM dans le noyau Linux (cela ressemble en lisant le code source ).

Existe-t-il un moyen d'obtenir un signal avant la fin de mon processus? (Tout comme l' -notifyoption pour les SGEqsub , qui sera envoyée SIGUSR1avant la fin du processus.)

J'ai lu /dev/mem_notify ici mais je ne l'ai pas - y a-t-il autre chose de nos jours? J'ai également lu ceci qui semble quelque peu pertinent.

Je veux pouvoir au moins vider une petite trace de pile et peut-être quelques autres informations de débogage utiles - mais peut-être que je peux même récupérer en libérant de la mémoire.

Une solution de contournement que j'utilise actuellement est ce petit script qui vérifie fréquemment si je suis proche (95%) de la limite et si oui, il envoie le processus a SIGUSR1. Dans Bash, je démarre ce script en arrière-plan ( cgroup-mem-limit-watcher.py &) pour qu'il surveille les autres procs du même groupe de contrôle et se ferme automatiquement lorsque le processus Bash parent meurt.

Albert
la source
Je n'ai pu trouver aucune source d'autorité, ni trouver un moyen d'invoquer manuellement OOM killer pour un processus spécifique (pour tester l'idée) , mais d'après ce que j'ai trouvé, il semble que OOM killer envoie simplement SIGTERM, vous devez donc définir un gestionnaire pour ce signal.
Hi-Angel
5
@ Hi-Angel: D'après le code source Linux , il semble qu'il envoie SIGKILL.
Albert
@Albert Après avoir lu le code source, je pense aussi que OOM Killer enverra directement un signal SIGKILL.
andy

Réponses:

5

Il est possible de s'inscrire pour une notification lorsque l'utilisation de la mémoire d'un groupe de contrôle dépasse un seuil. En principe, fixer le seuil à un point approprié en dessous de la limite réelle vous permettrait d'envoyer un signal ou de prendre d'autres mesures.

Voir:

https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt

Chris Emerson
la source
5

Le tueur OOM envoie un SIGKILL car il serait autrement contre-productif de laisser le programme problématique choisir de continuer.

Cela signifie qu'il n'y a absolument aucun moyen pour un processus de savoir quand il est sur le point d'être tué par lui.

La gestion de ces problèmes implique généralement d'apporter des corrections aux programmes ou à leur configuration. Parfois, selon la configuration du système, le simple fait d'augmenter l'espace de swap peut donner au système d'exploitation plus de flexibilité de gestion de la mémoire pour éviter de telles mesures drastiques.

Julie Pelletier
la source