web-dev-qa-db-fra.com

Oom Killer ne fonctionne pas correctement, conduit à un système d'exploitation gelé

Pendant des années, le Oom Killer de mon système d'exploitation ne fonctionne pas correctement et conduit à un système gelé.
[.____] Lorsque l'utilisation de la mémoire est très élevée, tout le système a tendance à "geler" (en fait: devenir extrêmement lent) pour heures ou même jours , au lieu de tuer des processus pour libérer la mémoire.
[.____] Le maximum que j'ai enregistré est 7 jours avant de vous démissionner pour faire fonctionner une réinitialisation.
[.____] Lorsque OOM est sur le point d'être atteint, le Iowait est très très élevé (environ 70%), avant de devenir incommodé.
[.____] L'outil: iotop a montré que chaque programme lit à un très haut débit (par dizaines de MB/sec) de mon disque dur.
[.____] ce que ces programmes lisent?
[.____] - La hiérarchie de l'annuaire?
[.____] - Le code exécutable lui-même?
[.____] Je ne suis pas exactement maintenant.

[Édité] À l'époque, j'ai écrit ce message (en 2017), j'utilisais un Archlinux préparé (4.9.27-1-LTS), mais j'avais déjà connu la question depuis des années auparavant.
[.____] J'ai connu le même problème avec diverses distributions Linux et différentes configurations matérielles.
[.____] Actuellement (2019), j'utilise un préalable debian 9.6 (4.9.0) J'ai 16 gb de la RAM physique, un SSD sur lequel mon système d'exploitation est installé , et pas de Swap Partition.

En raison de la quantité de RAM que j'ai, je ne veux pas activer une partition de swap, car elle retarderait simplement l'apparition de la question.
[.____] aussi, avec SSDS Swapping trop souvent pourrait potentiellement réduire la durée de vie du disque.
Au fait, j'ai déjà essayé avec et sans une partition de swap, il n'a prouvé que de retarder l'apparition du problème, mais n'étant pas la solution.

Pour moi, le problème est causé par le fait que Linux dépose des données essentielles du caches , qui conduit à un système gelé car il doit tout lire, à chaque fois du disque dur.

Je me demande même si Linux ne lâcherait pas les pages de code exécutable des programmes d'exécution, ce qui expliquerait pourquoi les programmes qui ne lisaient normalement pas beaucoup de données, se comporter de cette manière dans cette situation.

J'ai essayé plusieurs choses dans l'espoir de résoudre ce problème.
[.____] l'un était pour définir /proc/sys/vm/min_free_kbytes à 1000000 (1 Go).
[.____] parce que ceci 1 gb devrait rester libre, je pensais que cette mémoire serait réservée par Linux pour cacher des données importantes.
Mais cela n'a pas fonctionné.

En outre, je pense que l'utile d'ajouter que même si cela pourrait sembler grand en théorie, limiter la taille de la mémoire virtuelle à la taille de la mémoire physique, en définissant /proc/sys/vm/overcommit_memory à 2 N'est pas décemment techniquement possible dans ma situation, car le type d'applications que j'utilise nécessite plus de mémoire virtuelle qu'elles utilisent efficacement pour certaines raisons.
[.____] Selon le fichier /proc/meminfo, les Commited_AS La valeur est souvent supérieure au double de la RAM physique sur mon système (16 gb, commitée_as Souvent> 32 Go).

J'ai vécu ce problème avec /proc/sys/vm/overcommit_memory à sa valeur par défaut: 0, et pendant un moment que je l'ai défini à: 1, parce que j'ai préféré des programmes à tuer par le Oom Killer plutôt que de se comporter à tort, car ils ne vérifient pas les valeurs de retour de malloc lorsque les allocations sont refusées.

Quand je parlais de ce numéro sur [~ # ~] IRC [~ # ~], j'ai rencontré d'autres utilisateurs de Linux qui ont expérimenté ce même problème, alors je suppose que beaucoup de les utilisateurs sont concernés par cela.
[.____] Pour moi, cela n'est pas acceptable car même Windows traite mieux avec une utilisation élevée de la mémoire.

Si vous avez besoin de plus d'informations, dites-moi s'il vous plaît.

Documentation:
[.____] https://fr.wikipedia.org/wiki/hashing_%28Computer_science%29
https://fr.wikipedia.org/wiki/memory_overgimentalment
https://www.kernel.org/doc/documentation/sysctl/vm.txt
[.____] https://www.kernel.org/doc/documentation/vm/overcommit- Accueil
https://lwn.net/articles/317814/

Ils en parlent:
[.____] Pourquoi le tueur Linux hors de mémoire (OOM) n'est pas exécuté automatiquement, mais fonctionne sur la clé SysRQ?
pourquoi Oom-Killer ne parvient parfois pas à tuer des porcs de ressources?
[.____] précharger le tueur OOM
est-il possible de déclencher une oom-tueur sur un échange forcé?
Comment éviter une latence élevée près de la situation de l'OOM?
[.____] https://lwn.net/articles/104179/
[.____] https://bbs.archlinux.org/viewtopic.php?id=23384

28
M89

J'ai trouvé deux explications (de la même chose) pourquoi kswapd0 fait lecture de disque constant arrive Bien avant que l'OOM-Killer tue le processus incriminé:

  1. voir la réponse et le commentaire de cette askubuntu se réponse
  2. voir les commentaires de la réponse et de David Schwartz de cette réponse sur UNIX SE

Je citerai ici le commentaire de 1. Ce qui a vraiment ouvert mes yeux sur pourquoi je recevais une lecture de disque constant alors que tout était gelen :

Par exemple, envisagez un cas où vous avez zéro Swap et que le système est presque à court de bélier. Le noyau prendra la mémoire par ex. Firefox (cela peut le faire car Firefox exécute un code exécutable chargé de disque - le code peut être chargé à partir du disque si nécessaire). Si Firefox a besoin d'accéder à la touche RAM à nouveau n secondes plus tard, la CPU génère un "défaut difficile" qui oblige Linux à libérer certaines RAM (par exemple, prenez quelques RAM d'un autre processus), charge les données manquantes à partir du disque puis permettent Firefox de continuer comme d'habitude. Ceci est assez similaire à celui d'un échange normal et kswapd0 le fait. - Mikko Rantalainen 15 févr. 13:08

Si quelqu'un a un moyen de désactiver ce comportement (peut-être recompiler le noyau avec quelles options? ), s'il vous plaît laissez-moi savoir dès que possible! Beaucoup apprécié, merci!

Mise à jour: La seule façon dont j'ai trouvé jusqu'à présent est de corriger le noyau, et cela fonctionne pour moi avec swap désactivé (c.-à-d. CONFIG_SWAP is not set), mais ne fonctionne pas pour d'autres avec l'échange a permis semble ; Voir le patch à l'intérieur - this question.

7
user306023

Les memory.min Paramètre dans le cgroups-v2 Le contrôleur de mémoire devrait aider.

À savoir, laissez-moi citer:

Protection de la mémoire dure. Si l'utilisation de la mémoire d'un cgroup est dans sa limite Min effective, la mémoire du cgroup ne sera pas récupérée dans aucune condition. S'il n'y a pas de mémoire recouvrée non protégée disponible, OOM Killer est invoqué.

Source: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

0
Vladimir Nikishkin