Vraag Ubuntu heeft snel een tekort aan RAM en mijn computer begint te bevriezen. Welke opdracht zal dit oplossen?


Het gebeurt me vaak als ik op de achtergrond software verzamel en plotseling begint alles te vertragen en uiteindelijk vast te vriezen [als ik niets doe], omdat ik zowel RAM-geheugen als verwisselruimte heb.

Deze vraag gaat ervan uit dat ik genoeg tijd en middelen heb om Gnome Terminal te openen, mijn geschiedenis te doorzoeken en er een uit te voeren sudo opdracht.

Welk commando kan me redden van een harde reboot of helemaal opnieuw opstarten?


72
2017-07-03 09:15


oorsprong


Opmerkingen zijn niet voor uitgebreide discussie; dit gesprek is geweest verplaatst naar chat. - Thomas Ward♦
Als je geen swapruimte meer hebt, denk ik dat je er te weinig van hebt. Ik heb 20G swapspace op deze computer. Het punt is dat het je genoeg tijd geeft met een bruikbaar systeem om te doden wat je geheugen opslokt. Het is niet iets waar je alleen neemt wat je zult gebruiken, maar waarvan je hoopt dat je het nooit zult gebruiken. - JoL
Weet je zeker dat zowel RAM als swap worden gevuld? Als dat het geval was, zou de OOM-handler je compiler doden en geheugen vrijmaken (en ook je bouwproces verknoeien). Anders zou ik denken dat het gewoon vol raakt, en misschien is je systeem traag omdat je swap op je systeemschijf staat. - sudo
Probeer het aantal parallelle builds te verminderen als u niet genoeg RAM hebt om dit te ondersteunen. Als je build begint te wisselen, ben je veel langzamer. Met make, proberen -j4 bijvoorbeeld voor 4 parallelle builds tegelijkertijd. - Shahbaz
"Alexa bestelt me ​​8 optredens van ram"


antwoorden:


In mijn ervaring gebruiken Firefox en Chrome meer RAM-geheugen dan mijn eerste 7 gecombineerde computers. Waarschijnlijk meer dan dat, maar ik begrijp niet wat ik bedoel. Het allereerste dat u moet doen is sluit uw browser. Een bevel?

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

Ik heb de populairste browsers daar samengevoegd tot één opdracht, maar als u iets anders gebruikt (of weet dat u geen van deze gebruikt), moet u gewoon de opdracht aanpassen. De killall -9 ... is het belangrijke deel. Mensen krijgen twijfels over SIGKILL (signaal nummer 9) maar browsers zijn uiterst veerkrachtig. Meer dan dat, langzaam ophouden via SIGTERM betekent dat de browser een hoop opruim-onzin doet -die een extra RAM-geheugen vereist- en dat kun je in deze situatie niet betalen.

Als je dat niet kunt krijgen in een reeds draaiende terminal of een alt+F2 dialoog, overweeg om over te schakelen naar een TTY. Controle + alt + F2 zal je naar TTY2 brengen, wat je zou moeten toestaan ​​om in te loggen (hoewel het misschien traag is) en je zelfs iets dergelijks zou moeten laten gebruiken htop om het probleem te debuggen. Ik denk niet dat ik ooit RAM heb opgelopen tot het punt dat ik niet kon krijgen htop up.

De oplossing op de lange termijn houdt in: meer RAM kopen, deze via een externe computer huren, of niet doen wat je op dit moment doet. Ik laat de ingewikkelde economische argumenten aan je over, maar over het algemeen is RAM goedkoop om te kopen, maar als je alleen een burst-hoeveelheid nodig hebt, wordt een VPS-server per minuut gefactureerd, of uur is een goede keuze.


84
2017-07-03 09:30



Opmerkingen zijn niet voor uitgebreide discussie; dit gesprek is geweest verplaatst naar chat. - Thomas Ward♦
Ik heb een paar commando's gekoppeld aan de mijne lazygit commando dat ik van tijd tot tijd gebruik, misschien kan zoiets hier worden toegepast? Het geheel killall ... script kan worden teruggebracht tot een eenvoudig emptyram of zoiets - Francisco Presencia
U hoeft niet de volledige opdracht uit te voeren als u weet welke browser wordt uitgevoerd en ik neem aan dat de meeste mensen die een RAM-tekort kunnen identificeren dat wel doen. Bij uitbreiding zou ik het moeilijker vinden om te onthouden dat ik een emptyram script dan alleen maar ponsen killall -9 firefox. - Oli♦
RAM kopen ... waarom niet gewoon meer RAM downloaden? - Stephan Bijzitter
Misschien maak je wel grapjes, maar als je iets voor een korte tijd moet doen behoefte aan Veel meer RAM en CPU die je hebt, het huren van een VPS met de minuut is redelijk economisch voor one-shots. - Oli♦


