689 votes

Qu'est-ce qui a tué mon processus et pourquoi ?

Mon application fonctionne comme un processus d'arrière-plan sous Linux. Elle est actuellement lancée à la ligne de commande dans une fenêtre Terminal.

Récemment, un utilisateur a exécuté l'application pendant un certain temps et elle est morte mystérieusement. Le texte :

Tué

était sur le terminal. Cela s'est produit deux fois. J'ai demandé si quelqu'un dans un autre terminal avait utilisé la commande kill pour tuer le processus ? Non.

Dans quelles conditions Linux déciderait-il de tuer mon processus ? Je pense que le shell a affiché "killed" parce que le processus est mort après avoir reçu le signal kill(9). Si Linux a envoyé le signal kill, devrait-il y avoir un message dans un journal système quelque part qui explique pourquoi il a été tué ?

31 votes

Linux a tué mon processus et l'a enregistré dans /var/log/messages sur redhat

1 votes

Voir aussi cette réponse sur unix.stackexchange.com.

2 votes

Il y a 3 acteurs dans cet événement : (1) Le processus qui (cause commune) prend trop de mémoire et cause la condition OOM (2) Le noyau qui envoie le SIGKILL (signal 9) pour le terminer et enregistre le fait dans un journal du système tel que /var/log/messages (3) Le shell sous lequel s'est exécuté le processus qui imprime le Killed notification lorsque le statut de sortie de waitpid(2) indique que le processus enfant est mort suite au signal 9.

451voto

dwc Points 12676

Si l'utilisateur ou le sysadmin n'a pas tué le programme, le noyau peut l'avoir fait. Le noyau ne tue un processus que dans des circonstances exceptionnelles, par exemple en cas d'épuisement extrême des ressources (par exemple, épuisement de mem+swap).

33 votes

Si le noyau tuait le processus, est-ce qu'il mettrait un message dans un journal quelque part ?

203 votes

Je viens d'écrire un programme qui malloque de la mémoire dans une boucle inifite. Après que le système soit devenu lent, "Killed" s'est affiché dans le terminal et le processus a été terminé. Le fichier /var/log/kern.log contient beaucoup d'informations sur la fin du processus. -Merci pour l'indication.

9 votes

C'est presque certainement ça. J'ai vu ça souvent quand j'étais assistant technique. De nombreux étudiants oubliaient de libérer leurs objets, et les applications finissaient par atteindre 3 Go de mémoire virtuelle. Dès qu'elle atteignait ce point, elle était tuée.

325voto

Essayez :

dmesg -T| grep -E -i -B100 'killed process'

-B100 signifie le nombre de lignes avant que le kill ne se produise.

Omettre -T sur Mac OS.

6 votes

Pour info, de info egrep : "egrep est le même que grep -E. ... L'invocation directe comme egrep ou fgrep est dépréciée".

9 votes

Dans le cas d'un motif simple comme 'killed process' vous pouvez simplement utiliser grep au lieu de egrep sans autre changement. Pour un motif plus complexe, il faut remplacer par ex. egrep -i -B100 'foo|ba[rz]' con grep -E -i -B100 'foo|ba[rz]' . Ce Q&R donne plus de détails.

3 votes

Je suggère également d'utiliser dmesg -T afin d'obtenir des timestamps lisibles

185voto

Adam Jaskiewicz Points 7485

Cela ressemble à un bon article sur le sujet: Apprivoiser l'OOM killer.

