web-dev-qa-db-fra.com

Déboguer la mémoire insuffisante avec / var / log / messages

Le rapport suivant est jeté dans mon journal des messages:

kernel: Out of memory: Kill process 9163 (mysqld) score 511 or sacrifice child
kernel: Killed process 9163, UID 27, (mysqld) total-vm:2457368kB, anon-rss:816780kB, file-rss:4kB

Peu importe si ce problème concerne httpd, mysqld ou postfix mais je suis curieux de savoir comment continuer à déboguer le problème.

Comment puis-je obtenir plus d'informations sur la raison pour laquelle le PID 9163 est tué et je ne sais pas si Linux conserve l'historique des PID terminés quelque part.

Si cela se produit dans votre fichier journal des messages, comment allez-vous résoudre ce problème étape par étape?

# free -m

             total       used       free     shared    buffers     cached
Mem:          1655        934        721          0         10         52
-/+ buffers/cache:        871        784
Swap:          109          6        103`
42
ibedelovski

Le noyau aura enregistré un tas de choses avant que cela ne se produise, mais la plupart ne seront probablement pas dans /var/log/messages, selon la façon dont votre (r)syslogd est configuré. Essayer:

grep oom /var/log/*
grep total_vm /var/log/*

Les premiers devraient apparaître plusieurs fois et les seconds en un ou deux endroits seulement. C'est le fichier que vous souhaitez consulter.

Recherchez la ligne "Mémoire insuffisante" d'origine dans l'un des fichiers qui contient également total_vm. Trente secondes à une minute (pourrait être plus, pourrait être moins) avant cette ligne, vous trouverez quelque chose comme:

kernel: foobar invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

Vous devriez également trouver un tableau quelque part entre cette ligne et la ligne "Mémoire insuffisante" avec des en-têtes comme celui-ci:

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name

Cela peut ne pas vous en dire beaucoup plus que vous ne le savez déjà, mais les champs sont les suivants:

  • pid L'ID du processus.
  • uid ID utilisateur.
  • tgid ID du groupe de threads.
  • total_vm Utilisation de la mémoire virtuelle (en pages de 4 Ko)
  • rss Utilisation de la mémoire résidente (en pages de 4 Ko)
  • nr_ptes Entrées de table de page
  • swapents Swap entries
  • oom_score_adj Habituellement 0; un nombre inférieur indique que le processus sera moins susceptible de mourir lorsque le tueur OOM est invoqué.

Vous pouvez surtout ignorer nr_ptes et swapents même si je crois que ce sont des facteurs qui déterminent qui est tué. Ce n'est pas nécessairement le processus qui utilise le plus de mémoire, mais c'est très probablement le cas. Pour en savoir plus sur le processus de sélection, voir ici . Fondamentalement, le processus qui aboutit au score OOM le plus élevé est tué - c'est le "score" signalé sur la ligne "Mémoire insuffisante"; malheureusement, les autres scores ne sont pas rapportés, mais ce tableau fournit des indices en termes de facteurs.

Encore une fois, cela ne fera probablement pas beaucoup plus qu'éclairer l'évidence: le système a manqué de mémoire et mysqld a été choisi pour mourir parce que le tuer libérerait le plus de ressources. Cela ne signifie pas nécessairement que mysqld fait quelque chose de mal. Vous pouvez regarder le tableau pour voir si quoi que ce soit d'autre soit hors ligne à ce moment-là, mais il n'y a peut-être pas de coupable clair: le système peut manquer de mémoire simplement parce que vous avez mal évalué ou mal configuré les processus en cours.

58
goldilocks

La clé de ceci est dans le message lui-même - Mémoire insuffisante . Lorsque le noyau Linux est privé de mémoire virtuelle (physique RAM plus swap), il commencera à tuer les processus et c'est exactement ce qui s'est passé ici. Il semble que mysqld utilise plus de 2 Go de mémoire virtuelle.

Combien RAM et swap le système a-t-il? J'envisagerais d'ajouter extra RAM ou, si ce n'est pas possible, d'ajouter un swap supplémentaire. Comme solution rapide) pour empêcher au moins l'arrêt des processus, vous pouvez ajouter un fichier d'échange.

Mise à jour: En regardant la quantité de RAM que vous avez, vous pouvez immédiatement voir le problème. Vous avez ~ 1,6 Go de RAM et 100 Mo de swap pourtant MySQL utilise beaucoup plus RAM que cela. Cela explique pourquoi vous voyez des processus se terminer.

6
mjturner