74 votes

Ubuntu commence à manquer de RAM et mon ordinateur commence à se bloquer. Quelle commande permettra de résoudre ce problème ?

Cela m'arrive assez souvent lorsque je compile un logiciel en arrière-plan et que, soudainement, tout commence à ralentir et finit par se figer [si je ne fais rien], car je n'ai plus de RAM ni d'espace d'échange.

Cette question suppose que je dispose de suffisamment de temps et de ressources pour ouvrir le terminal Gnome, rechercher dans mon historique et exécuter une sudo commandement.

Quelle commande peut m'éviter d'avoir à faire un reboot dur, ou n'importe quel reboot du tout ?

84voto

Mufaka Points 54

D'après mon expérience, Firefox et Chrome utilisent plus de RAM que mes 7 premiers ordinateurs réunis. Probablement plus que ça, mais je m'éloigne de mon sujet. La toute première chose que vous devriez faire est fermer votre navigateur . Un ordre ?

killall -9 firefox google-chrome google-chrome-stable chromium-browser

J'ai regroupé les navigateurs les plus populaires en une seule commande, mais évidemment, si vous utilisez autre chose (ou si vous savez que vous n'utilisez pas l'un de ces navigateurs), modifiez simplement la commande. Le site killall -9 ... est l'élément important. Les gens peuvent avoir des doutes sur SIGKILL (signal numéro 9) mais les navigateurs sont extrêmement résiliente. De plus, la terminaison lente par SIGTERM Cela signifie que le navigateur doit effectuer un grand nombre de tâches de nettoyage, ce qui nécessite une grande quantité de mémoire vive supplémentaire, ce que vous ne pouvez pas vous permettre dans cette situation.

Si vous ne pouvez pas obtenir cela dans un terminal déjà en fonctionnement ou dans un Alt + F2 dialogue, envisagez de passer à un ATS. Control + Alt + F2 vous amènera à TTY2 qui devrait vous permettre de vous connecter (bien que cela puisse être lent) et devrait même vous permettre d'utiliser quelque chose comme htop pour déboguer le problème. Je ne pense pas avoir jamais manqué de mémoire vive au point de ne pas pouvoir obtenir htop en haut.

La solution à long terme consiste soit à acheter plus de RAM, soit à la louer via un ordinateur distant, soit à ne pas faire ce que vous faites actuellement. Je vous laisse le soin d'examiner les arguments économiques complexes, mais en général, la RAM est bon marché à l'achat, et si vous n'avez besoin que d'une petite quantité, un serveur VPS facturé à la minute ou à l'heure est un bon choix.

66voto

Muzer Points 808

Sur un système où la clé de demande de système magique est activée, appuyer sur Alt + System Request + f (si ce n'est pas marqué sur votre clavier, System Request est souvent sur le Print Screen ) invoquera manuellement le tueur de mémoire du noyau (oomkiller), qui essaie de choisir le processus le plus mauvais pour l'utilisation de la mémoire et de le tuer. Vous pouvez faire cela si vous avez peut-être moins de temps que ce que vous avez décrit et que le système est sur le point de commencer (ou a peut-être déjà commencé) à s'emballer - dans ce cas, vous ne vous souciez probablement pas de ce qui est tué, juste que vous vous retrouviez avec un système utilisable. Parfois, cela peut finir par tuer X, mais la plupart du temps, de nos jours, il est bien meilleur qu'avant pour choisir un mauvais processus.

20voto

Score_Under Points 344

Contrairement à d'autres réponses, je vous suggère de désactiver le swap pendant que vous faites cela. Bien que l'échange permette à votre système de fonctionner de manière prévisible, et qu'il soit souvent utilisé pour augmenter le débit des applications accédant au disque (en expulsant les pages inutilisées pour laisser de la place au cache du disque), dans ce cas, il semble que votre système soit ralenti à des niveaux inutilisables parce qu'une trop grande quantité de mémoire utilisée activement est expulsée de force vers l'échange.

Je recommande de désactiver complètement le swap pendant cette tâche, afin que le tueur de mémoire morte agisse dès que la RAM se remplit.

Solutions alternatives :

  • Augmentez la vitesse de lecture du swap en mettant votre partition swap en RAID1.
    • Ou RAID0 si vous vous sentez prêt à prendre des risques, mais cela entraînera l'arrêt d'un grand nombre de programmes en cours d'exécution en cas de dysfonctionnement de l'un de vos disques.
  • Diminution du nombre de tâches de construction simultanées ("plus de cœurs = plus de vitesse", disons-nous tous, en oubliant que cela entraîne un coût linéaire pour la RAM).
  • Cela peut aller dans les deux sens, mais essayez de permettre zswap dans le noyau. Cela compresse les pages avant qu'elles ne soient envoyées au swap, ce qui peut fournir juste assez de marge de manoeuvre pour accélérer votre machine. D'un autre côté, cela pourrait finir par être une gêne avec la compression/décompression supplémentaire qu'il effectue.
  • Réduisez les optimisations ou utilisez un autre compilateur. L'optimisation du code peut parfois occuper plusieurs gigaoctets de mémoire. Si la fonction LTO est activée, vous utiliserez également beaucoup de mémoire vive à l'étape de la liaison. Si tout le reste échoue, vous pouvez essayer de compiler votre projet avec un compilateur plus léger (par ex. tcc ), au prix d'une légère baisse des performances d'exécution du produit compilé. (Ceci est généralement acceptable si vous faites cela à des fins de développement/débogage).

14voto

Gohu Points 346

Vous pouvez utiliser la commande suivante (plusieurs fois si nécessaire) pour tuer le processus qui utilise le plus de RAM sur votre système :

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

Avec :

  • ps -eo pid --no-headers --sort=-%mem : affiche les identifiants de tous les processus en cours d'exécution, triés par utilisation de la mémoire.
  • head -1 : ne garder que la première ligne (processus utilisant le plus de mémoire)
  • xargs kill -9 : tuer le processus

Modifier après le commentaire précis de Dmitry :

Il s'agit d'une solution rapide et sale qui doit être exécutée lorsqu'il n'y a pas de tâches sensibles en cours d'exécution (des tâches que vous ne voulez pas ). kill -9 ).

11voto

Avant d'exécuter vos commandes consommatrices de ressources, vous pouvez également utiliser la commande setrlimit(2) l'appel système, probablement avec l'option ulimit builtin de votre bash Shell (ou le limit intégré dans zsh) notamment avec -v pour RLIMIT_AS . Dans ce cas, une consommation trop importante de l'espace d'adressage virtuel (par exemple avec des mmap(2) o sbrk(2) utilisé par malloc(3) ) échouera (avec errno(3) être ENOMEM ).

Ensuite, ils (c'est à dire les processus affamés dans votre Shell, après que vous ayez tapé ulimit ) seraient terminés avant de geler votre système.

Lire aussi Linux a mangé ma RAM et envisagez de désactiver surengagement de la mémoire (en exécutant la commande echo 0 > /proc/sys/vm/overcommit_memory comme racine, voir proc(5) ...).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X