Ho un laptop standard Linux (test Debian), con una partizione di swap.
Faccio molti esperimenti con esso. Alcuni di loro sono davvero affamati di memoria e il modo in cui Linux si comporta di default è un problema per me ... Facciamo un esempio stupido:
- Siediti di fronte al laptop
- Apri un terminale
- Digita
python
, quindia = [0]*100000000
Ora è molto probabile che non avrai abbastanza RAM per gestire quella grande lista. Linux riempirà la RAM, quindi lo swap e, un paio di minuti dopo, il killer OOM verrà attivato e ucciderà (quasi) servizi casuali e, si spera, se premi Ctrl + C nel momento giusto python
e se il terminale ancora focalizzato, il computer tornerà reattivo.
Vorrei imporre alcuni limiti di memoria per evitare lo scambio indesiderato e rifiutare a un processo il diritto di allocare più memoria di quella che ho (nella RAM). Se la richiesta di memoria è al di sotto di un certo limite o viene richiesta da root, è sufficiente interrompere il processo più affamato di memoria di qualsiasi utente tranne root.
ulimit -Sv [mem]
Sento nella parte posteriore!
Ho Ho! "Usa cgroups
via cgexec
!" qualcuno dice in prima fila!
Sì, hai ragione: queste sono davvero ottime soluzioni. Ma:
- Non si applicano a tutto il sistema
- I limiti sono impostati per processo
- I limiti sono statici, ignorando la quantità reale di RAM libera (AFAIK)
- Qua e là , dicono che questi non sono davvero una buona soluzione per imporre limiti rigidi.
Quello che mi piacerebbe è che il kernel dica: "Tu appartieni all'utente foo (non root), usi molta memoria e finiremo la memoria. Scusa amico ... muori ora!"
Oppure: "Che diavolo stai facendo? Hai bisogno di x MB e sono disponibili solo y MB. Sì, SWAP è vuoto, ma non intendi utilizzare SWAP per fare il tuo sporco lavoro, vero? No, io ha detto di no! Nessun ricordo per te! Se insisti, morirai! "
ulimits
sono una cattiva idea, come mostrato quasi ovunque poiché è una limitazione per processo ... I fork lo sai :) A proposito cgroups
, questo è sicuramente meglio ma manca qualcosa di più generale: sto parlando del mio laptop ma anche possedere un server di "calcolo" che siamo in tre a condividere. Se impongo tali limiti per utente, sarò limitato dallo scenario peggiore, no?
/proc/sys/vm/overcommit_memory
influisce sul comportamento del kernel in memoria insufficiente.