Ubuntu sta rapidamente esaurendo la RAM e il mio computer sta iniziando a bloccarsi. Quale comando risolverà questo?

72

Mi capita spesso quando sto compilando il software in background e all'improvviso tutto inizia a rallentare e alla fine si blocca [se non faccio niente], dato che ho esaurito sia la RAM che lo spazio di swap.

Questa domanda presuppone che io abbia abbastanza tempo e risorse per aprire Gnome Terminal, cercare nella mia cronologia ed eseguire un comando sudo .

Quale comando può salvarmi dal dover eseguire un riavvio, o riavviare del tutto?

    
posta Akiva 03.07.2017 - 11:15

11 risposte

84

Nella mia esperienza, Firefox e Chrome utilizzano più RAM dei miei primi 7 computer combinati. Probabilmente più di questo, ma mi sto allontanando dal mio punto. La prima cosa che devi fare è chiudere il browser . Un comando?

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

Ho legato i browser più popolari in un unico comando, ma ovviamente se stai eseguendo qualcos'altro (o sai che non stai utilizzando uno di questi), modifica il comando. Il killall -9 ... è il bit importante. Le persone diventano incerte circa SIGKILL (segnale numero 9) ma i browser sono estremamente resilienti. Inoltre, terminare lentamente con SIGTERM significherà che il browser esegue un carico di spazzatura per la pulizia, il che richiede uno spreco di RAM aggiuntiva, ed è qualcosa che non puoi permetterti in questa situazione.

Se non riesci a inserirlo in un terminale già in esecuzione o in un dialogo Alt + F2 , considera di passare a un TTY. Controllo + Alt + F2 ti porterà a TTY2 che dovrebbe permetterti di accedere (anche se potrebbe essere lento) e dovrebbe anche permetterti di usare qualcosa come htop per eseguire il debug del problema. Non credo di aver mai esaurito la RAM fino al punto in cui non sono riuscito a ottenere htop up.

La soluzione a lungo termine implica l'acquisto di più RAM, il noleggio tramite un computer remoto o il mancato funzionamento di ciò che si sta facendo attualmente. Lascio a te le complicate argomentazioni economiche, ma in generale, la RAM è economica da acquistare, ma se hai solo bisogno di una quantità di burst, un server VPS addebitato al minuto o un'ora è una scelta eccellente.

    
risposta data Oli 03.07.2017 - 11:30
66

Su un sistema con il codice di richiesta del sistema magico abilitato, premendo Alt + Richiesta di sistema + f (se non segnato sulla tastiera, La richiesta di sistema è spesso sulla chiave Print Screen ) invocherà manualmente il killer esaurito (oomkiller) del kernel, che cerca di scegliere il peggior processo offendente per l'uso della memoria e uccidere esso. Puoi farlo se hai forse meno tempo di quello che hai descritto e il sistema sta per iniziare (o forse ha già iniziato) il thrashing - nel qual caso probabilmente non ti importa esattamente cosa viene ucciso, solo che finisci con un sistema utilizzabile. A volte questo può finire con l'uccisione di X, ma la maggior parte delle volte in questi giorni è molto meglio scegliere un processo sbagliato rispetto a prima.

    
risposta data Muzer 03.07.2017 - 12:44
20

Contrariamente ad altre risposte, ti suggerisco di disattivare lo scambio mentre lo stai facendo. Mentre lo swap mantiene il sistema in esecuzione in modo prevedibile e viene spesso utilizzato per aumentare il throughput delle applicazioni che accedono al disco (rimuovendo le pagine inutilizzate per lasciare spazio alla cache del disco), in questo caso sembra che il sistema venga rallentato a livelli inutilizzabili perché troppa memoria utilizzata attivamente viene forzatamente sfrattata per lo scambio.

Consiglierei di disabilitare completamente lo swap mentre svolgo questa attività, in modo che il killer out-of-memory si comporti non appena la RAM si riempie.

Soluzioni alternative:

  • Aumentare la velocità di lettura dello swap inserendo la partizione di swap in RAID1
    • Oppure RAID0 se ti senti rischioso, ma ciò causerà il malfunzionamento di un gran numero di programmi in esecuzione se uno qualsiasi dei tuoi dischi si guasta.
  • Diminuisci il numero di processi di creazione simultanei ("più core = più velocità", diciamo tutti, dimenticando che richiede un costo lineare sulla RAM)
  • Potrebbe andare in entrambi i modi, ma prova a abilitare zswap nel kernel. Questo comprime le pagine prima che vengano inviate a swap, il che può fornire un margine di manovra sufficiente per velocizzare la macchina. D'altra parte, potrebbe finire per essere un ostacolo con la compressione / decompressione extra che fa.
  • Disattiva le ottimizzazioni o usa un compilatore diverso. L'ottimizzazione del codice può talvolta richiedere diversi gigabyte di memoria. Se hai attivato LTO, utilizzerai molta RAM anche nella fase di collegamento. Se tutto il resto fallisce, puoi provare a compilare il tuo progetto con un compilatore più leggero (ad esempio tcc ), a scapito di un leggero calo delle prestazioni di runtime sul prodotto compilato. (Questo è generalmente accettabile se lo fai per scopi di sviluppo / debug.)
risposta data Score_Under 03.07.2017 - 19:47
14

Puoi utilizzare il seguente comando (ripetutamente se necessario) per terminare il processo utilizzando la maggior quantità di RAM sul tuo sistema:

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

Con:

  • ps -eo pid --no-headers --sort=-%mem : visualizza gli ID di processo di tutti i processi in esecuzione, ordinati per l'utilizzo della memoria
  • head -1 : mantieni la prima riga (processo che utilizza la maggior parte della memoria)
  • xargs kill -9 : uccide il processo

