web-dev-qa-db-fra.com

Ubuntu manque rapidement de mémoire vive et mon ordinateur commence à geler. Quelle commande va résoudre ce problème?

Cela me arrive assez souvent lorsque je compile un logiciel en arrière-plan et soudain, tout commence à ralentir et finit par geler [si je ne fais rien], car je n’ai plus ni RAM ni espace de permutation.

Cette question suppose que je dispose de suffisamment de temps et de ressources pour ouvrir Gnome Terminal, parcourir mon historique et exécuter une commande Sudo.

Quelle commande peut m'aider à ne pas avoir à effectuer un redémarrage brutal, ou un redémarrage quelconque?

73
Akiva

D'après mon expérience, Firefox et Chrome utilisent plus de RAM que mes 7 premiers ordinateurs combinés. Probablement plus que cela, mais je m'éloigne de mon propos. La première chose à faire est de fermez votre navigateur. Une commande?

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

J'ai lié les navigateurs les plus populaires dans une seule commande, mais évidemment, si vous utilisez quelque chose d'autre (ou savez que vous n'en utilisez aucune), modifiez simplement la commande. Le killall -9 ... est le bit important. Les gens sont réticents à propos de SIGKILL(signal numéro 9) mais les navigateurs sont extrêmement très résistants. Plus que cela, se terminer lentement via SIGTERMsignifiera que le navigateur effectuera un chargement de déchets de nettoyage - ce qui nécessite une rafale de RAM supplémentaire - et c'est quelque chose que vous ne pouvez pas vous permettre dans cette situation.

Si vous ne pouvez pas obtenir cela dans un terminal déjà en marche ou un Alt+F2 dialogue, envisagez de passer à un téléscripteur. Control + Alt + F2 vous mènera à TTY2, ce qui devrait vous permettre de vous connecter (même s’il est peut-être lent) et devrait même vous permettre d’utiliser quelque chose comme htoppour résoudre le problème. Je ne pense pas avoir épuisé RAM au point de ne pouvoir obtenir htopname__.

La solution à long terme consiste à acheter plus de RAM, à la louer via un ordinateur distant ou à ne pas faire ce que vous faites actuellement. Je vous laisse les arguments économiques complexes, mais en règle générale, RAM est bon marché, mais si vous n'avez besoin que d'un montant en rafale, un serveur VPS facturé à la minute ou à l'heure est un bon choix.

84
Oli

Sur un système sur lequel la clé de demande système Magic est activée, appuyez sur Alt + System Request + f (si non marqué sur votre clavier, System Request est souvent sur le Print Screen key) invoquera manuellement le tueur de mémoire insuffisante du noyau (oomkiller), qui essaiera de choisir le processus incriminé le plus dangereux pour l'utilisation de la mémoire et de le tuer. Vous pouvez le faire 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é) à raser - auquel cas vous ne vous souciez probablement pas de savoir exactement ce qui se fait tuer, mais simplement de vous arrêter avec un système utilisable. Parfois, cela peut finir par tuer X, mais la plupart du temps ces jours-ci, il est beaucoup plus efficace de choisir un mauvais processus qu'auparavant.

66
Muzer

Contrairement à d’autres réponses, je vous suggère de désactiver le swap en même temps. Bien que l'échange permette au système de fonctionner de manière prévisible et soit souvent utilisé pour augmenter le débit des applications accédant au disque (en évacuant les pages inutilisées pour laisser de la place pour le cache disque), dans ce cas, il semble que votre système soit en train de ralentir. à des niveaux inutilisables, car la mémoire trop utilisée est expulsée de force pour être échangée.

Je recommanderais de désactiver complètement le swap lors de cette tâche, afin que le tueur de mémoire insuffisante agisse dès que le RAM se remplit.

Solutions alternatives:

  • Augmentez la vitesse de lecture du swap en plaçant votre partition swap dans RAID1
    • Ou RAID0 si vous vous sentez risqué mais que cela entraînera un grand nombre de programmes en cours d'exécution si l'un de vos disques ne fonctionne pas correctement.
  • Diminuez le nombre de travaux de construction simultanés ("plus de cœurs = plus de vitesse", disons-nous, en oubliant qu'il faut une charge linéaire en RAM)
  • Cela pourrait aller dans les deux sens, mais essayez d'activer zswapdans le noyau. Cela comprime les pages avant leur envoi sur swap, ce qui peut fournir juste assez de marge de manœuvre pour accélérer votre machine. D'un autre côté, cela pourrait devenir un obstacle à la compression/décompression supplémentaire.
  • Désactivez les optimisations ou utilisez un compilateur différent. L'optimisation du code peut parfois prendre plusieurs giga-octets de mémoire. Si LTO est activé, vous utiliserez également beaucoup de RAM au stade de la liaison. Si tout échoue, vous pouvez essayer de compiler votre projet avec un compilateur plus léger (par exemple, tccname__), au détriment d'un léger impact sur les performances d'exécution du produit compilé. (Ceci est généralement acceptable si vous le faites à des fins de développement/débogage.)
20
Score_Under

Vous pouvez utiliser la commande suivante (plusieurs fois si nécessaire) pour tuer le processus en utilisant 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 processus de tous les processus en cours, triés par utilisation de la mémoire
  • head -1: ne conserve que la première ligne (processus utilisant le plus de mémoire)
  • xargs kill -9: tuer le processus

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

Il s'agit d'une solution rapide et incorrecte à exécuter lorsque aucune tâche sensible n'est en cours d'exécution (tâches que vous ne souhaitez pas kill -9).

14
Gohu

cela me arrive assez souvent quand je compile un logiciel en arrière-plan

Dans ce cas, quelque chose comme "killall -9 make" (ou ce que vous utilisez pour gérer votre compilation, sinon make). Cela arrêtera la procédure de compilation plus loin, SIGHUP tous les processus de compilateur lancés à partir de celui-ci (et, espérons-le, les arrêtera également) et, en prime, pas besoin de Sudo si vous compilez comme le même utilisateur que vous êtes connecté. dans comme. Et puisqu'il tue la cause réelle de votre problème au lieu de votre navigateur Web, de votre session X ou de certains processus au hasard, il n'interférera pas avec tout ce que vous faisiez sur le système à ce moment-là.

11
fluffysheap

Avant d'exécuter vos commandes consommant des ressources, vous pouvez également utiliser l'appel système setrlimit (2) , probablement avec l'élément intégré ulimit de votre shell bash (ou l'élément intégré limit dans zsh) notamment avec -v pour RLIMIT_AS. Ensuite, une trop grande consommation d'espace d'adressage virtuel (par exemple, avec mmap (2) ou sbrk (2) utilisée par malloc (3) ) échouera ( avec errno (3) étant ENOMEM).

Ensuite, ils (c’est-à-dire les processus affamés dans votre shell, après avoir tapé ulimit) seraient arrêtés avant de geler votre système.

Lisez 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 en tant que root, voir proc (5) ...) .

