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_memory
dé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.
- Alt+ SysRq+ f
Appuyez simplement sur ces 3 touches du clavier.
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.