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 assez de RAM et d'espace d'échange.
Cette question suppose que je dispose de suffisamment de temps et de ressources pour ouvrir Gnome Terminal, parcourir mon historique et exécuter une sudo
commande.
Quelle commande peut m'aider à ne pas avoir à effectuer un redémarrage brutal, ou un redémarrage quelconque?
command-line
ram
freeze
swap
Akiva
la source
la source
make
, essayez-j4
par exemple pour 4 constructions parallèles à la fois.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 cela, mais je m'éloigne de mon propos. La première chose à faire est de fermer votre navigateur . Une commande?
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 ont peur duSIGKILL
signal 9, mais les navigateurs sont extrêmement résilients. Plus que cela, mettre fin lentement viaSIGTERM
signifiera que le navigateur effectuera une charge 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 parvenez pas à insérer cela dans un terminal déjà en marche ou dans un dialogue Alt+ F2, envisagez de passer à un téléscripteur. Control+ Alt+ F2vous amènera à TTY2, ce 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 déjà manqué de RAM au point de ne pas pouvoir mehtop
lever.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, la RAM n’est pas chère, 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.
la source
lazygit
commande que j'utilise de temps en temps, peut-être que quelque chose comme ça pourrait être appliquée ici? L'ensemble dukillall ...
script pourrait être réduit à un simpleemptyram
ou quelque chose comme çaemptyram
script plutôt que de me pointer dedanskillall -9 firefox
.Sur un système sur lequel la clé de demande système Magic est activée, une pression sur Alt + System Request+ f(si elle n'est pas marquée sur votre clavier, System Requestest souvent sur la Print Screentouche) invoquera manuellement le tueur de mémoire insuffisante du noyau (oomkiller), qui essaiera de sélectionner le processus incriminé le plus dommageable. utilisation de la mémoire et 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 - dans ce cas, vous ne vous souciez probablement pas de ce qui est tué, mais simplement de la fin 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’il ne l’était.
la source
kernel.sysrq
à1
ou un numéro compris le dans votre peu correcte/etc/sysctl.d/10-magic-sysrq.conf
.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 parce que la mémoire trop utilisée est expulsée de force pour échanger.
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 la mémoire RAM est pleine.
Solutions alternatives:
zswap
dans 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.tcc
), au détriment d'une légère performance d'exécution affectant le produit compilé. (Ceci est généralement acceptable si vous le faites à des fins de développement / débogage.)la source
sudo swapoff -a
peut vous faire économiser une fois que vous êtes déjà dans une impasse: cela arrêtera immédiatement toute utilisation supplémentaire d'espace de permutation, c'est-à-dire que le destructeur de MOO devrait être invoqué dans l'instant qui suit et mettre la machine en état de fonctionner.sudo swapoff -a
est également une excellente mesure de précaution lors du débogage de fuites de mémoire ou lors de la compilation, par exemple, de Firefox. Normalement, le swap est un peu utile (par exemple pour l'hibernation ou le remplacement de données réellement inutiles), mais lorsque vous utilisez réellement la mémoire, les blocages sont encore pires.Vous pouvez utiliser la commande suivante (plusieurs fois si nécessaire) pour tuer le processus en utilisant le plus de RAM possible sur votre système:
Avec:
ps -eo pid --no-headers --sort=-%mem
: affiche les ID de processus de tous les processus en cours, triés par utilisation de la mémoirehead -1
: ne conserve que la première ligne (processus utilisant le plus de mémoire)xargs kill -9
: tuer le processusEditez 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 exécuter
kill -9
).la source
Avant d’exécuter vos commandes qui consomment des ressources, vous pouvez également utiliser l’ appel système setrlimit (2) , probablement avec l’
ulimit
intégration de votre shell bash (oulimit
de zsh), notamment avec-v
forRLIMIT_AS
. Ensuite , trop grande consommation d'espace d'adressage virtuel (par exemple avec mmap (2) ou sbrk (2) utilisé par malloc (3) ) échouera (avec errno (3) étantENOMEM
).Ensuite, ils (les processus affamés dans votre shell, après que vous ayez tapé
ulimit
) soient terminés avant de geler votre système.Lisez également Linux Ate My RAM et envisagez de désactiver le surengagement de la mémoire (en exécutant la commande en
echo 0 > /proc/sys/vm/overcommit_memory
tant que root, voir proc (5) ...).la source
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 (en les faisant s'arrêter également) et, en prime, pas besoin de sudo en supposant que vous compilez comme le même utilisateur que vous êtes connecté dans comme. Et comme 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à.
la source
Créez encore plus de swap pour vous-même.
Ce qui suit va ajouter 8G de swap:
Il sera toujours lent (vous échangez) mais vous ne devriez pas réellement vous épuiser. Les versions modernes de Linux peuvent échanger des fichiers. De nos jours, la seule utilisation d'une partition de swap est l'hibernation de votre ordinateur portable.
la source
fallocate -l 8G /root/moreswap
lieu de cela, dedd
faire 8 Go d’entrées / sorties pendant que le système tourne. Cela ne fonctionne avec aucun autre système de fichiers, cependant. Certainement pas XFS, où swapon considère les étendues non écrites comme des trous. (Je suppose que cette discussion sur la liste de diffusion xfs n'a pas abouti ). Voir aussiswapd
, un démon qui crée / supprime des fichiers d'échange à la volée pour économiser de l'espace disque. Aussi askubuntu.com/questions/905668/…xul.dll
) fait environ 50 Mo. Il est donc environ 10 fois plus lourd que le noyau Linux.Un moyen d’obtenir rapidement un bloc de RAM libre consiste à utiliser zram , qui crée un disque RAM compressé et l’échange à cet endroit . 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 de nombreux 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
la source
sudo swapoff -a
désactivera l’échange, faisant que le noyau tue 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 si cela échappait à tout contrôle que de le laisser entrer en échange et rester bloqué pour toujours. Utilisezsudo swapon -a
pour le réactiver par la suite.Plus tard, vous voudrez peut-être examiner vos paramètres de swap. On dirait que votre swap se trouve sur le même disque que la partition racine, ce qui ralentirait le système lorsque vous utiliserez le swap; évitez donc cela si vous le pouvez. De plus, à mon avis, les systèmes modernes sont souvent configurés avec trop d'échange. 32GiB RAM signifie généralement que l’échange 32GiB est alloué par défaut, comme si vous souhaitiez réellement mettre 32GiB dans votre espace de swap.
la source
Une autre chose à faire est de libérer du cache de page mémoire via cette commande:
De la documentation de kernel.org (soulignement ajouté):
la source
/proc/sys/vm/swappiness
. Avec swappiness réglé sur 0, vous avez raison. Avec le réglage par défaut de 60, vous êtes proche. Avec 200, cependant, ce seront les pages les moins utilisées des processus en cours qui ont été abandonnées en premier ... Dans ce cas particulier, cette commande peut être utile. Cependant, définir swappiness sur 0 (ou une valeur faible, peut-être 20 ou 30) constituerait une meilleure approche générale, cependant.kswapd
bogue (certaines personnes ont même créé des tâches cron avec celui-ci). Mais vous avez raison, je doute que cela aide à résoudre cette question.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é.
la source