11

Créez encore plus de swap pour vous-même.

Ce qui suit va ajouter 8G de swap:

dd if=/dev/zero of=/root/moreswap bs=1M count=8192
mkswap /root/moreswap
swapon /root/moreswap

Il sera toujours lent (vous échangez) mais vous ne devriez pas réellement vous épuiser. Les versions modernes de Linux peuvent échanger des fichiers. En ce moment, la seule utilisation d'une partition de swap est l'hibernation de votre ordinateur portable.

9
William Hay

Une façon d'obtenir rapidement un bloc de RAM libre consiste à utiliser zram , ce qui crée un disque compressé RAM et y permute. Avec n'importe quel processeur à moitié décent, cela est beaucoup plus rapide qu'un échange standard, et les taux de compression sont assez élevés avec beaucoup de porcs RAM modernes comme les navigateurs Web.

En supposant que zram soit installé et configuré, tout ce que vous avez à faire est d’exécuter

Sudo service zramswap start
5
Dmitry Grigoryev

Une autre chose à faire est de libérer du cache de page mémoire via cette commande:

echo 3 | Sudo tee /proc/sys/vm/drop_caches

De kernel.org documentation (c'est nous qui soulignons):

drop_caches

En écrivant ceci, le noyau lâchera des caches vides, ainsi que des objets de dalle récupérables comme les dentries et les inodes. Une fois supprimée, leur mémoire devient libre .

Pour libérer pagecache: echo 1>/proc/sys/vm/drop_caches Pour libérer les objets de dalle récupérables (y compris les dentiers et les inodes): echo 2>/proc/sys/vm/drop_caches Pour libérer les objets de dalle et la pagecache: echo 3>/proc/sys/vm/drop_caches

Il s'agit d'une opération non destructive qui ne libère aucun objet sale. Pour augmenter le nombre d'objets libérés par cette opération, l'utilisateur peut exécuter "sync" avant d'écrire dans/proc/sys/vm/drop_caches. Cela minimisera le nombre d'objets souillés sur le système et créera plus de candidats à abandonner.

3

Sudo swapoff -a désactive le swap, ce qui oblige le noyau à tuer automatiquement le processus avec le score le plus élevé si le système manque de mémoire. J'utilise ceci si je sais que je vais exécuter quelque chose avec beaucoup de mémoire vive que je préférerais tuer s'il perd le contrôle que de le laisser entrer en swap et rester bloqué pour toujours. Utilisez Sudo swapon -a pour le réactiver par la suite.

Plus tard, vous voudrez peut-être jeter un coup d’œil sur vos paramètres d’échange. On dirait que votre échange se trouve sur le même disque que la partition racine, ce qui ralentirait le système lorsque vous utiliserez la permutation. Évitez cela si vous le pouvez. De plus, à mon avis, les systèmes modernes sont souvent configurés avec trop d'échange. 32 Gbits RAM signifie généralement que la permutation 32 Gb est allouée par défaut, comme si vous souhaitiez réellement mettre 32 Gb dans votre espace de permutation.

3
sudo

Vous avez dit "compiler en tâche de fond". Que fais-tu au premier plan? Si vous développez avec Eclipse ou un autre IDE très gourmand en ressources, vérifiez si tout se termine correctement dans la console.

Les environnements de développement permettent souvent de démarrer plusieurs processus en cours de développement, ceux-ci peuvent rester en suspens même une fois que vous n'êtes plus intéressé par eux (dans le débogueur ou tout simplement pas correctement finis). Si le développeur ne fait pas attention, des dizaines de processus oubliés peuvent s'accumuler au cours de la journée, en utilisant plusieurs gigaoctets ensemble.

Vérifiez si tout ce qui doit être terminé dans IDE est terminé.

1
h22