Soluzioni di limitazione della memoria per applicazioni avide che possono causare l'arresto anomalo del sistema operativo?


32

Uso il mio computer per la programmazione scientifica. Ha una buona 8GBquantità di RAM e 12GBdi spazio di swap. Spesso, poiché i miei problemi sono aumentati, supero tutta la RAM disponibile. Invece di crash (che sarebbe preferito), sembra che Ubuntu inizi a caricare tutto in swap, incluso Unity e tutti i terminali aperti. Se non rilevo un programma di fuga in tempo, non posso fare altro che aspettare - ci vogliono 4-5 minuti per passare a un prompt dei comandi, ad es. Ctrl-Alt-F2dove posso uccidere il processo offensivo.

Dal momento che la mia stupidità non rientra nell'ambito di questo forum, come posso evitare che Ubuntu si blocchi durante il thrashing quando utilizzo tutta la memoria disponibile da un singolo programma offensivo?

Esperimento a casa *!

Apri un terminale, avvia pythone se hai numpyinstallato prova questo:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Avvertenza: può avere effetti negativi, monitorare il processo tramite iotopo topucciderlo in tempo. In caso contrario, ci vediamo dopo il riavvio.

Risposte:


21

La shell integrata ulimitconsente di limitare le risorse. Nel tuo caso, per limitare l'uso della memoria nella shell (e nei suoi figli), usa ulimit -v.

Dimostrazione che imposta un limite di memoria di 100 MB (100000 KB):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Si osserva ps uww -C script-name-hereche l' utilizzo di Python richiede almeno 29 MB di memoria (colonna VSZ). Il limite RSS aumenta man mano che lo script Python richiede più memoria, quindi adatta quella colonna.


1
Peccato che non sappiamo che aspetto abbia l'app attuale. L'ulimit come dimostrato ha un impatto su tutti i processi che sono figli di quella shell. Non sappiamo nemmeno se funziona come un demone o se ha molti figli che complicerebbero ulteriormente le cose. Vedi coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/…
ppetraki

1
Non esiste un front-end intuitivo per ulimit e cgroups ? In Windows, quando il sistema operativo si avvicina all'esaurimento della RAM, un messaggio di avviso mi ha sempre permesso di evitare il blocco del sistema. In Ubuntu, devo tenere sempre d'occhio l'utilizzo della memoria?
Dan Dascalescu il

1
@DanDascalescu Se hai configurato un file di scambio, subirai ritardi più lunghi ma sarai comunque in grado di funzionare. Una volta notato che lo scambio inizia, è possibile controllare il monitor di sistema per l'utilizzo della RAM. Se il tuo sistema esaurisce davvero la memoria, viene invocato il killer di memoria insufficiente (OOM) che uccide un processo con il punteggio più alto di "cattiveria" (di solito il processo che consuma la maggior parte della memoria).
Lekensteyn,

12

I cgroup dovrebbero consentire di limitare l'utilizzo della memoria in base al processo.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Il calcolo scientifico è notoriamente ad alta intensità di memoria, tramite il sandboxing della tua app in un cgroup, il resto dei processi non dovrebbe diventare vittima poiché la pressione della memoria sarà alleviata.

In alternativa, una VM può essere utilizzata come una sorta di limite rigido poiché l'app può utilizzare solo la memoria delegata alla macchina virtuale, a spese delle prestazioni ovviamente. Tuttavia, una macchina virtuale è molto più semplice da configurare per i non iniziati rispetto alla configurazione e alla gestione di un cgroup.

Decisioni Decisioni :) Buona fortuna!


1
Non esiste un front-end intuitivo per ulimit e cgroups? In Windows, quando il sistema operativo si avvicina all'esaurimento della RAM, un popup di avviso mi ha sempre permesso di evitare il blocco del sistema. In Ubuntu, devo tenere sempre d'occhio l'utilizzo della memoria?
Dan Dascalescu il

No. Anche il tuo sistema operativo non dovrebbe bloccarsi, questo è un problema separato. Il pop-up di Windows è solo un cerotto per cominciare. Se stai usando tonnellate di memoria, forse dovresti indagare sul perché? Ad esempio, i browser moderni con il loro sanboxing possono facilmente consumare 70-150 M PER TAB. La disattivazione o la regolazione può liberare una notevole quantità di memoria utilizzata regolarmente da un utente finale. Gli scheduler dovrebbero scambiare i programmi usati raramente per risparmiare spazio, ma se si svegliano più di quanto dovrebbero, è necessario correggerli o se l'attività primaria richiede molta memoria (web), è necessario più RAM.
ppetraki,

8
So cosa consuma la memoria: Chrome. Ma il sistema operativo dovrebbe proteggere la sua stabilità dalle applicazioni che funzionano comunque.
Dan Dascalescu,

1
Capisco da dove vieni come utente. Ciò che stai chiedendo, tuttavia, significa trasformare una piattaforma informatica generale in un dispositivo. Come metodo meno complesso (soggetto a errori) che un ingegnere del sistema operativo deve implementare per fornire tali garanzie è quello di prendere decisioni drammaticamente ponderate su come viene eseguito l'intero computer. Questo di solito viene a scapito della flessibilità dell'utente finale. Vedi esempi di ciò nel tablet computing. Nei desktop, tuttavia, la flessibilità è preservata.
ppetraki,
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.