Bouton "Tuer le plus gros processus"

14

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 à geler. 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 que c'est un ordinateur, une heuristique pour quand il commence à geler et à tirer le plus gros processus lui-même serait bien aussi.

Reactormonk
la source
Vous voulez dire la commande "tuer le plus gros processus"?
Ramesh
Linux a cela. Ça s'appelle le tueur OOM. Mais vous devez avoir activé la surcharge mémoire (et elle est activée par défaut dans la plupart des distributions).
Patrick
@Patrick overcommit_memoryest 0, overcommit_ratioest 50.
Reactormonk

Réponses:

12

D'après votre commentaire, il semble que le système permute simplement.

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 la 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à dit aux différents processus en cours d'exécution qu'ils avaient la mémoire, il ne peut donc plus la refuser. Au lieu de cela, il invoque le tueur OOM. Le tueur OOM trouve fondamentalement 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 réalité beaucoup plus complexe que cela.

Depuis que vous avez overcommit_memorydéfini sur 0(mode automatique), le noyau effectue une surcharge de mémoire. Donc, d'après votre comportement expliqué, il semble que le système permute simplement lourdement.

De là, il y a 2 options.

Réduisez l'échange

Votre système manque de RAM, et donc le noyau commence à pousser les choses en swap. Si votre système manque de swap, il appelle alors 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 du noyau SysRq.

Le noyau a ce qu'il appelle "Magic SysRq". C'est un peu de 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 OOM.

Si votre noyau a SysRq magique 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 fait par programmation.

Vous pouvez également désactiver entièrement le swap, et c'est ce que je fais sur la plupart de mes systèmes, et pour cette raison exacte. L'échange est bénéfique dans la mesure où le noyau échangera de manière préventive les données qui ne sont pas utilisées, permettant à une plus grande partie de votre RAM d'être utilisée pour la mise en cache. Mais cela conduit à ce problème de permutation forcée que vous voyez.

Personnellement, je pense que la meilleure solution est une sorte d'option de noyau pour invoquer le tueur OOM 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 manquez de RAM, alors appelez OOM killer.
Malheureusement, ce n'est que mon souhait personnel. Cela ne fait pas cela.

Patrick
la source
Je ne connaissais pas OOM Killer. Je pensais à un script qui surveille en permanence l'utilisation de la mémoire à l'aide de la commande topou pset s'il dépasse une certaine limite de seuil, tuant ce processus à l'aide de la killcommande.
Ramesh
Je n'utilise aucun échange.
Reactormonk
pour voir quel processus a été tué par oom killer:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana
@Tass Oh, j'ai complètement glacé sur le commentaire "J'ai décidé d'omettre le swap", désolé :-(. Bien que les informations "tuer manuellement un processus" existent toujours. Cependant, vous ne devriez pas ressentir de lenteur lorsque vous manquez de mémoire. Vous devrait faire l'expérience du noyau en train de tuer des choses
Patrick
@Patrick cela arrive, mais après ~ 30 minutes.
Reactormonk