Il sistema si blocca quando si esaurisce la memoria


34

Ho un eeePC 900a: ha un flash da 8 GB come disco e solo 1 GB di RAM. La distribuzione Linux installata su di essa è ArchLinux.

Quando il sistema esaurisce la memoria, non risponde molto : ci vogliono diversi secondi / minuti per fare cose come passare a TTY1 o persino spostare il puntatore del mouse. A volte sembra che il sistema si blocchi: tre nostri fa l'ho lasciato da solo e finora nulla è cambiato.

Preferirei evitare di creare una partizione / file di swap su questo eeePC poiché il disco è già così piccolo, e anche perché le molte scritture sullo spazio di swap ridurrebbero molto la durata della flash card. Inoltre, penso che un file / partizione di swap possa spostare il problema, anziché risolverlo definitivamente.

Il kernel non dovrebbe uccidere alcune applicazioni casuali quando esaurisce la memoria? Perché fallisce (o impiega anni) a farlo?

Alcuni mesi / anni fa ho già cercato di approfondire questo aspetto, ma non sono riuscito a trovare nulla che potesse effettivamente funzionare ...


1
Quale DE / WM stai usando nella tua configurazione, quali servizi / demoni stai eseguendo? Utilizzando un ambiente desktop completo e navigando con Chromium o Firefox, ad esempio, si mangia la RAM per il brunch. 1 GB di RAM dovrebbe essere sufficiente per eseguire Arch Linux stesso, ma ciò che conta davvero è ciò che ci metti sopra.

1
Sto usando LXDE. Chromium è il programma che di solito richiede la maggior parte della RAM. Comunque non è questo il punto. Non sono io che devo preoccuparmi di quanta memoria sta usando il mio sistema, è il mio sistema che non dovrebbe morire a causa di ciò. Se il mio sistema sta esaurendo la memoria, è libero di uccidere qualsiasi applicazione desideri, voglio solo che non si blocchi !
peoro,

6
Voglio dire, sto seriamente pensando di esecuzione di uno script come questo (in pseudocodice): while(true){ if( $FREE_MEMORY<10MB ){ kill -9 $RANDOM_PID; } }. Ciò risolverebbe sicuramente il mio problema. Ma aspetta, il kernel non dovrebbe farlo (e in un modo molto migliore del mio script)? Perché non sta facendo il suo lavoro?
peoro,

2
@Marcin, che sposta solo il problema, non lo risolverà. Anche se avessi 4 GB di memoria (grazie ad alcuni swap), il mio sistema potrebbe esaurire la memoria (quindi appendere). Quello che voglio evitare è il blocco del mio sistema quando non c'è più RAM. Se il mio kernel improvvisamente uccidesse il cromo non appena la mia RAM è finita sarei felice anche con l'1GB che ho ora.
peoro,

4
@Lee Il "sysrq magico" è una combinazione chiave che va direttamente al kernel. Ciò funzionerà spesso anche se la tastiera e il mouse non rispondono. Vedi en.wikipedia.org/wiki/Magic_SysRq_key
Raman,

Risposte:


14

È possibile chiamare OOM-killer (memoria esaurita) direttamente dalla combinazione di tasti:

SysRq-F

Il tasto SysRq viene generalmente combinato con il tasto PrtSc sulle tastiere.

OOM-killer uccide alcuni processi e il sistema diventa di nuovo reattivo.

Grazie Raman per un consiglio su questa funzione nei commenti sopra.

PS: Questo mi ha aiutato molto. Sono d'accordo con l'opinione che questo è il consiglio più utile su quel problema se causato da Chrome o da qualsiasi software avido di memoria. Ma devi tenere a mente che OOM-killer potrebbe uccidere alcuni processi davvero importanti, usalo attentamente.


2
Ho la chiave PrtScn|SysRq. Ma premendo SysRq - Fsi ottiene solo uno screenshot
Lee,

2
Dato che in pratica hai preso il mio commento sopra e lo hai reso una risposta, una piccola attribuzione sarebbe stata piacevole. Ti ho votato comunque. :-)
Raman,

3
@Lee Devi abilitarlo. Alcune distribuzioni non hanno il sysrq magico abilitato di default. Questo dovrebbe aiutare: google.ca/search?q=sysrq+enable
Raman,

2
@Raman Scommetto che il 99% ritiene che questo non possa "abilitarlo" per impostazione predefinita perché la loro macchina è già bloccata ... perché non è abilitata per impostazione predefinita?
themihai,

3
@themihai perché molte persone lo considerano un rischio per la sicurezza: ti dà accesso diretto al kernel tramite l'accesso fisico a un dispositivo di input, indipendentemente dallo stato dell'applicazione, ad esempio schermate di blocco e simili.
Raman,

