Obtenez un vidage de mémoire de / débogage d'un processus tué par oom-killer

10

Existe-t-il un moyen d'obtenir un vidage de mémoire ou de pouvoir déboguer un processus qui a été tué par oom-killer?

Ou même configurer oom-killer pour essayer de tuer un processus en utilisant ABRT à la place?

TrapAlice
la source

Réponses:

5

Une autre approche consiste à désactiver la surcharge de la mémoire.

Pour restaurer un semblant de raison à votre gestion de la mémoire:

  1. Désactiver le vm.oom-kill = 0module OOM Killer ( placé dans /etc/sysctl.conf)
  2. Désactiver la surcharge de mémoire (mise vm.overcommit_memory = 2en place /etc/sysctl.conf)

Ces paramètres feront que Linux se comportera de la manière traditionnelle (si un processus demande plus de mémoire que ce qui est disponible malloc()échouera et le processus demandant la mémoire devrait faire face à cet échec).

Notez qu'il s'agit d'une valeur ternaire:
  • 0 = "estimer si nous avons suffisamment de RAM"
  • 1 = "Toujours dire oui"
  • 2 = "dites non si nous n'avons pas la mémoire"

Cela forcera l'application à gérer le manque de mémoire lui-même, et peut-être que ses journaux / coredump / etc. pourraient vous donner quelque chose d'utile.

MISE À JOUR # 1

REMARQUE: lorsque votre système manque de mémoire, vous ne pourrez pas générer de nouveaux processus! Vous pouvez être exclu du système.

nishantjr
la source
C'est une terrible idée. La plupart des logiciels exécutés sur votre système ne gèrent probablement pas correctement la valeur de retour de l'échec d'allocation de mémoire. Cela entraînera l'exécution de chemins de code qui ne sont pratiquement jamais exécutés par quiconque et, dans le pire des cas, pourrait même introduire des vulnérabilités de sécurité sur votre système en exécutant ces chemins de code non testés et inattendus.
KJ Tsanaktsidis
4
echo 1 > /proc/sys/vm/oom_dump_tasks

ce qui semble être le maximum que vous pouvez obtenir du noyau pour afficher les erreurs de mémoire insuffisante.

https://www.kernel.org/doc/Documentation/sysctl/vm.txt

Permet à un vidage de tâche à l'échelle du système (à l'exception des threads du noyau) d'être produit lorsque le noyau effectue une destruction OOM et inclut des informations telles que pid, uid, tgid, vm size, rss, nr_ptes, swapents, oom_score_adj score et name. Cela est utile pour déterminer pourquoi le tueur OOM a été invoqué, pour identifier la tâche malveillante qui l'a provoquée et pour déterminer pourquoi le tueur OOM a choisi la tâche qu'il a faite pour tuer.

Si ce paramètre est défini sur zéro, ces informations sont supprimées. Sur les très grands systèmes avec des milliers de tâches, il peut ne pas être possible de vider les informations d'état de la mémoire pour chacune. De tels systèmes ne devraient pas être obligés de subir une dégradation des performances dans des conditions MOO lorsque les informations peuvent ne pas être souhaitées.

Si ce paramètre est défini sur non nul, ces informations sont affichées chaque fois que le tueur OOM tue réellement une tâche de mémoire mémoire.

HBruijn
la source