Modifica dopo il commento preciso di Dmitry:

Questa è una soluzione rapida e sporca che dovrebbe essere eseguita quando non ci sono attività sensibili in esecuzione (attività che non vuoi kill -9 ).

    
risposta data Gohu 03.07.2017 - 17:12
11

Prima di eseguire i tuoi comandi che consumano risorse, puoi anche utilizzare setrlimit (2) system call, probabilmente con il ulimit incorporato nella tua shell bash ( o limit incorporato in zsh) in particolare con -v per RLIMIT_AS . Quindi il consumo di spazio degli indirizzi virtuali troppo grande (ad es. Con mmap (2) o sbrk (2) utilizzato da malloc (3) ) fallirà (con errno (3) essendo ENOMEM ).

Quindi (cioè i processi affamati nella tua shell, dopo aver digitato ulimit ) verrebbero interrotti prima di bloccare il sistema.

Leggi anche Linux Ate My RAM e prendi in considerazione la disabilitazione di overcommitment memoria (eseguendo il comando echo 0 > /proc/sys/vm/overcommit_memory come root, vedere proc (5) ...).

    
risposta data Basile Starynkevitch 04.07.2017 - 07:42
11
  

questo succede spesso a me quando sto compilando il software nel   sfondo

In questo caso, qualcosa come "killall -9 make" (o qualsiasi cosa tu stia usando per gestire la tua compilation, se non lo fai). Questo fermerà la compilazione procedendo ulteriormente, farà SIGHUP tutti i processi del compilatore lanciati da esso (si spera che causino anche l'arresto) e, come bonus, non ha bisogno di sudo assumendo che tu stia compilando come lo stesso utente che hai registrato in come. E poiché uccide la vera causa del tuo problema invece del tuo browser, sessione X o qualche processo a caso, non interferirà con qualsiasi altra cosa stavi facendo sul sistema in quel momento.

    
risposta data fluffysheap 05.07.2017 - 09:34
9

Crea qualche altro scambio per te.

Quanto segue aggiungerà 8G di swap:

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

Sarà comunque lento (stai scambiando) ma non dovresti effettivamente esaurire. Le versioni moderne di Linux possono scambiare file. Informazioni sull'unico utilizzo per una partizione di swap in questi giorni è per ibernare il tuo laptop.

    
risposta data William Hay 03.07.2017 - 16:35
4

Un modo per ottenere una porzione di RAM gratuita con un breve preavviso è usare zram , che crea un disco RAM compresso e lo scambia. Con una CPU semi-decente, questo è molto più veloce del normale swap, e le percentuali di compressione sono piuttosto alte con molti moderni maiali RAM come i browser web.

Supponendo di aver installato e configurato zram, tutto ciò che devi fare è eseguire

sudo service zramswap start
    
risposta data Dmitry Grigoryev 04.07.2017 - 15:01
3

Un'altra cosa che si potrebbe fare è liberare la memoria cache della memoria tramite questo comando:

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

Dalla kernel.org documentazione (corsivo aggiunto):

  

drop_caches

     

Scrivere su questo farà sì che il kernel lasci cadere delle cache pulite, così come   oggetti lastra recuperabili come dentelli e inodi. Una volta rilasciato,   la loro memoria diventa gratis .

     

Per liberare pagecache: echo 1 & gt; / proc / sys / vm / drop_caches Per liberare   oggetti lastra reclamabili (inclusi dentelli e inode): echo 2 & gt;   / proc / sys / vm / drop_caches Per liberare oggetti slab e pagecache: echo 3 & gt;   / Proc / sys / vm / drop_caches

     

Questa è un'operazione non distruttiva e non libererà spazio   oggetti. Per aumentare il numero di oggetti liberati da questa operazione,   l'utente può eseguire 'sync' prima di scrivere in / proc / sys / vm / drop_caches.   Ciò ridurrà al minimo il numero di oggetti sporchi sul sistema e   creare più candidati da eliminare.

    
risposta data Sergiy Kolodyazhnyy 03.07.2017 - 17:13
2

sudo swapoff -a disabiliterà lo swap, facendo sì che il kernel uccida automaticamente il processo con punteggio più alto se il sistema esaurisce la memoria. Lo uso se so che eseguirò qualcosa di RAM-pesante che preferirei uccidere se andasse fuori controllo piuttosto che lasciarlo in swap e rimanere bloccato per sempre. Utilizza sudo swapon -a per riattivarlo in seguito.

In seguito, potresti dare un'occhiata alle tue impostazioni di scambio. Sembra che lo swap si trovi sullo stesso disco della partizione di root, il che rallenterebbe il tuo sistema quando fai lo swap, quindi evitalo se puoi. Inoltre, secondo me, i sistemi moderni spesso si configurano con troppo swap. 32GiB RAM di solito significa che lo scambio di 32GiB è allocato di default, come se volessi davvero mettere 32GiB nello spazio di swap.

    
risposta data sudo 07.07.2017 - 19:02
1

Hai detto "compilare in background". Cosa stai facendo in primo piano? Se si sta sviluppando con Eclipse o altri IDE di risorse pesanti, controllare se tutto è terminato correttamente nella console.

Gli ambienti di sviluppo spesso consentono di avviare più processi in fase di sviluppo, che possono rimanere sospesi anche dopo che non sono più interessati a loro (in debugger o semplicemente non completati correttamente). Se lo sviluppatore non presta attenzione, decine di processi dimenticati possono accumularsi durante il giorno, utilizzando più gigabyte insieme.

Controlla se tutto ciò che deve essere terminato in IDE è terminato.

    
risposta data h22 08.07.2017 - 10:00

Leggi altre domande sui tag