Évitez le démantèlement d'applications saturées sous Linux

34

Je constate que parfois, ma machine Linux manque de mémoire et commence à détruire des processus aléatoires pour la gérer.

Je suis curieux de savoir ce que font les administrateurs pour éviter cela? La seule solution réelle consiste-t-elle à augmenter la quantité de mémoire utilisée (est-ce que l'augmentation du swap seul vous aidera?) Ou existe-t-il de meilleurs moyens de configurer la boîte avec un logiciel pour éviter cela? (c.-à-d. des quotas ou quelque chose du genre?).

Eddie Parker
la source
J'ai trouvé une réponse ici: serverfault.com/questions/362589/… La réponse de Patrick est très instructive
Amaury

Réponses:

44

Par défaut, Linux a un concept de gestion de la mémoire quelque peu endommagé: il vous permet d'allouer plus de mémoire que votre système, puis lance de manière aléatoire un processus dans la tête lorsqu'il rencontre un problème. (La sémantique de ce qui est tué est plus complexe que cela - Google "Tueur de MOO Linux" pour de nombreux détails et arguments sur le point de savoir si c'est une bonne ou une mauvaise chose).


Pour restaurer un semblant de santé mentale dans votre gestion de mémoire:

  1. Désactiver le tueur OOM (Mettez vm.oom-kill = 0dans /etc/sysctl.conf)
  2. Désactiver la surcharge de la mémoire (Mettez vm.overcommit_memory = 2/etc/sysctl.conf)
    Notez qu’il s’agit d’une valeur trinaire: 0 = "estimer si nous avons assez de RAM", 1 = "Dites toujours oui", 2 = "dites non si nous n’avons pas avoir la mémoire ")

Ces paramètres feront que Linux se comportera de la manière traditionnelle (si un processus demande plus de mémoire que ce qui est disponible, malloc () échouera et le processus demandant la mémoire devrait faire face à cet échec).

Redémarrez votre ordinateur pour le recharger /etc/sysctl.confou utilisez le procsystème de fichiers pour l'activer immédiatement, sans redémarrer:

echo 2 > /proc/sys/vm/overcommit_memory 
voretaq7
la source
11
Ce n’est pas Linux qui est braindé, mais les programmeurs qui allouent la mémoire, ne l’utilisent jamais. Les machines virtuelles Java sont notoires avec cela. En tant qu'administrateur qui gère des serveurs exécutant des applications Java, je ne survivrais pas une seconde sans surconsommation.
Aleksandar Ivanisevic,
11
Les programmeurs Java n'allouent pas de mémoire inutilisée, il n'y a pas de malloc en java. Je pense que vous confondez cela avec les paramètres de la machine virtuelle Java tels que -Xms. Dans tous les cas, augmenter la taille de la mémoire virtuelle en ajoutant de l'espace de swap est une solution beaucoup plus sûre que le dépassement de capacité.
Juillet
5
Notez que cette solution n'empêchera pas votre système de manquer de mémoire ou de tuer les processus. Cela vous ramènera seulement au comportement Unix traditionnel, où si un processus mange toute votre mémoire, le suivant qui essaye de malloc n'en obtiendra pas (et le plus probablement plantera). Si vous êtes malchanceux, le processus suivant est init (ou quelque chose d'autre qui est critique), ce que le tueur de MOO évite généralement.
pehrs
8
jlliagre, j’ai dit les machines virtuelles Java (machines virtuelles), pas les programmes Java, même si, du point de vue de l’administrateur, il en va de même :)
Aleksandar Ivanisevic
8
Il convient peut-être de mentionner ici que l’ajout de ce qui précède /etc/sysctl.confne prendra probablement effet qu’au prochain redémarrage; si vous voulez faire des changements maintenant, vous devriez utiliser la sysctlcommande avec les permissions root par exemplesudo sysctl vm.overcommit_memory=2
nickgrim
3

La réponse courte, pour un serveur, est d’acheter et d’installer plus de RAM.

Un serveur qui rencontre régulièrement suffisamment d' erreurs OOM (Out-Of-Memory), puis outre l'option surcommit sysctl du gestionnaire VM (mémoire virtuelle) dans les noyaux Linux, ce n'est pas une bonne chose.

Augmenter la quantité de swap (mémoire virtuelle qui a été paginée sur disque par le gestionnaire de mémoire du noyau) aidera si les valeurs actuelles sont basses et si l’utilisation implique de nombreuses tâches, chacune avec une telle quantité de mémoire, plutôt qu’une ou plusieurs. traite chacun demandant une quantité énorme de la mémoire virtuelle totale disponible (RAM + swap).

Pour de nombreuses applications allouant plus de deux fois (2x) la quantité de mémoire RAM échangée, le retour sur amélioration est décroissant. Dans certaines grandes simulations informatiques, cela peut être acceptable si le ralentissement est supportable.

Avec la RAM (ECC ou non), soyez assez abordable pour de petites quantités, par exemple 4-16 Go, je dois admettre que je n’ai pas connu ce problème moi-même depuis longtemps.

Les informations de base sur la consommation de mémoire, notamment l'utilisation de freeet top, triées par l'utilisation de la mémoire, sont les deux évaluations rapides les plus courantes des modèles d'utilisation de la mémoire. Assurez-vous donc au moins de comprendre la signification de chaque champ dans la sortie de ces commandes.

En l'absence d'applications spécifiques (base de données, serveur de service réseau, traitement vidéo en temps réel, par exemple) et de l'utilisation du serveur (quelques utilisateurs chevronnés, connexions utilisateur / client de 100 à 1000), je ne peux penser à aucune recommandation générale concernant le traitement des données. le problème de MOO.

mctylr
la source
3

L'augmentation de la quantité de mémoire physique peut ne pas être une réponse efficace dans toutes les circonstances.

Une façon de vérifier cela est la commande "atop". En particulier ces deux lignes.

Ceci est hors serveur quand il était sain:

MEM | tot   23.7G | free   10.0G | cache   3.9G | buff  185.4M | slab  207.8M |
SWP | tot    5.7G | free    5.7G |              | vmcom  28.1G | vmlim  27.0G |

Quand cela fonctionnait mal (et avant que nous ajustions surcommit_memory de 50 à 90, nous constaterions un comportement avec vmcom dépassant largement les 50G, des processus explosifs épouvantables toutes les quelques secondes, et la charge continuant à rebondir radicalement à cause des processus enfants NFSd et re-créé continuellement.

Nous avons récemment dupliqué des cas où des serveurs de terminaux Linux multi-utilisateurs surchargent massivement l'allocation de mémoire virtuelle, mais où très peu des pages demandées sont réellement utilisées.

Bien qu'il ne soit pas conseillé de suivre exactement cet itinéraire, nous avons ajusté la mémoire de surcharge de 50 à 90 valeurs par défaut, ce qui a atténué une partie du problème. Nous avons fini par devoir déplacer tous les utilisateurs vers un autre serveur de terminal et le redémarrer pour en voir les avantages.

Magellan
la source
2

Vous pouvez utiliser ulimit pour réduire la quantité de mémoire qu'un processus est autorisé à réclamer avant d'être supprimé. C'est très utile si votre problème est un ou plusieurs processus fugitifs qui plantent votre serveur.

Si votre problème est que vous n’avez tout simplement pas assez de mémoire pour exécuter les services dont vous avez besoin, il n’existe que trois solutions:

  1. Réduisez la mémoire utilisée par vos services en limitant les caches et autres

  2. Créez une zone d'échange plus grande. Cela vous coûtera de la performance, mais peut vous faire gagner du temps.

  3. Acheter plus de mémoire

pehrs
la source
0

J'avais un problème similaire lié à ce bogue et la solution consistait à utiliser un noyau plus ancien / plus récent (corrigé).

Cependant, à ce moment-là, je ne pouvais pas redémarrer ma machine. Une solution de contournement désagréable consistait donc à ouvrir une session en tant que caches root et à effacer le système avec cette commande:

echo 3 > /proc/sys/vm/drop_caches
Krzysztof Dryja
la source
-5

@ voretaq7 Linux n'a pas de concept de gestion de la mémoire endommagé par le cerveau. Par défaut, vm.overcommit_ratio vaut 0,

0       -   Heuristic overcommit handling. Obvious overcommits of
            address space are refused. Used for a typical system. It
            ensures a seriously wild allocation fails while allowing
            overcommit to reduce swap usage.  root is allowed to
            allocate slightly more memory in this mode. This is the
            default.

De cette façon, si vous avez 4 Go de RAM et que vous essayez d'allouer 4,2 Go avec un malloc de mémoire virtuelle, votre allocation échouera.

Avec vm.overcommit_ratio = 1

            1    -   Always overcommit. Appropriate for some scientific
            applications. Classic example is code using sparse arrays
            and just relying on the virtual memory consisting almost
            entirely of zero pages.

Avec vm.overcommit_ratio = 2

           2    -   Don't overcommit. The total address space commit
            for the system is not permitted to exceed swap + a
            configurable percentage (default is 50) of physical RAM.
            Depending on the percentage you use, in most situations
            this means a process will not be killed while accessing
            pages but will receive errors on memory allocation as
            appropriate.

            Useful for applications that want to guarantee their
            memory allocations will be available in the future
            without having to initialize every page.

Donc, par défaut, Linux ne sur-engage pas, si votre application a plus de mémoire que vous avez, peut-être que votre code est bogué

c4f4t0r
la source
2
Vous vous êtes contredit ici. En haut, vous dites "par défaut, vm.overcommit_ratio a la valeur 0" et en bas, vous dites "par défaut, Linux ne sur-engage pas". Si ce dernier était vrai, vm.overcommit_ratio serait 2 par défaut!
Michael Hampton
vm.overcommit_ratio = 0, malloc n'alloue pas plus de mémoire que votre RAM physique, donc pour moi, cela signifie ne pas surcharger, c’est quand vous pouvez allouer plus de
ressources
2
Oui, vous avez mal compris.
Michael Hampton
vous avez mal compris, le 0 par défaut, ne permet pas d'allouer plus de mémoire virtuelle que de RAM et 2 ne permet pas d'autoriser vm.overcommit_ratio + espace swap, donc si j'ai mal compris, dites-moi quoi
c4f4t0r
2
Bien sûr. Les "excédents évidents" sont refusés. Le reste passe. Vous devez lire plus attentivement.
Michael Hampton