Pourquoi l'OOM-Killer ne peut-il pas simplement tuer le processus qui en demande trop?

12

Il est expliqué ici que OOM-Killer peut être configuré via overcommit_memoryet que:

  • 2 = pas de surengagement. Les allocations échouent si vous en demandez trop.
  • 0, 1 = surcharge (heuristiquement ou toujours). Tuez certains processus basés sur des heuristiques lorsque trop de mémoire est réellement accédée.

Maintenant, je peux complètement mal comprendre cela, mais pourquoi n'y a-t-il pas une option (ou pourquoi n'est-ce pas la valeur par défaut) pour tuer le processus même qui essaie réellement d'accéder à trop de mémoire allouée?

Martin Ba
la source
Que faire si un processus système critique demande trop de mémoire?
Lawrence
En premier lieu - il peut faire cette chose. Mais, le plus gros problème avec cette question est que , selon toute vraisemblance , si un processus demande de la mémoire il est nouvellement exécuté - ou, autrement dit, c'est un nouveau processus impliqué dans le traitement très courant. Préféreriez-vous que le MOO permette à votre client im non ouvert pendant 3 jours de continuer à gaspiller la mémoire du système ou préférez-vous que YouTube soit effectivement chargé cette année? linuxatemyram.com
mikeserv
3
C'est no overcommitessentiellement ce que fait l' option. Si un processus demande trop de mémoire, il échoue. S'il vérifie l'erreur, il se tuera généralement; si ce n'est pas le cas, il obtiendra probablement une erreur de segmentation lorsqu'il essaiera de déréférencer le pointeur nul qui malloc()revient, et il se bloquera.
Barmar
Notez que 2 est en fait le no overcommitmode, selon les sources citées (telles que kernel.org/doc/Documentation/vm/overcommit-accounting ). Je pense que je vais modifier votre question en conséquence.
hans_meine

Réponses:

23

Considérez ce scénario:

  • Vous disposez de 4 Go de mémoire libre.
  • Un processus défectueux alloue 3 999 Go.
  • Vous ouvrez un gestionnaire de tâches pour tuer le processus d'emballement. Le gestionnaire de tâches alloue 0,002 Go.

Si le processus qui a été tué était le dernier processus à demander de la mémoire, votre gestionnaire de tâches serait tué.

Ou:

  • Vous disposez de 4 Go de mémoire libre.
  • Un processus défectueux alloue 3 999 Go.
  • Vous ouvrez un gestionnaire de tâches pour tuer le processus d'emballement. Le serveur X alloue 0,002 Go pour gérer la fenêtre du gestionnaire de tâches.

Maintenant, votre serveur X est tué. Cela n'a pas causé le problème; c'était juste "au mauvais endroit au mauvais moment". Il s'est avéré que c'était le premier processus à allouer plus de mémoire quand il n'en restait plus, mais ce n'était pas le processus qui utilisait toute la mémoire pour commencer.

user253751
la source
Pour étendre votre exemple, cela signifie que si un processus consommait 99,999% de votre mémoire, vous ne seriez jamais en mesure de le tuer car tout ce qui pourrait le tuer nécessiterait de la mémoire et se ferait donc tuer avant que le processus errant puisse être tué!
Traîneau du
13
Attention, c'est la philosophie Linux, pas un fait nécessaire. Windows 3.0 l'a résolu en ayant suffisamment de mémoire réservée pour la gestion des MOO, y compris les boîtes de dialogue nécessaires.
MSalters
@MSalters: Cela ne s'applique pas vraiment à l'exemple, cependant; L'exemple portait sur un processus qui avait réservé presque toute la mémoire, c'est-à-dire. pas assez pour se faire tuer OOM. De toute évidence, il doit y avoir suffisamment de mémoire réservée pour la gestion des MOO sur n'importe quel système d'exploitation. Mais le processus qui appelle la gestion du MOO serait le prochain processus qui se produit pour réserver la mémoire, pas celui qui se comporte mal. À moins, bien sûr, que vous vouliez dire que Windows 3.0 avait toujours suffisamment de mémoire réservée pour exécuter le gestionnaire de tâches, ou que le gestionnaire OOM invitait toujours l'utilisateur pour le processus à tuer. (Qui! = Tuer le processus incriminé)
Aleksi Torhamo
3
@AleksiTorhamo: Je pensais en effet à ce dernier. Windows 3.0 n'avait pas de gestionnaire de tâches complet, il avait les fameux écrans bleus dont la mémoire était préallouée.
MSalters