12

Lo stato naturale delle cose è che i dati dell'applicazione sono nella RAM e che i file sono su disco.
Lo stato ideale delle cose, dal punto di vista delle prestazioni, è che i dati in uso frequente sono nella RAM e i dati che non sono necessari al momento sono su disco.
Su un sistema normale, il kernel fa due cose per tentare di raggiungere questo ideale:

  • I dati dell'applicazione che non vengono utilizzati da un po 'di tempo possono essere spostati su disco: questo è swap.
  • I dati dei file utilizzati di recente vengono conservati nella RAM: si tratta della cache del disco (per i dati letti dal disco) e dei buffer del disco (per i dati che stanno per essere scritti sul disco).

Su un sistema tipico, una parte significativa della RAM è dedicata alla cache e ai buffer (il 50% è una cifra tipica). Poiché la RAM è una risorsa limitata, ciò potrebbe richiedere lo spostamento di alcuni dati dell'applicazione per lo scambio (lo scambio è necessario solo se esiste un modo migliore per utilizzare la RAM).

Su un sistema senza scambio, c'è un punto in cui i dati dell'applicazione utilizzano quasi tutta la RAM e quindi non c'è quasi spazio per la cache. Quindi è probabile che il sistema sia lento. Il kernel non inizierà a uccidere le applicazioni fino a quando non sarà necessario. Finché le applicazioni riempiono solo il 99% della memoria disponibile, il sistema continua a funzionare, ma molto lentamente perché i dati dei file devono essere caricati e ricaricati dal disco continuamente. Con le stesse applicazioni in esecuzione, il sistema sarebbe più veloce con lo swap a quel punto.

Per ulteriori informazioni su questo problema, vedere questa discussione su lkml e questo post sul blog .

Non conosco un modo diretto per dire al kernel di riservare una quantità minima di RAM per la cache del disco. Potresti impostare una piccola parte della tua RAM come spazio di swap , forse anche compresso . Ci sono rapporti di successo su questo fronte , anche se non fornisco garanzie nel tuo caso particolare.


1
Grazie per la spiegazione e i collegamenti, hanno contribuito a chiarire alcuni dubbi sullo scambio. in seguito alla risposta di @Marcin alla mia domanda, ho impostato 256 MB di swap virtuale compresso (compcache) nella mia RAM. Questo, tuttavia, non risponde completamente alla mia domanda: capisco che il mio sistema sarà lento quando l'intera RAM viene utilizzata solo dall'applicazione e nulla viene memorizzato nella cache; Non riesco ancora a capire perché questo sistema si blocca per minuti / ore (forse per sempre?) Quando sono completamente senza RAM. Penso che il mio kernel non stia facendo il suo lavoro nell'uccidere le applicazioni quando è senza memoria, se 3 ore non sono sufficienti per passare a TTY1.
peoro,

Ho disabilitato lo scambio con 32 GB di memoria fisica e quando un software difettoso scappa con l'allocazione della memoria (ciao ld, pezzo di immondizia), si blocca ancora per quasi un minuto, svegliarmi quanto basta per farmi spostare il mouse incredibilmente lento per un secondo o due ogni diversi secondi. La gestione di OOM di Linux è una schifezza completa. Se sono fortunato, il killer OOM uccide il processo giusto senza rovinare completamente l'ambiente desktop. E sono un grande fan di Linux. È molto peggio con il paging abilitato. Il paging di Linux è uno scherzo.
doug65536,

6

Si tratta di un bug noto dal 2007: vedere Blocco del sistema in caso di utilizzo elevato della memoria .

In questa situazione, Windows visualizza una finestra di dialogo che avvisa l'utente di chiudere una o più applicazioni.


2
Sembra essere "non assegnato" in Ubuntu. Forse il DE dovrebbe avvisare l'utente o addirittura congelare l'app ad alta intensità di memoria?
nkkollaw,

1
@nbrogi: tutto tranne che congelarsi silenziosamente. Ma buona fortuna a convincere gli sviluppatori Ubuntu a farlo.
Dan Dascalescu,

6

Di recente ho trovato una soluzione al mio problema.

Dato che il killer OOM di Linux non è in grado di svolgere correttamente il suo lavoro, ho iniziato a utilizzare un Killer OOM dello spazio utente: earlyoom . È scritto in C, abbastanza configurabile e funziona come un incantesimo per me.

Ho anche sentito parlare di alcune alternative, come OOMD di Facebook , sviluppato per funzionare sui loro server, ma non ho provato questo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.