Question Ubuntu manque rapidement de mémoire vive et mon ordinateur commence à geler. Quelle commande résoudra cela?


Cela m'arrive assez souvent lorsque je compile des logiciels en arrière-plan et soudain, tout commence à ralentir et finalement à se figer [si je ne fais rien], car je n'ai plus à la fois de mémoire vive et d'espace d'échange.

Cette question suppose que j'ai suffisamment de temps et de ressources pour ouvrir Gnome Terminal, parcourir mon historique et en exécuter un sudo commander.

Quelle commande peut me sauver de devoir faire un redémarrage brutal ou un redémarrage du tout?


72
2017-07-03 09:15


origine


Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacé pour discuter. - Thomas Ward♦
Si vous manquez d'espace d'échange, je pense que vous en avez trop peu. J'ai eu 20G d'espace d'échange sur cet ordinateur. Le fait est que cela vous donne suffisamment de temps avec un système utilisable pour tuer tout ce qui est en train de manger votre mémoire. Ce n'est pas quelque chose où vous ne prenez que ce que vous allez utiliser, mais ce que vous espérez ne jamais utiliser. - JoL
Êtes-vous sûr que la RAM et l'échange sont remplis? Si tel était le cas, le gestionnaire de MOO tuerait votre compilateur et libérerait de la mémoire (et gâcherait également votre processus de génération). Sinon, je pense que ça ne fait que se remplir, et peut-être que votre système est lent parce que votre échange est sur votre disque système. - sudo
Essayez de réduire le nombre de vos builds parallèles si vous n'avez pas assez de RAM pour le supporter. Si votre build commence à échanger, vous serez beaucoup plus lent. Avec make, essayez -j4 par exemple pour 4 builds parallèles à la fois. - Shahbaz
"Alexa me commande 8 Go de ram"


Réponses:


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

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