Op een systeem met de verzoeksleutel van het magisch systeem ingeschakeld, op drukken alt  + Systeem aanvraag + f (indien niet gemarkeerd op uw toetsenbord, Systeem aanvraag is vaak op de Print Screen key) zal handmatig de kernel's uit geheugenmoordenaar (oomkiller) oproepen, die probeert het ergste overtredende proces voor geheugengebruik te kiezen en het te doden. Je kunt dit doen als je misschien minder tijd hebt dan je hebt beschreven en het systeem op het punt staat om te beginnen (of misschien al begonnen is) met geselen - in welk geval het je waarschijnlijk niet uitmaakt wat er wordt vermoord, alleen dat je eindigt met een bruikbaar systeem. Soms kan dit leiden tot het doden van X, maar tegenwoordig is het veel beter om een ​​slecht proces te kiezen dan het vroeger was.


66
2017-07-03 10:44



@ T.Sar als je recht in de richting van aframmeling gaat, verlies je al of krijg je de kans om geheugen-eter te doden. Je wint niets als je je gewoon onthoudt van acteren. - Ruslan
@Muzer dit werkt alleen als je hebt ingesteld kernel.sysrq naar 1 of een nummer inclusief het juiste bit in uw /etc/sysctl.d/10-magic-sysrq.conf. - Ruslan
@ T.Sar Je zult je voortgang niet verliezen als je een gezond build-systeem gebruikt. Je bewaart alle objectbestanden maar degene die je eigenlijk aan het compileren was, dan kun je terug gaan naar waar je was gebleven. - Muzer
@ T.Sar Alleen omdat het ding dat je aan het compileren bent niet gezond is, wil nog niet zeggen dat het build-systeem niet gezond is. Build-systemen sinds mensenheugenis hebben objectbestanden opgeslagen voor hergebruik in volgende compilaties. Aan de andere kant kan ik zeker veel softwareprojecten noemen met minder gezond verstand dan Linux (dat over het algemeen vrij goed ontworpen is). Bijvoorbeeld, compileer zoiets als Firefox of OpenOffice met 8 parallel te bouwen threads, ik kan het gemakkelijk zien in de orde van gigabytes aan RAM. Er zijn ook veel monolithische bedrijfssystemen die afhankelijk zijn van honderden bibliotheken. - Muzer
@ T.Sar Linux is niet echt complex vanuit de POV van de compiler. Eigenlijk zijn er nauwelijks C-programma's. Hoe zit het met C ++? Heb je ooit geprobeerd een programma te bouwen met Eigen of Boost? Je zou verbaasd zijn hoeveel geheugen de compiler soms eet met dergelijke programma's - en ze hoeven zelf niet complex te zijn. - Ruslan


