web-dev-qa-db-fra.com

Comment puis-je empêcher Linux de geler lorsque vous êtes hors de mémoire?

Aujourd'hui, je (accidentellement) a dirigé un programme sur ma boîte Linux qui a rapidement utilisé beaucoup de mémoire. Mon système a gelé, est devenu insensible et j'ai donc été incapable de tuer le délinquant.

Comment puis-je éviter cela à l'avenir? Ne peut-il pas au moins garder un noyau réactif ou quelque chose de courir?

25
johv

Je parierai que le système n'a pas réellement "geler" (dans le sens où le noyau suspendu), mais était plutôt très insensible. Il est probable que c'était juste en train d'échanger très fort, ce qui entraîne une performance interactive et un débit système à tomber comme une pierre.

Vous pourrait éteindre l'échange, mais cela modifie simplement le problème des performances médiocres aux processus tués par l'OOM (et que tout le plaisir des causes), ainsi que des performances réduites en raison du cache de disque moins disponible.

Alternativement, vous pouvez utiliser des limites de ressources par traitement (communément appelées _ rlimit et/ou ulimit) pour supprimer la possibilité d'un processus unique prenant une quantité de mémoire ridicule et entraînant un échange, mais Cela vous pousse simplement à un territoire divertissant avec des processus qui meurent à des moments gênants car ils voulaient un peu plus de mémoire que le système n'était prêt à leur donner.

Si vous saviez que vous alliez faire quelque chose qui était susceptible de causer une utilisation massive de la mémoire, vous pourriez probablement écrire un programme d'emballage qui a fait une mlockall() puis exécutée votre coquille; Cela resterait en mémoire et seriez la chose la plus proche de "garder un noyau réactif" que vous êtes susceptible d'obtenir (car ce n'est pas si le processeur est surutilisé qui est le problème).

Personnellement, je m'abonne à la méthode "Ne faites pas de choses stupides" de contrôle des ressources. Si vous avez une racine, vous pouvez faire toutes sortes de dommages causés à un système, et ainsi faire n'importe quoi que vous ne connaissez pas les résultats probables d'une entreprise risquée.

15
womble

Comme mentionné ci-dessus dans Commentaire par Tronic, il est possible d'appeler directement Oom-Killer (hors de mémoire Killer) directement par la combinaison du clavier SysRq-F.

SysRq La clé est généralement combinée dans PrtSc clé sur les claviers.

Oom-Killer tue certains processus (-ES) et le système devient à nouveau réactif. Accès direct à Oom-Killer peut ne pas être activé par défaut, PLZ Checkout Cette question Pour rechercher son statut et/ou l'activer.

PS: Cela m'a beaucoup aidé. Je suis d'accord avec l'opinion selon laquelle il s'agit des conseils les plus utiles sur ce problème si cela causé par Chrome ou quel que soit le logiciel gourmands de mémoire. Mais vous devez garder à l'esprit que l'OOM-Killer pourrait tuer une très importante processus, utilisez-le soigneusement.

8
Arkemlar

Ceci est un bug connu depuis 2007 - voir gel du système sur une utilisation haute mémoire .

Dans cette situation, Windows affiche une boîte de dialogue avertissant l'utilisateur pour fermer une ou plusieurs applications.

1
Dan Dascalescu

Si vous avez envie de recompiler le noyau, vous pouvez essayer le patch de la section EDIT section de cette question: https://stackoverflow.com/q/52067753/10239615/10239615
[.____] Cela n'explique pas la pages Active(file) Pages lors de la pression de mémoire élevée et permet ainsi à Oom Killer de se déclencher presque instantanément car le noyau n'a plus besoin de passer des minutes de relecture constante de la lecture de disque des pages de code exécutable de chaque processus provoquant un système d'exploitation congelé.

0
user483652