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

72

Cela m’arrive assez souvent quand je compile des logiciels en arrière-plan et que tout commence à ralentir et à s’arrêter (si je ne fais rien), car je suis à court de RAM et d’espace de swap.

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 me sauver d’avoir à effectuer un redémarrage brutal ou un redémarrage du tout?

    
posée Akiva 03.07.2017 - 11:15
la source

11 réponses

84

Selon 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 fermer votre navigateur . Une commande?

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

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

Si vous ne pouvez pas obtenir cela dans un terminal déjà en cours ou dans un dialogue Alt + F2 , envisagez de passer à un TTY. Contrôle + Alt + F2 vous amènera à TTY2 qui devrait vous permettre de vous connecter (même si cela peut être lent) et devrait même vous laisser utiliser quelque chose comme htop pour déboguer le problème. Je ne pense pas que je sois jamais à court de RAM au point que je ne pourrais pas obtenir htop .

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 laisserai les arguments économiques complexes à vous, mais en règle générale, la RAM est peu chère à acheter, mais si vous avez seulement besoin d'un montant en rafale, un serveur VPS facturé à la minute ou à l'heure est un bon choix.     

réponse donnée Oli 03.07.2017 - 11:30
la source
66

Sur un système sur lequel la clé de demande du système Magic est activée, en appuyant sur Alt + Requête système + f System Request est souvent sur la clé Print Screen ) invoquera manuellement le killer du noyau (oomkiller), qui essaie de choisir le pire processus incriminé pour l’utilisation de la mémoire et de tuer il. 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é) - auquel cas vous vous en fichez avec un système utilisable. Parfois, cela peut tuer X, mais la plupart du temps ces jours-ci, il est beaucoup plus efficace de choisir un mauvais processus.

    
réponse donnée Muzer 03.07.2017 - 12:44
la source
20

Contrairement à d’autres réponses, je vous suggère de désactiver 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 utilisée activement est expulsée de force pour échanger.

Je recommande de désactiver le swap tout en effectuant cette tâche, de sorte que le tueur hors mémoire agisse dès que la 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 devenir un obstacle avec la compression / décompression supplémentaire.
  • Diminuez les optimisations ou utilisez un compilateur différent. 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 exemple, tcc ), au prix d'une légère baisse des performances à l'exécution du produit compilé. (Ceci est généralement acceptable si vous le faites à des fins de développement / débogage.)
réponse donnée Score_Under 03.07.2017 - 19:47
la source
14

Vous pouvez utiliser la commande suivante (à plusieurs reprises si nécessaire) pour supprimer le processus en utilisant le plus de mémoire 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 : tue le processus

Modifier après le commentaire exact de Dmitry:

Il s’agit d’une solution rapide et sale qui doit être exécutée s’il n’existe pas de tâches sensibles en cours d’exécution (tâches que vous ne souhaitez pas voir kill -9 ).

    
réponse donnée Gohu 03.07.2017 - 17:12
la source
11

Avant d’exécuter vos commandes consommatrices de ressources, vous pouvez également utiliser la setrlimit (2) appel système, probablement avec le ulimit intégré à votre shell bash ( ou limit intégré dans zsh) notamment avec -v pour RLIMIT_AS . Consommation trop importante de l'espace d'adressage virtuel (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 ) seraient terminés avant de geler votre système.

Lisez également Linux Ate My RAM et envisagez de désactiver surestimation de la mémoire (en exécutant la commande echo 0 > /proc/sys/vm/overcommit_memory en tant qu'utilisateur root, voir proc (5) ...).

    
réponse donnée Basile Starynkevitch 04.07.2017 - 07:42
la source
11
  

cela m'arrive assez souvent quand je compile des logiciels dans le   fond

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, SIGHPTERA tous les processus du compilateur lancés à partir de celui-ci (en espérant qu'ils s'arrêtent aussi) et, en bonus, n'a pas besoin de sudo en supposant que vous compiliez en tant que même utilisateur 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à.

    
réponse donnée fluffysheap 05.07.2017 - 09:34
la source
9

Créez d'autres échanges 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

Ce sera toujours lent (vous échangez), mais vous ne devriez pas en manquer. 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.

    
réponse donnée William Hay 03.07.2017 - 16:35
la source
4

Une méthode permettant 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 échange Avec n'importe quel processeur à moitié décent, c'est beaucoup plus rapide que le swap normal, 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’être exécuté

sudo service zramswap start
    
réponse donnée Dmitry Grigoryev 04.07.2017 - 15:01
la source
3

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

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

De la documentation kernel.org (soulignement ajouté):

  

drop_caches

     

Si vous écrivez 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 déposé,   leur mémoire devient libre .

     

Pour libérer le pagecache: echo 1 & gt; / proc / sys / vm / drop_caches Pour libérer   objets de dalle récupérables (incluant les dentiers et les inodes): echo 2 & gt;   / proc / sys / vm / drop_caches Pour libérer des objets slab et pagecache: echo 3 & gt;   / proc / sys / vm / drop_caches

     

Il s’agit d’une opération non destructive qui ne dégagera aucune   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.

    
réponse donnée Sergiy Kolodyazhnyy 03.07.2017 - 17:13
la source
2

sudo swapoff -a désactivera le swap, faisant que le noyau tue automatiquement le processus avec 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 tuerais plutôt s'il est hors de contrôle que de le laisser entrer en échange et rester bloqué pour toujours. Utilisez sudo swapon -a pour le réactiver ultérieurement.

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.

    
réponse donnée sudo 07.07.2017 - 19:02
la source
1

Vous avez dit "compiler en arrière-plan". Que fais-tu au premier plan? Si vous développez avec Eclipse ou un autre IDE de ressources, vérifiez si tout est correctement terminé dans la console.

Les environnements de développement permettent souvent de démarrer plusieurs processus en cours de développement, ceux-ci peuvent rester suspendus même après que vous ne les ayez plus intéressés (dans le débogueur, ou simplement parce qu'ils ne sont pas correctement terminés). 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 l'EDI est terminé.

    
réponse donnée h22 08.07.2017 - 10:00
la source

Lire d'autres questions sur les étiquettes