In tegenstelling tot andere antwoorden, raad ik aan swap uit te schakelen terwijl je dit doet. Met swap blijft uw systeem op een voorspelbare manier werken en wordt vaak gebruikt om de doorvoer te vergroten van applicaties die toegang hebben tot de schijf (door ongebruikte pagina's te verwijderen om plaats te maken voor de schijfcache), in dit geval klinkt het alsof uw systeem wordt vertraagd tot onbruikbare niveaus omdat te veel actief gebruikt geheugen met geweld wordt uitgezet om te ruilen.

Ik zou aanraden om swap helemaal uit te schakelen tijdens het uitvoeren van deze taak, zodat de out-of-memory moordenaar zal handelen zodra de RAM volloopt.

Alternatieve oplossingen:

  • Verhoog de leessnelheid van swap door uw swappartitie in RAID1 te plaatsen
    • Of RAID0 als u zich riskant voelt, maar dat zal een groot aantal actieve programma's naar beneden halen als een van uw schijven defect is.
  • Verminder het aantal gelijktijdige bouwtaken ("meer kernen = meer snelheid", zeggen we allemaal, verget dat het een lineaire tol aan RAM kost)
  • Dit kan in beide richtingen gaan, maar probeer in te schakelen zswap in de kernel. Hiermee worden pagina's gecomprimeerd voordat ze worden verzonden om te wisselen, wat net voldoende bewegingsruimte biedt om uw machine sneller te laten werken. Aan de andere kant kan het net een belemmering worden voor de extra compressie / decompressie die het doet.
  • Verlaag optimalisaties of gebruik een andere compiler. Het optimaliseren van code kan soms meerdere gigabytes geheugen in beslag nemen. Als je LTO hebt ingeschakeld, zul je ook veel RAM gebruiken in de linkfase. Als al het andere faalt, kunt u proberen uw project samen te stellen met een lichtgewicht-compiler (bijv. tcc), ten koste van een lichte runtime-prestatieslag voor het gecompileerde product. (Dit is meestal acceptabel als u dit doet voor ontwikkeling / foutopsporing.)

20
2017-07-03 17:47



Als je swap hebt uitgezet, is dat het gedrag van Linux als je onvoldoende geheugen hebt. Als Linux de out-of-memory moordenaar niet oproept maar in plaats daarvan blokkeert, kan dat betekenen dat er diepere problemen zijn met de setup. Natuurlijk, als swap is ingeschakeld, is het gedrag iets anders. - Score_Under
@Akiva Heb je ooit geprobeerd om te ruilen? Dit antwoord is perfect. Ik zou dat rennen graag toevoegen sudo swapoff -a kan je redden als je al in een bind zit: het stopt onmiddellijk elk extra gebruik van de swapspace, d.w.z. de OOM moordenaar moet het volgende moment worden aangeroepen en de machine in werkende staat brengen. sudo swapoff -a is ook een uitstekende voorzorgsmaatregel bij het opsporen van geheugenlekken of bij het samenstellen van bijvoorbeeld firefox. Normaal gesproken is swap een beetje handig (bijvoorbeeld voor de slaapstand of het vervangen van echt niet-benut spul), maar als je het geheugen gebruikt, zijn de stilstand slechter. - Jonas Schäfer
@Score_Under: afzonderlijke swappartities op elke schijf moeten aanzienlijk efficiënter zijn dan swap op een md raid0-apparaat. Ik ben vergeten waar ik dat heb gelezen. De Linux RAID-wiki beveelt aparte partities aan boven raid0, maar zegt niets heel ergs over waarom het beter is. Hoe dan ook, ja, RAID1 of RAID10n2 is zinvol voor swap, vooral als je gewoon wat vuile maar erg koude pagina's wilt vervangen om meer RAM-geheugen voor de pagecache te behouden. dat wil zeggen, de ruilprestaties zijn geen big deal. - Peter Cordes
Mijn punt is dat je na je advies misschien helemaal geen programma's meer kunt draaien, omdat ze moeten worden omgeruild. Een build die 100% van de tijd faalt is slechter dan een build die 50% kans heeft om het systeem te vergrendelen, toch? - Dmitry Grigoryev
Zonder swap is het op veel machines onmogelijk om grote hoeveelheden code te compileren. Waarom zou je aannemen dat het de compilatie is die hij wil opofferen? - David Schwartz


U kunt de volgende opdracht gebruiken (herhaaldelijk indien nodig) om het proces te beëindigen met de meeste RAM op uw systeem:

ps -eo pid --no-headers --sort=-%mem | head -1 | xargs kill -9

Met:

  • ps -eo pid --no-headers --sort=-%mem: geef de proces-id's weer van alle actieve processen, gesorteerd op geheugengebruik
  • head -1: alleen de eerste regel behouden (proces met het meeste geheugen)
  • xargs kill -9: dood het proces

Bewerk na de nauwkeurige opmerking van Dmitry:

Dit is een snelle en vuile oplossing die moet worden uitgevoerd als er geen gevoelige taken worden uitgevoerd (taken die u niet wilt uitvoeren) kill -9).


14
2017-07-03 15:12



Dit is veel erger dan de OOM-moordenaar de situatie laten verwerken. De OOM-moordenaar is veel slimmer dan dat. Voer je zulke commando's echt uit op een computer met doorlopende compilaties? - Dmitry Grigoryev
@DmitryGrigoryev het is zo slim om Xorg soms op mijn bureaublad te doden. In moderne kernels lijkt OOMK wat verstandiger te zijn geworden, maar ik zou het toch niet echt vertrouwen. - Ruslan


Voordat u uw resource consuming-opdrachten uitvoert, kunt u ook de setrlimit (2) systeemoproep, waarschijnlijk met de ulimit ingebouwd in je bash-shell (of de limit built in zsh) met name met -v voor RLIMIT_AS. Dan een te grote virtuele adresruimteconsumptie (bijvoorbeeld met MMAP (2) of sbrk (2) gebruikt door malloc (3)) zal mislukken (met errno (3) wezen ENOMEM).

Vervolgens worden ze (dat wil zeggen de hongerige processen in je shell, nadat je hebt getypt ulimit) wordt beëindigd voordat uw systeem wordt bevroren.

