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?).
linux
low-memory
Eddie Parker
la source
la source
Réponses:
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:
vm.oom-kill = 0
dans /etc/sysctl.conf)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.conf
ou utilisez leproc
système de fichiers pour l'activer immédiatement, sans redémarrer:la source
/etc/sysctl.conf
ne prendra probablement effet qu’au prochain redémarrage; si vous voulez faire des changements maintenant, vous devriez utiliser lasysctl
commande avec les permissions root par exemplesudo sysctl vm.overcommit_memory=2
Vous pouvez désactiver le surengagement, voir http://www.mjmwired.net/kernel/Documentation/sysctl/vm.txt#514
la source
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
free
ettop
, 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.
la source
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:
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.
la source
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:
Réduisez la mémoire utilisée par vos services en limitant les caches et autres
Créez une zone d'échange plus grande. Cela vous coûtera de la performance, mais peut vous faire gagner du temps.
Acheter plus de mémoire
la source
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:
la source
@ 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,
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
Avec vm.overcommit_ratio = 2
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é
la source