Aujourd'hui, j'ai (accidentellement) exécuté un programme sur ma machine Linux qui a rapidement utilisé beaucoup de mémoire. Mon système a gelé, est devenu insensible et je n'ai donc pas pu tuer le délinquant.
Comment puis-je empêcher cela à l'avenir? Ne peut-il pas au moins garder un noyau réactif ou quelque chose en cours d'exécution?
Réponses:
Je parie que le système n'a pas vraiment "gelé" (dans le sens où le noyau s'est bloqué), mais qu'il ne répondait tout simplement pas. Il y a de fortes chances qu'il soit simplement échangé très fort, provoquant une baisse des performances interactives et du débit du système comme une pierre.
Vous pouvez désactiver le swap, mais cela ne fait que changer le problème des performances médiocres aux processus tués par OOM (et tout le plaisir qui en découle), ainsi que des performances réduites en raison du moins de cache disque disponible.
Alternativement, vous pouvez utiliser des limites de ressources par processus (communément appelées
rlimit
et / ouulimit
) pour éliminer la possibilité qu'un seul processus prenne une quantité ridicule de mémoire et provoque un échange, mais cela vous pousse simplement à vous divertir avec des processus qui meurent à moments gênants car ils voulaient un peu plus de mémoire que le système ne voulait leur en donner.Si vous saviez que vous alliez faire quelque chose susceptible d'entraîner une utilisation massive de la mémoire, vous pourriez probablement écrire un programme wrapper qui a fait
mlockall()
et exécuté votre shell; cela le garderait en mémoire et serait la chose la plus proche de "garder un noyau réactif" que vous obtiendrez probablement (car ce n'est pas que le processeur est surutilisé qui est le problème).Personnellement, je souscris à la méthode de contrôle des ressources «ne fais pas de bêtises». Si vous avez un root, vous pouvez endommager un système de toutes sortes, et ainsi faire tout ce dont vous ne connaissez pas les résultats probables est une entreprise risquée.
la source
ulimit
, ou même les groupes de discussion de nos jours, si vous êtes un jeune branché, fait très bien le travail. Si vous apportez des modifications aux requêtes en production sans valider leurs effets dans un environnement non critique, c'est votre problème d'origine.Comme mentionné ci-dessus dans le commentaire de Tronic, il est possible d'appeler OOM-killer (out of memory killer) directement par la combinaison de clavier SysRq- F.
SysRqla touche est généralement combinée dans la PrtSctouche sur les claviers.
OOM-killer tue certains processus (-es) et le système redevient réactif. L'accès direct à OOM-killer peut ne pas être activé par défaut, consultez cette question pour savoir comment vérifier son état et / ou l'activer.
PS: Cela m'a beaucoup aidé. Je suis d'accord avec l'opinion que c'est le conseil le plus utile à propos de ce problème s'il est causé par Chrome ou tout autre logiciel gourmand en mémoire. Mais vous devez garder à l'esprit que OOM-killer pourrait tuer un processus vraiment important, utilisez-le avec précaution.
la source
Il s'agit d'un bogue connu depuis 2007 - voir Gel du système en cas d'utilisation élevée de la mémoire .
Dans cette situation, Windows affiche une boîte de dialogue avertissant l'utilisateur de fermer une ou plusieurs applications.
la source
Si vous avez envie de recompiler le noyau, vous pouvez essayer le patch de la
EDIT
section de cette question: /programming//q/52067753/10239615Il n'efface pas les
Active(file)
pages lors d'une forte pression mémoire et permet donc OOM-killer pour se déclencher presque instantanément car le noyau n'a plus besoin de passer des minutes de relecture constante depuis le disque des pages de code exécutables de chaque processus, provoquant un système d'exploitation gelé.la source
C'est quelque chose de particulièrement difficile à éviter. C'est parce que le noyau commence à échanger. Une solution consiste à désactiver l'échange. Lorsque le système manque de mémoire, plutôt que de commencer à échanger, le noyau va tuer certains processus; généralement, il sélectionne le processus correct à tuer, mais il est de toute façon préférable de tuer un processus aléatoire que d'avoir un système qui ne répond pas.
Cela peut être une solution particulièrement bonne pour les serveurs, car les serveurs ont souvent suffisamment de RAM et lorsqu'ils commencent à utiliser l'espace d'échange, cela signifie que quelque chose ne va pas de toute façon. Cependant, les ordinateurs de bureau ont généralement besoin de l'espace d'échange, donc je pense qu'il n'y a pas de bonne solution pour les ordinateurs de bureau. Je désactive souvent l'espace de swap sur les serveurs, en particulier en cas de suspicion de fuite de mémoire.
la source