Lees ook Linux Ate My RAM en overweeg uitschakeling geheugen overcommitment (door het commando uit te voeren echo 0 > /proc/sys/vm/overcommit_memory  als root, zie proc (5)...).


11
2017-07-04 05:42





dit gebeurt vrij vaak voor mij wanneer ik software verzamel in de   achtergrond

In dat geval iets als "killall -9 make" (of wat je ook gebruikt om je compilatie te beheren, zo niet te maken). Dit stopt de compilatieprocedure verder, zal SIGHUP alle compileerprocessen gelanceerd hebben (hopelijk zorgt dit ervoor dat ze ook stoppen) en als bonus hoeft sudo niet te veronderstellen dat je aan het compileren bent als dezelfde gebruiker die je bent ingelogd in als. En omdat het de werkelijke oorzaak van uw probleem doodt in plaats van uw webbrowser, X-sessie of een willekeurig proces, interfereert het niet met alles wat u op dat moment op het systeem aan het doen was.


11
2017-07-05 07:34



Het is gewoon een schande dat ik zo ver naar beneden moest scrollen om dit antwoord te vinden. Ik hoopte dat iemand een manier zou voorstellen die de voortgang van deze RAM-eter zou opschorten. - TOOGAM
Het is niets in de buurt van het antwoord dat OP verwacht, maar het beantwoordt de vraag literair: mijn crap machine is onbruikbaar geworden als ik erop voortbouw - stop met bouwen op een crap machine. - 9ilsdx 9rvj 0lo


Maak nog wat meer ruil voor jezelf.

Het volgende voegt 8G swap toe:

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

Het zal nog steeds traag zijn (je ruilt), maar je zou eigenlijk niet opraken. Moderne versies van Linux kunnen naar bestanden worden omgewisseld. Over het enige gebruik voor een swappartitie is tegenwoordig het bewaren van je laptop.


9
2017-07-03 14:35



Ik heb deze methode geïmplementeerd als een script, eigenlijk, hier. Heel handig om swap on the fly toe te voegen. - Sergiy Kolodyazhnyy
Sommige swap is over het algemeen verstandig, maar door grote hoeveelheden toe te wijzen, kan de machine meer kloppen voordat OOM-moordenaar binnenstapt en een vrijwilliger kiest. De grijze oude rol van duim over "verdubbel je ram als ruil" is al lang dood. Persoonlijk zie ik geen waarde in het toewijzen van meer dan ~ 1 GB swap totaal. - Criggie
Met ext4 kan dat fallocate -l 8G /root/moreswap in plaats van dd om te voorkomen dat je ooit 8 GB aan I / O hoeft te gebruiken terwijl het systeem slaand is. Dit werkt echter niet met een ander bestandssysteem. Absoluut niet XFS, waar swapon ongeschreven extents als gaten ziet. (Ik denk dit xfs mailinglijst discussie kwam niet uit). Zie ook swapd, een daemon die swap-bestanden maakt / verwijdert tijdens het werken om schijfruimte te besparen. Ook askubuntu.com/questions/905668/... - Peter Cordes
@Criggie "Persoonlijk zie ik geen waarde in het toewijzen van meer dan ~ 1 GB swap totaal" - Heb je geprobeerd Firefox te bouwen? - Dmitry Grigoryev
@Akiva De laatste keer dat ik heb gecontroleerd, was de aanbevolen build-configuratie 16 GB RAM. Het belangrijkste uitvoerbare bestand (xul.dll) is ongeveer 50 MB, dus het is ongeveer 10 keer zwaarder dan de Linux-kernel. - Dmitry Grigoryev


Een manier om op korte termijn een stuk gratis RAM te krijgen, is om te gebruiken zram, dat een gecomprimeerde RAM-schijf maakt en daar verwisselt. Met elke halfwaardige CPU is dit veel sneller dan gewone swap, en de compressiepercentages zijn behoorlijk hoog met veel moderne RAM-apparaten zoals webbrowsers.

Ervan uitgaande dat u zram hebt geïnstalleerd en geconfigureerd, wordt alles wat u hoeft te doen uitgevoerd

sudo service zramswap start

4
2017-07-04 13:01



Werkt dit op alle bestandssystemen zoals btrfs? - Akiva
@Akiva zram raakt de schijf nooit aan, dus ik zou zeggen ja;) - Dmitry Grigoryev


Een andere dingen die je zou kunnen doen is om geheugenpagina cache vrij te maken via deze opdracht:

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

Van kernel.org documentatie (nadruk toegevoegd):

drop_caches

Als je dit schrijft, zal de kernel schone caches laten vallen, evenals   terugwinbare plaatvoorwerpen zoals deafhouders en inodes. Eenmaal gedropt,   hun geheugen wordt vrij.

