GNU/Linux >> Tutoriels Linux >  >> Linux

bouton "tuer le plus gros processus" ?

Cet ordinateur portable a un SSD et j'ai donc décidé d'omettre l'échange. Cela fonctionne bien dans la plupart des cas, mais parfois la RAM devient un peu courte et l'ordinateur devient vraiment lent et a tendance à se figer. Existe-t-il un moyen d'implémenter un bouton "tuer le plus gros processus" qui va directement au noyau au cas où je remarquerais le gel assez rapidement ? Ou, parce qu'il s'agit d'un ordinateur, une heuristique pour le moment où il commence à se figer et à tirer sur le plus gros processus lui-même conviendrait également.

Réponse acceptée :

D'après votre commentaire, il semble que le système ne fait que permuter.

Linux a un tueur OOM, qui est invoqué lorsque le système a surchargé sa mémoire et est maintenant épuisé.
Linux par défaut effectue une surcharge de mémoire, ce qui signifie essentiellement qu'il donne aux programmes plus de mémoire que le système n'en a réellement. Il le fait en supposant que les programmes n'utiliseront pas réellement toute la mémoire qu'ils demandent. Cependant, lorsque le système manque de mémoire, il a déjà indiqué aux différents processus en cours d'exécution qu'ils avaient de la mémoire, il ne peut donc plus simplement le nier. Au lieu de cela, ce qu'il fait est d'invoquer le tueur OOM. Le tueur OOM trouve essentiellement un processus qui, selon le noyau, atténuera la condition de mémoire insuffisante. Habituellement, ce n'est que le processus qui utilise le plus de mémoire, mais l'algorithme est en fait beaucoup plus complexe que cela.

Puisque vous avez overcommit_memory défini sur (mode automatique), le noyau effectue une surcharge de mémoire. Donc, d'après votre comportement expliqué, il semble que le système change énormément.

À partir de là, il y a 2 options.

Réduire l'échange

Votre système manque de RAM, et donc le noyau commence à mettre des choses dans le swap. Si votre système manque de swap, il invoque le tueur OOM. Cependant, comme il vous reste de l'espace d'échange libre, cela ne se produit pas.

Votre idée originale, tuez manuellement un processus.

Vous pouvez tuer manuellement un processus lorsque vous pensez que le système échange trop et que quelque chose doit mourir. Cela peut être fait via les déclencheurs SysRq du noyau.

Le noyau a ce qu'il appelle "magic SysRq". Il s'agit d'une fonctionnalité qui indique au noyau d'effectuer une sorte d'opération d'urgence. Cela peut être des choses comme "remonter tous les volumes en lecture seule", "synchroniser tous les systèmes de fichiers" ou "redémarrer maintenant". L'une de ces options consiste également à invoquer le tueur de MOO.

En relation :Comment effectuer des calculs entiers et flottants, en bash ou dans d'autres langages/cadres ?

Si votre noyau a magic SysRq activé (option noyau CONFIG_MAGIC_SYSRQ ), vous pouvez le faire de 2 manières.

  1. Alt + SysRq + f
    Appuyez simplement sur ces 3 touches du clavier.
  2. echo f > /proc/sysrq-trigger
    Cela effectuera exactement la même tâche que la méthode du clavier, mais le fera par programmation.

Vous pouvez également désactiver complètement l'échange, et c'est ce que je fais sur la plupart de mes systèmes, et pour cette raison exacte. L'échange est avantageux dans la mesure où le noyau échangera de manière préventive les données qui ne sont pas utilisées, ce qui permet d'utiliser davantage de RAM pour la mise en cache. Mais cela conduit à ce problème d'échange forcé que vous voyez.

Je pense personnellement que la meilleure solution est une sorte d'option du noyau pour invoquer OOM killer lors d'un échange forcé. Fondamentalement, laissez le swap préemptif fonctionner, mais si le noyau est obligé de déplacer quelque chose dans le swap parce que vous n'avez plus de RAM, alors invoquez OOM killer.
Malheureusement, ce n'est que mon souhait personnel. Il ne le fait pas.


Linux
  1. Analyser le noyau Linux avec ftrace

  2. Linux - Pourquoi le noyau ne peut-il pas exécuter Init ?

  3. Linux - Parties propriétaires ou fermées du noyau ?

  4. Où va la mémoire restante de vm.overcommit_ratio ?

  5. Quelle doit être la taille de la partition swap ?

Comment le noyau Linux gère les interruptions

Tests d'intégration continue pour le noyau Linux

Comment vérifier la version du noyau sous Linux

Personnaliser Grub en toute simplicité :Grub-customizer

Gestion du swap dans le système Linux moderne

Comment un noyau monte-t-il la partition racine ?