Mon application s'exécute en arrière-plan sous Linux. Il est actuellement démarré sur la ligne de commande dans une fenêtre de terminal.
Récemment, un utilisateur exécutait l'application depuis un moment 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 utilisait la commande kill pour tuer le processus? Non.
Dans quelles conditions Linux déciderait-il de tuer mon processus? Je crois que l'obus a affiché "tué" 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é?
/var/log/messages
(3) Le shell sous lequel le processus s'est exécuté, qui est le processus qui imprime laKilled
notification lorsque l'état de sortie dewaitpid(2)
indique que le processus enfant est mort du signal 9./var/log/syslog
Réponses:
Si l'utilisateur ou sysadmin n'a pas tué le programme, le noyau peut avoir. Le noyau ne tuerait un processus que dans des circonstances exceptionnelles telles que la famine extrême (pensez mem + épuisement swap).
la source
dmesg
pour voir le journal du noyau: ici, je trouve mes processus python tués par le noyau en raison de la consommation extrême de mémoire virtuelle.Essayer:
Où
-B100
signifie le nombre de lignes avant la mort.Omettez -T sur Mac OS.
la source
info egrep
: "egrep est le même que grep -E. ... L'invocation directe car egrep ou fgrep est déconseillée"'killed process'
vous pouvez simplement l'utilisergrep
au lieu deegrep
sans autres modifications. Pour un modèle plus complexe, vous devez remplacer par exempleegrep -i -B100 'foo|ba[rz]'
pargrep -E -i -B100 'foo|ba[rz]'
. Ce Q&R donne plus de détails.dmesg -T
afin d'obtenir des horodatages lisiblesCela ressemble à un bon article sur le sujet: Taming the OOM killer .
L'essentiel est que Linux sur- engageMémoire. Lorsqu'un processus demande plus d'espace, Linux lui donnera cet espace, même s'il est revendiqué par un autre processus, en supposant que personne n'utilise réellement toute la mémoire qu'il demande. Le processus obtiendra une utilisation exclusive de la mémoire qu'il a allouée lorsqu'il l'utilise réellement, pas lorsqu'il le demande. Cela rend l'allocation rapide et peut vous permettre de "tricher" et d'allouer plus de mémoire que vous n'en avez vraiment. Cependant, une fois que les processus commencent à utiliser cette mémoire, Linux peut se rendre compte qu'il a été trop généreux dans l'allocation de mémoire qu'il n'a pas, et devra tuer un processus pour en libérer. Le processus à tuer est basé sur un score prenant en compte le temps d'exécution (les processus de longue durée sont plus sûrs), l'utilisation de la mémoire (les processus gourmands sont moins sûrs) et quelques autres facteurs, y compris une valeur que vous pouvez ajuster pour rendre un processus moins susceptible d'être tué. Tout est décrit dans l'article de manière beaucoup plus détaillée.
Edit: Et voici un autre article qui explique assez bien comment un processus est choisi (annoté avec quelques exemples de code du noyau). La grande chose à ce sujet est qu'il comprend des commentaires sur le raisonnement derrière les différentes
badness()
règles.la source
Permettez-moi d'abord d'expliquer quand et pourquoi OOMKiller est invoqué?
Supposons que vous disposiez de 512 RAM + 1 Go de mémoire d'échange. Donc, en théorie, votre processeur a accès à un total de 1,5 Go de mémoire virtuelle.
Maintenant, pendant un certain temps, tout fonctionne bien dans 1,5 Go de mémoire totale. Mais tout à coup (ou progressivement) votre système a commencé à consommer de plus en plus de mémoire et il a atteint à un point environ 95% de la mémoire totale utilisée.
Supposons maintenant que tout processus ait demandé un gros morceau de mémoire au noyau. Le noyau vérifie la mémoire disponible et constate qu'il n'y a aucun moyen d'allouer plus de mémoire à votre processus. Il essaiera donc de libérer de la mémoire en appelant / invoquant OOMKiller ( http://linux-mm.org/OOM ).
OOMKiller a son propre algorithme pour marquer le rang pour chaque processus. Généralement, quel processus utilise plus de mémoire devient la victime à tuer.
Où puis-je trouver les journaux d'OOMKiller?
Généralement dans le répertoire / var / log. Soit /var/log/kern.log ou / var / log / dmesg
J'espère que cela vous aidera.
Quelques solutions typiques:
la source
Il s'agit du gestionnaire de mémoire insuffisante Linux (MOO) . Votre processus a été sélectionné en raison de la « méchanceté » - une combinaison de la nouveauté, de la taille du résident (mémoire utilisée, plutôt que simplement allouée) et d'autres facteurs.
Vous verrez un message comme:
la source
Comme l'ont déclaré dwc et Adam Jaskiewicz, le coupable est probablement le tueur OOM. Cependant, la question suivante qui suit est: Comment puis-je empêcher cela?
Il existe plusieurs façons:
J'ai trouvé que (2) était particulièrement facile à implémenter, grâce à cet article .
la source
Le module PAM pour limiter les ressources a provoqué exactement les résultats que vous avez décrits: Mon processus est mort mystérieusement avec le texte Tué sur la fenêtre de la console. Aucune sortie de journal, ni dans syslog ni dans kern.log . Le programme supérieur m'a aidé à découvrir qu'exactement après une minute d'utilisation du processeur, mon processus est tué.
la source
Un outil comme systemtap (ou un traceur) peut surveiller la logique de transmission des signaux du noyau et générer des rapports. par exemple, https://sourceware.org/systemtap/examples/process/sigmon.stp
Le
if
bloc de filtrage dans ce script peut être ajusté au goût, ou éliminé pour tracer le trafic du signal à l'échelle du système. Les causes peuvent être davantage isolées en collectant des backtraces (ajoutez unprint_backtrace()
et / ouprint_ubacktrace()
à la sonde, respectivement pour le noyau et l'espace utilisateur).la source
Dans un environnement lsf (interactif ou autre) si l'application dépasse l'utilisation de la mémoire au-delà d'un certain seuil prédéfini par les administrateurs de la file d'attente ou la demande de ressources à soumettre à la file d'attente, les processus seront tués afin que les autres utilisateurs ne soient pas victimes d'un potentiel fuyez. Il n'envoie pas toujours un e-mail lorsqu'il le fait, selon la façon dont il est configuré.
Dans ce cas, une solution consiste à trouver une file d'attente avec des ressources plus importantes ou à définir des besoins en ressources plus importants dans la soumission.
Vous pouvez également consulter
man ulimit
Bien que je ne me souvienne pas que cela
ulimit
enKilled
soit un depuis que j'en avais besoin.la source
Nous avons eu des problèmes récurrents sous Linux sur un site client (Red Hat, je pense), avec OOMKiller (tueur de mémoire insuffisante) tuant à la fois notre application principale (c'est-à-dire la raison pour laquelle le serveur existe) 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 de tomber en panne par manque de ressources. Ni l'application ni sa base de données n'ont de problèmes de fuites de mémoire (ou de toute autre fuite de ressources).
Je ne suis pas un expert Linux, mais j'ai plutôt compris 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 parler de l'exactitude de cela) que OOMKiller est intégré dans le noyau et que vous ne pouvez tout simplement pas ne pas l'exécuter.
la source
echo "2" > /proc/sys/vm/overcommit_memory
sudo echo "2" > /proc/sys/vm/overcommit_memory
/ proc / sys / vm / overcommit_memory: Autorisation refuséeecho 2 | sudo tee /proc/sys/vm/overcommit_memory
Dans mon cas, cela se passait avec un travailleur de file d'attente Laravel. Les journaux système ne mentionnaient aucun meurtre, j'ai donc cherché plus loin et il s'est avéré que le travailleur se tuait essentiellement en raison d'un travail qui dépassait la limite de mémoire (qui est définie à 128 Mo par défaut).
Exécuter le gestionnaire de files d'attente avec
--timeout=600
et--memory=1024
résolu le problème pour moi.la source
L'utilisateur a la possibilité de tuer ses propres programmes, en utilisant kill ou Control + C, mais j'ai l'impression que ce n'est pas ce qui s'est passé, et que l'utilisateur s'est plaint à vous.
root a bien sûr la capacité de tuer des programmes, mais si quelqu'un a root sur votre machine et tue des trucs, vous avez de plus gros problèmes.
Si vous n'êtes pas l'administrateur système, l'administrateur système peut avoir configuré des quotas sur le processeur, la mémoire RAM, l'utilisation du disque ou les processus de suppression automatique qui les dépassent.
À part ces suppositions, je ne suis pas sûr sans plus d'informations sur le programme.
la source
J'ai rencontré ce problème récemment. Enfin, j'ai découvert que mes processus avaient été tués juste après l'appel automatique de la mise à jour d'Opsuse zypper. Pour désactiver la mise à jour zypper, j'ai résolu mon problème.
la source
Résolu ce problème en augmentant la taille du swap :
/ubuntu/1075505/how-do-i-increase-swapfile-in-ubuntu-18-04
la source