J'ai réuni les navigateurs les plus populaires en une seule commande, mais évidemment, si vous utilisez quelque chose d'autre (ou si vous ne l'utilisez pas), modifiez simplement la commande. le killall -9 ... est le bit important. Les gens se moquent de SIGKILL (signal numéro 9) mais les navigateurs sont extrêmement résilient. Plus que cela, se terminant lentement par SIGTERM Cela signifie que le navigateur effectue une grande quantité de nettoyage - ce qui nécessite une rafale de RAM supplémentaire - et c'est une chose que vous ne pouvez pas vous permettre dans cette situation.

Si vous ne pouvez pas obtenir cela dans un terminal déjà en cours ou un Alt+F2 dialogue, envisagez de passer à un téléscripteur. Contrôle + Alt + F2 vous amène à TTY2 qui devrait vous permettre de vous connecter (même si cela peut ê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 RAM au point que je ne pouvais pas obtenir htop en haut

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


84
2017-07-03 09:30



Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été déplacé pour discuter. - Thomas Ward♦
J'ai quelques commandes liées à la mienne lazygit commande que j'utilise de temps en temps, peut-être que quelque chose comme ça pourrait être appliqué ici? La totalité killall ... le script pourrait être réduit à un simple emptyram ou quelque chose comme ça - Francisco Presencia
Vous n'avez pas besoin d'exécuter la commande complète si vous savez quel navigateur est en cours d'exécution et je suppose que la plupart des personnes capables d'identifier une pénurie de RAM le font. Par extension, je trouverais plus difficile de me rappeler que j'avais écrit un emptyram script que juste poinçonnant killall -9 firefox. - Oli♦
Acheter de la RAM ... pourquoi ne pas simplement télécharger plus de RAM? - Stephan Bijzitter
Eh bien, vous pourriez plaisanter, mais si vous avez besoin de faire quelque chose pendant une courte période, Besoins beaucoup plus de RAM et de CPU que vous avez, louer un VPS à la minute est très économique pour les one-shots. - Oli♦


Sur un système sur lequel la clé de demande du système Magic est activée, appuyez sur Alt  + Demande du système + F (si non marqué sur votre clavier, Demande du système est souvent sur le Capture d'écran clé) invoquera manuellement le tueur de mémoire hors du noyau (oomkiller), qui essaie de choisir le pire processus incriminé 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 peut-être a-t-il déjà commencé). avec un système utilisable. Parfois, cela peut tuer X, mais la plupart du temps, il est beaucoup plus efficace de choisir un mauvais processus que par le passé.


66
2017-07-03 10:44



@ T.Sar, si vous allez directement à la bagarre, vous perdez ou avez déjà une chance de tuer un mangeur de mémoire. Vous ne gagnez rien si vous vous abstenez d'agir. - Ruslan
@Muzer cela ne fonctionnera que lorsque vous aurez défini kernel.sysrq à 1 ou un nombre incluant le bon bit dans votre /etc/sysctl.d/10-magic-sysrq.conf. - Ruslan
@ T.Sar Vous ne perdrez pas votre progression si vous utilisez un système de construction sain. Vous conserverez tous les fichiers objets, sauf celui que vous compiliez, puis vous reviendrez à peu près là où vous l'aviez laissé. - Muzer
@ T.Sar Ce n'est pas parce que ce que vous compilez que le système de construction n'est pas sain. Depuis des temps immémoriaux, les systèmes de construction ont stocké des fichiers objets à réutiliser dans les compilations ultérieures. D'un autre côté, je peux certainement nommer beaucoup de projets logiciels avec moins d'intelligence que Linux (qui est généralement assez bien conçu). Par exemple, en compilant quelque chose comme Firefox ou OpenOffice avec 8 threads de construction parallèles, je peux facilement le voir en prenant l'ordre de gigaoctets de RAM. Il existe également de nombreux systèmes d'entreprise monolithiques qui dépendent de centaines de bibliothèques. - Muzer
@ T.Sar Linux n'est pas vraiment complexe à partir du POV du compilateur. En fait, il n'y a pratiquement aucun programme C qui le soit. Qu'en est-il du C ++? Avez-vous déjà essayé de créer un programme en utilisant Eigen ou Boost? Vous seriez surpris de la quantité de mémoire que le compilateur mange parfois avec de tels programmes - et ils ne doivent pas nécessairement être eux-mêmes complexes. - Ruslan


Contrairement à d'autres réponses, je suggère que vous désactiviez le swap pendant que vous le faites. Alors que swap permet à votre système de fonctionner de manière prévisible et qu'il est 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 disque), il semble que votre système soit ralenti à des niveaux inutilisables parce que trop de mémoire activement utilisée est expulsée de force pour échanger.

Je recommande de désactiver le swap tout en effectuant cette tâche, afin que le tueur hors mémoire agisse dès que la mémoire RAM se remplit.

Solutions alternatives:

  • Augmentez la vitesse de lecture du swap en plaçant votre partition de swap dans RAID1
    • Ou RAID0 si vous vous sentez risqué, mais cela provoquera un grand nombre de programmes en cours d'exécution si l'un de vos disques ne fonctionne pas correctement.
  • Diminuer le nombre de travaux de construction simultanés ("plus de cœurs = plus de vitesse", nous disons tous, en oubliant que cela prend un péage linéaire sur la RAM)
  • Cela pourrait aller dans les deux sens, mais essayez d’activer zswap dans le noyau. Cela compresse les pages avant qu'elles ne soient envoyées à l'échange, ce qui peut fournir juste assez d'espace pour accélérer votre machine. D'un autre côté, cela pourrait être un obstacle avec la compression / décompression supplémentaire.
  • Diminuez les optimisations ou utilisez un autre compilateur. L'optimisation du code peut parfois prendre plusieurs gigaoctets de mémoire. Si vous avez activé LTO, vous allez utiliser beaucoup de RAM au stade 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’un léger impact sur les performances du produit compilé. (Cela est généralement acceptable si vous le faites à des fins de développement / débogage.)

20
2017-07-03 17:47



Si le swap est désactivé, c'est le comportement de Linux lorsque vous manquez de mémoire. Si Linux n'invoque pas le killer hors mémoire mais se fige à la place, cela peut signifier qu'il existe des problèmes plus profonds avec la configuration. Bien sûr, si swap est activé, le comportement est légèrement différent. - Score_Under
@Akiva Avez-vous déjà essayé sans échange? Cette réponse est parfaite. Je voudrais ajouter cela en cours d'exécution sudo swapoff -a peut vous sauver lorsque vous êtes déjà dans une impasse: il arrêtera immédiatement toute utilisation supplémentaire de l’espace de swap, c’est-à-dire que le tueur de MOO devrait être appelé dans l’instant suivant et mettre la machine en état de marche. sudo swapoff -aest également une excellente mesure de précaution lors du débogage de fuites de mémoire ou de la compilation, par exemple, de Firefox. Normalement, le swap est un peu utile (par exemple pour le mode hibernation ou le remplacement de fichiers vraiment inédits), mais lorsque vous utilisez réellement de la mémoire, les blocages sont pires. - Jonas Schäfer
@Score_Under: La séparation des partitions de swap sur chaque disque est censée être nettement plus efficace que la permutation sur un périphérique md raid0. J'oublie où j'ai lu ça. Le wiki RAID Linux recommande des partitions séparées sur raid0, mais ne dit rien de très fort sur la raison pour laquelle il est préférable. Quoi qu'il en soit oui, RAID1 ou RAID10n2 a du sens pour le swap, surtout si vous voulez juste pouvoir échanger des pages sales mais très froides pour laisser plus de RAM pour le pagecache. c'est-à-dire que la performance des swaps n'est pas un gros problème. - Peter Cordes
Ce que je veux dire, c’est que, selon vos conseils, il se peut que vous ne puissiez pas exécuter ces programmes du tout, car ils ont besoin d’un échange. Une construction qui échoue à 100% du temps est pire qu'une version qui a 50% de chances de verrouiller le système, n'est-ce pas? - Dmitry Grigoryev
Sans swap, sur de nombreuses machines, il est impossible de compiler de gros morceaux de code. Pourquoi supposeriez-vous que c'est la compilation qu'il veut sacrifier? - David Schwartz


Vous pouvez utiliser la commande suivante (répétée si nécessaire) pour supprimer le processus en utilisant le plus de mémoire vive de 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 selon l'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

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

Ceci est une solution rapide et sale qui devrait être exécutée quand il n'y a pas de tâches sensibles en cours d'exécution (tâches que vous ne voulez pas kill -9).


14
2017-07-03 15:12



C'est bien pire que de laisser le tueur d'OOM gérer la situation. Le tueur OOM est beaucoup plus intelligent que cela. Est-ce que vous exécutez vraiment de telles commandes sur un ordinateur avec des compilations en cours? - Dmitry Grigoryev
@ DimitryGrigoryev c'est tellement intelligent de tuer parfois Xorg sur mon bureau. Dans les noyaux modernes, OOMK semble avoir acquis une certaine santé mentale, mais je ne lui ferais pas vraiment confiance. - Ruslan


Avant d’exécuter vos commandes consommatrices de ressources, vous pouvez également utiliser le setrlimit (2) appel système, probablement avec le ulimit intégré de votre shell bash (ou la limit builtin in zsh) notamment avec -v pour RLIMIT_AS. Ensuite, une consommation d'espace d'adressage virtuel trop importante (par exemple avec mmap (2) ou sbrk (2) utilisé 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) serait terminé avant de geler votre système.

Lire aussi Linux a mangé ma mémoire vive et envisager de désactiver surestimation de la mémoire (en exécutant la commande echo 0 > /proc/sys/vm/overcommit_memory  en tant que root, voir proc (5)...).


11
2017-07-04 05:42





cela m'arrive assez souvent quand je compile un logiciel dans le   Contexte

Dans ce cas, quelque chose comme "killall -9 make" (ou tout ce que vous utilisez pour gérer votre compilation, si ce n'est pas le cas). Cela empêchera la compilation d'aller plus loin, SIGHUP mettra en œuvre tous les processus de compilation lancés à partir de celui-ci (en espérant qu'ils s'arrêtent également) et, en bonus, n'a pas besoin de sudo en supposant que vous compilez dans comme. Et comme cela 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, cela n'interférera pas avec ce que vous faisiez sur le système à ce moment-là.


11
2017-07-05 07:34



C'est juste dommage que je doive faire défiler jusqu'ici pour trouver cette réponse. J'espérais que quelqu'un proposerait un moyen de suspendre les progrès sur ce mangeur de RAM. - TOOGAM
Il ne s'agit pas de la réponse attendue par OP, mais cela répond à la question littéraire: ma machine à chier est rendue inutilisable lorsque j'y construis - arrête de construire sur une machine à chier. - 9ilsdx 9rvj 0lo


Créez un autre échange pour vous-même.

Ce qui suit ajoutera 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 être à court. Les versions modernes de Linux peuvent basculer vers des fichiers. De nos jours, la seule utilisation d'une partition de swap est l'hibernation de votre ordinateur portable.


9
2017-07-03 14:35



J'ai cette méthode implémentée en tant que script, en fait, ici. Très utile pour ajouter un swap à la volée. - Sergiy Kolodyazhnyy
Certains échanges sont généralement judicieux, mais l’allocation de gros montants permet simplement à la machine de se débattre davantage avant que le tueur d’OOM intervienne et choisisse un volontaire. Le vieux rôle de base sur "doubler votre bélier comme un échange" est mort depuis longtemps. Personnellement, je ne vois aucune valeur à allouer plus de ~ 1 Go de swap total. - Criggie
Avec ext4, vous pouvez fallocate -l 8G /root/moreswap au lieu de dd pour ne jamais avoir à faire 8 Go d'E / S alors que le système est en train de se défaire. Cela ne fonctionne avec aucun autre système de fichiers, cependant. Certainement pas XFS, où swapon voit des extensions non écrites comme des trous. (Je suppose que cela xfs discussion liste de discussion n'a pas pané). Voir également swapd, un démon qui crée / supprime les fichiers d'échange à la volée pour économiser de l'espace disque. Aussi askubuntu.com/questions/905668/… - Peter Cordes
@Criggie "Personnellement, je ne vois aucune valeur à allouer plus de ~ 1 Go de swap total" - Avez-vous essayé de construire Firefox? - Dmitry Grigoryev
@Akiva La dernière fois que j'ai vérifié, la configuration recommandée était de 16 Go de RAM. Le fichier exécutable principal (xul.dll) est d'environ 50 Mo, donc environ 10 fois plus lourd que le noyau Linux. - Dmitry Grigoryev


Une façon d'obtenir un gros volume de mémoire vive dans un court délai est d'utiliser zram, qui crée un disque RAM compressé et y échange des données. Avec n'importe quel processeur à moitié décent, c'est beaucoup plus rapide que l'échange standard, et les taux de compression sont assez élevés avec de nombreux porcs modernes comme les navigateurs Web.

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

sudo service zramswap start

4
2017-07-04 13:01



Est-ce que cela fonctionne sur tous les systèmes de fichiers comme btrfs? - Akiva
@Akiva zram ne touche jamais le disque, donc je dirais oui;) - Dmitry Grigoryev


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

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

De kernel.org documentation (emphase ajoutée):

drop_caches

En écrivant cela, le noyau déposera des caches propres, ainsi que   objets de dalle récupérables tels que les dentiers et les inodes. Une fois largué,   leur mémoire devient libre.

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

C'est une opération non destructive et ne libérera aucun sale   objets. 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 sales sur le système et   créer plus de candidats à supprimer.


3
2017-07-03 15:13



Intéressant ... attention à expliquer cette logique de commande? - Akiva
@Akiva fondamentalement, cela dit au noyau Linux de libérer la RAM. Cela ne supprime pas la cause, qui tue le processus incriminé, alors la réponse d'Oli est la solution au problème. La suppression des caches empêchera votre système de manquer de mémoire, évitant ainsi le gel, vous permettant ainsi de trouver le temps nécessaire pour résoudre le problème. Ce sera probablement un peu plus rapide que de créer un fichier d'échange, surtout si vous êtes sur un disque dur et non sur un disque SSD. - Sergiy Kolodyazhnyy
Le cache est la première chose à faire lorsque vous remplissez de la mémoire, donc je ne pense pas que cela aidera beaucoup. En fait, je ne pense pas que cette commande ait une utilisation pratique en dehors du débogage du comportement du noyau ou de la synchronisation des optimisations d'accès aux disques. Je recommande humblement de ne pas exécuter cette commande sur un système nécessitant plus de performances. - Score_Under
@Score_Under - "Le cache est la première chose à faire lorsque vous remplissez de la mémoire" - eh bien, cela dépend de votre configuration /proc/sys/vm/swappiness. Avec swappiness mis à 0, vous avez raison. Avec le réglage par défaut de 60, vous êtes proche. Avec une valeur de 200, ce seront les pages les moins utilisées des processus en cours qui seront abandonnées en premier ... dans ce cas particulier, cette commande mai sois utile. Cependant, fixer la permutabilité à 0 (ou une valeur faible, peut-être 20 ou 30) serait une meilleure approche générale. - Jules
@Score_Under Cette commande était utile sur les anciens noyaux avec kswapd punaise (certaines personnes ont même créé des cronjobs). Mais vous avez raison, je doute que cela aidera avec cette question. - Dmitry Grigoryev


sudo swapoff -a désactivera le swap, faisant que le noyau tue automatiquement le processus avec le le score le plus élevé si le système manque de mémoire. Je l'utilise si je sais que je vais utiliser quelque chose de RAM-lourd que je préférerais tuer s'il devient hors de contrôle que de le laisser entrer en échange et rester bloqué pour toujours. Utilisation sudo swapon -a pour le réactiver ensuite.

Plus tard, vous souhaiterez peut-être examiner vos paramètres de swap. On dirait que votre swap est sur le même disque que la partition racine, ce qui ralentirait votre système lorsque vous appuyez sur le swap, évitez donc cela si vous le pouvez. De plus, à mon avis, les systèmes modernes sont souvent configurés avec trop de swap. 32GiB RAM signifie généralement que le swap 32GiB est alloué par défaut, comme si vous vouliez vraiment placer 32GiB dans votre espace de swap.


2
2017-07-07 17:02



Oh, j'ai juste vu que quelqu'un a commenté ça quelque part. - sudo