L'essentiel est que Linux overcommits de la mémoire. Lorsqu'un processus demande plus d'espace, Linux va lui donner de l'espace, même si elle est demandée par un autre processus, sous l'hypothèse que personne n'utilise en fait la totalité de la mémoire qu'ils demandent. Le processus sera usage exclusif de la mémoire qu'il a alloué quand il utilise, non pas quand il le demande. Cela rend l'allocation rapide, et vous permettra peut-être de "tricher" et d'allouer plus de mémoire que vous avez vraiment. Cependant, une fois le processus de démarrage à l'aide de ce mémoire, Linux pourrait rendre compte qu'il a été trop généreux dans l'allocation de mémoire il n'a pas, et aura pour tuer un processus pour libérer de la place. Le processus d'être tué est basée sur un score tenant compte d'exécution (processus long safer), l'utilisation de la mémoire (gourmand processus sont de moins en moins sûr), et quelques autres facteurs, y compris une valeur que vous pouvez ajuster pour faire un processus moins susceptibles d'être tuées. Tout est décrit dans l'article dans beaucoup plus de détails.

Edit: Et voici un autre article qui explique assez bien comment un processus est choisi (annoté avec quelques noyau exemples de code). La grande chose à ce sujet est qu'il comprend des commentaires sur le raisonnement derrière les différents badness() règles.

4 votes

"Linux lui donnera cet espace, même s'il est réclamé par un autre processus" Ce n'est pas tout à fait comme ça que la mémoire virtuelle fonctionne...

1 votes

L'article est assez ancien (2009) et toutes les fonctionnalités suggérées dans l'article ne sont pas en ligne principale.

14voto

C.. Points 10739

Comme dwc et Adam Jaskiewicz l'ont dit, le coupable est probablement le tueur d'OOM. Cependant, la prochaine question qui suit est : Comment puis-je empêcher cela ?

Il y a plusieurs façons de procéder :

  1. Donnez à votre système plus de RAM si vous le pouvez (facile si c'est une VM)
  2. Faites en sorte que le tueur à l'arrêt choisisse un autre processus.
  3. Désactiver le tueur d'OOM
  4. Choisissez une distribution Linux dans laquelle le tueur d'OOM est désactivé.

J'ai trouvé que (2) était particulièrement facile à mettre en œuvre, grâce à cet article .

6 votes

C'était la RAM pour moi. Je suis passé de 2 à 4 Go de RAM et le problème a disparu. Maintenant le problème est avec la facture :P

1 votes

Façon #2 : L'article était utile mais il est dépassé. Vous devez maintenant adapter /proc/<PID>/oom_score_adj à -1000 (ce qui prend automatiquement oom_adj à -17 et oom_score à 0, pour que votre processus ne soit jamais tué)

2voto

Lawrence Dol Points 27976

Nous avons eu des problèmes récurrents sous Linux sur le site d'un client (Red Hat, je pense), avec OOMKiller (out-of-memory killer) qui a tué à la fois notre application principale (c'est-à-dire la raison d'être du serveur) et ses processus de base de données.

Dans chaque cas, OOMKiller a simplement décidé que les processus utilisaient trop de ressources... la machine n'était même pas sur le point d'échouer par manque de ressources. Ni l'application ni sa base de données n'ont de problèmes de fuites de mémoire (ou toute autre fuite de ressources).

Je ne suis pas un expert de Linux, mais je pense que son algorithme pour décider quand tuer quelque chose et quoi tuer est complexe. De plus, on m'a dit (je ne peux pas dire si c'est exact) que OOMKiller est intégré au noyau et que vous ne pouvez pas simplement ne pas l'exécuter.

1 votes

IIRC, OOMKiller n'est invoqué qu'en dernier recours. Je pense que le système enverra même un signal aux différentes applications leur demandant de bien vouloir renoncer à certaines ressources avant d'être obligé d'invoquer OOMKiller. A prendre avec des pincettes, car cela fait longtemps...

1 votes

Usted puede simplement ne pas l'exécuter. Il est intégré au noyau, mais il existe des options permettant de régler la façon dont il fonctionne, et même les processus qu'il est susceptible de tuer. Il s'exécute lorsque le système entier est à court de mémoire, et non lorsqu'un processus spécifique en utilise trop. Voir ma réponse pour plus de détails.

6 votes

Ne pas utiliser Oomkiller est assez facile. echo "2" > /proc/sys/vm/overcommit_memory

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X