Gratis pagecache: echo 1> / proc / sys / vm / drop_caches Gratis   terugwinbare plaatobjecten (inclusief daken en inodes): echo 2>   / proc / sys / vm / drop_caches Om slab-objecten en pagecache te bevrijden: echo 3>   / Proc / sys / vm / drop_caches

Dit is een niet-destructieve operatie en zal geen vies bevrijden   voorwerpen. Om het aantal objecten dat door deze bewerking is bevrijd, te vergroten,   de gebruiker kan `sync 'uitvoeren alvorens te schrijven naar / proc / sys / vm / drop_caches.   Dit minimaliseert het aantal vervuilde objecten op het systeem en   creëer meer kandidaten om te laten vallen.


3
2017-07-03 15:13



Interessant ... wil je die opdrachtlogica uitleggen? - Akiva
@Akiva laat in feite de Linux-kernel weten om de RAM vrij te maken. Dit neemt niet weg de oorzaak, die het beledigende proces doodt, zodat is Oli's antwoord de oplossing voor het probleem. Als u caches laat vallen, voorkomt u dat uw systeem onvoldoende geheugen heeft, dus voorkomt u bevriezing en koopt u dus tijd om te achterhalen wat het probleem is. Dit zal waarschijnlijk een beetje sneller zijn dan het maken van een wisselbestand, vooral als je op een harde schijf zit en niet op een SSD - Sergiy Kolodyazhnyy
De cache is het eerste wat je moet doen als je geheugen vult, dus ik denk niet dat dit erg veel zal helpen. Sterker nog, ik denk niet dat dit commando een praktisch nut heeft buiten het debuggen van kernelgedrag of het optimaliseren van timing-schijftoegang. Ik zou nederig aanbevelen om deze opdracht uit te voeren op elk systeem dat meer prestaties nodig heeft. - Score_Under
@Score_Under - "De cache is het eerste wat je moet doen als je geheugen opvult" - nou, dat hangt af van je instelling in /proc/sys/vm/swappiness. Met swappiness op 0 ingesteld, hebt u gelijk. Met de standaardinstelling van 60 ben je dichtbij. Als het op 200 is ingesteld, zijn dit echter de minst recent gebruikte pagina's met actieve processen die als eerste worden verwijderd ... in dat specifieke geval, deze opdracht mei wees nuttig. Maar het instellen van swappiness op 0 (of een lage waarde, misschien 20 of 30) zou echter een betere algemene aanpak zijn. - Jules
@Score_Under Deze opdracht was handig op oude kernels met kswapd kever (sommige mensen creëerden zelfs cronjobs mee). Maar je hebt gelijk, ik betwijfel of het zal helpen met deze vraag. - Dmitry Grigoryev


sudo swapoff -a zal de swap uitschakelen, waardoor de kernel het proces automatisch met het hoogste score als het systeem onvoldoende geheugen heeft. Ik gebruik dit als ik weet dat ik RAM-zwaar zal zijn dat ik liever vermoord als het uit de hand loopt dan laat het inruilen en voor altijd vast komen te zitten. Gebruik sudo swapon -a om het later opnieuw in te schakelen.

Later wil je misschien eens naar je ruilinstellingen kijken. Het lijkt erop dat je swap op dezelfde schijf staat als de rootpartitie, wat je systeem zou vertragen wanneer je swap raakt, dus vermijd dat als je kunt. Ook, naar mijn mening, worden moderne systemen vaak geconfigureerd met te veel swap. 32GiB RAM betekent meestal dat een 32GiB-swap standaard is toegewezen, alsof je echt 32GiB in je swap-ruimte wilt plaatsen.


2
2017-07-07 17:02



Oh, ik zag net dat iemand daar ergens iets over heeft gezegd. - sudo


U zei "op de achtergrond compileren". Wat doe je op de voorgrond? Als u met Eclipse of een andere resource-zware IDE aan het ontwikkelen bent, controleer dan of alles op de juiste manier is afgesloten in de console.

Ontwikkelomgevingen maken vaak het starten van meerdere processen in ontwikkeling mogelijk, deze blijven mogelijk hangen ook nadat je niet langer geïnteresseerd bent in ze (in debugger, of gewoon niet goed afgemaakt). Als de ontwikkelaar niet oplet, kunnen zich gedurende de dag tientallen vergeten processen ophopen, waarbij meerdere gigabytes tegelijk worden gebruikt.

Controleer of alles wat moet worden beëindigd in IDE wordt beëindigd.


1
2017-07-08 08:00