Nous l'avons tous vécu - certains programmes sont invités à faire quelque chose qui nécessite une énorme quantité de mémoire. Il essaie consciencieusement d'allouer toute cette mémoire, et le système commence immédiatement à se débattre, à permuter sans cesse et à devenir lent ou non réactif.
J'ai récemment expérimenté cela sur mon ordinateur portable Ubuntu en raison d'un script Matlab essayant d'allouer une matrice ridiculement énorme. Après environ 5 + minutes de thrashing, j'ai pu Ctrl-F1 sur une console et tuer Matlab. Je préférerais de loin avoir un raccourci clavier qui m'aurait donné immédiatement le contrôle du système et m'aurait permis de tuer le processus incriminé; ou, peut-être, simplement refuser silencieusement d'allouer un si grand tampon.
Quel est le moyen le plus rapide de reprendre le contrôle d'un système Linux qui ne répond plus ou est extrêmement lent à cause d'un échange excessif?
Existe-t-il un moyen efficace d'empêcher un tel échange de se produire en premier lieu, par exemple en limitant la quantité de mémoire qu'un processus est autorisé à essayer d'allouer?
Déjà répondu ci - dessus avec Alt-SysRq-F
Je réponds à cette 2ème partie. Oui,
ulimit
fonctionne toujours assez bien pour limiter un seul processus. Vous pouvez:Aussi, comme brièvement mentionné:
En effet, les cgroups offrent un contrôle plus avancé, mais sont actuellement plus compliqués à configurer à mon avis.
Ulimit old school
Une fois éteint
Voici un exemple simple:
Il:
r2(){ r2 $@$@;};r2 r2
exponentielle le CPU et la RAM en se doublant infiniment tout en demandant la mémoire de la pile.Comme vous pouvez le voir, il s'est arrêté lors de la tentative de demande de plus de 1 Go.
Remarque,
-v
fonctionne sur l'allocation de mémoire virtuelle (total, c'est-à-dire physique + échange).Protection permanente
Pour limiter l'allocation de mémoire virtuelle,
as
est l'équivalent de-v
forlimits.conf
.Je fais ce qui suit pour me protéger contre tout processus de mauvaise conduite:
address space limit = <physical memory> - 256MB
.Bon mot:
Pour valider, cela se traduit par ce qui suit (par exemple sur un système de 16 Go):
Remarques:
rss
option dans limits.conf. Il n'est pas respecté par les noyaux plus récents.Nouveaux groupes CG
Offre plus de contrôle, mais actuellement plus complexe à utiliser:
memory.max_usage_in_bytes
peut prendre en compte et limiter la mémoire physique séparément.ulimit -m
et / ourss
inlimits.conf
étaient censés offrir des fonctionnalités similaires, mais cela ne fonctionne pas depuis le noyau Linux 2.4.30!cgroup_enable=memory swapaccount=1
.cgm
semble maintenant être l'outil de l'espace utilisateur officiellement pris en charge.Par exemple, pour vérifier les paramètres actuels:
Par exemple pour limiter la mémoire d'un seul processus:
Pour le voir en action mâcher de la RAM en tant que processus d'arrière-plan, puis se faire tuer:
Notez la croissance exponentielle (puissance de 2) des demandes de mémoire.
À l'avenir, espérons voir "distro / vendors" préconfigurer les priorités et les limites du groupe de contrôle (via les unités systemd) pour des choses importantes comme SSH et la pile graphique, de sorte qu'elles ne soient jamais affamées de mémoire.
la source
Vous pourrez peut-être appuyer sur Ctrl- zpour suspendre le programme. Ensuite, vous pouvez le faire
kill %1
(ou quel que soit le numéro de travail ou vous pouvez utiliser le PID).Vous pouvez utiliser la
ulimit
commande pour essayer de limiter la quantité de mémoire disponible pour un processus.la source
kill -STOP <pid>
ce qui fera la même chose que Ctrl-Z.Vous pouvez utiliser CGroups pour limiter l'utilisation des ressources et éviter de tels problèmes: https://en.wikipedia.org/wiki/Cgroups
la source
Il y a toujours la
xkill
commande classique (de xorg-x11-apps-7.4-14.fc14.src.rpm sur mon système). Je suppose qu'il ne devrait pas être trop difficile de créer un clone qui envoie SIGSTOP au lieu de tuer la fenêtre cible.la source