Se la memoria viene esaurita in modo esauriente dai processi, nella misura in cui ciò può eventualmente minacciare la stabilità del sistema, allora il killer OOM entra in scena.
NOTA: OOM Killer ha il compito di continuare a uccidere i processi fino a quando non viene liberata memoria sufficiente per il buon funzionamento del resto del processo che il kernel sta tentando di eseguire.
OOM Killer deve selezionare i processi migliori da uccidere. Il migliore qui si riferisce a quel processo che libererà la massima memoria dopo l'uccisione ed è anche il meno importante per il sistema.
L'obiettivo principale è quello di uccidere il minor numero di processi che minimizza il danno fatto e allo stesso tempo massimizzare la quantità di memoria liberata.
Per facilitare ciò, il kernel mantiene un oom_score
per ciascuno dei processi. Puoi vedere oom_score
ciascuno dei processi nel /proc
filesystem nella pid
directory.
$ cat /proc/10292/oom_score
Maggiore è il valore di oom_score
qualsiasi processo, maggiore è la probabilità di essere ucciso dall'OOM Killer in una situazione di memoria insufficiente.
Come viene OOM_Score
calcolato?
Nel set di patch di David, le vecchie euristiche badness () sono quasi completamente scomparse. Al contrario, il calcolo si trasforma in una semplice domanda su quale percentuale della memoria disponibile viene utilizzata dal processo. Se il sistema nel suo insieme ha poca memoria, la "memoria disponibile" è la somma di tutta la RAM e lo spazio di swap disponibili per il sistema.
Se invece la situazione OOM è causata dall'esaurimento della memoria consentita a un determinato gruppo cpuset / controllo, allora "memoria disponibile" è la quantità totale assegnata a quel gruppo di controllo. Un calcolo simile viene effettuato se i limiti imposti da un criterio di memoria sono stati superati. In ogni caso, l'utilizzo della memoria del processo è considerato come la somma del suo set residente (il numero di pagine RAM che sta usando) e il suo utilizzo di swap.
Questo calcolo produce come risultato un numero percentuale dieci volte; un processo che utilizza ogni byte della memoria disponibile avrà un punteggio di 1000, mentre un processo che non utilizza memoria avrà un punteggio pari a zero. Ci sono pochissime modifiche euristiche a questo punteggio, ma il codice sottrae comunque una piccola quantità (30) dal punteggio dei processi di proprietà della radice sulla convinzione che siano leggermente più preziosi dei processi di proprietà dell'utente.
Un altro tweak che viene applicato è quello di aggiungere il valore memorizzato nella variabile oom_score_adj di ogni processo, che può essere regolata tramite / proc. Questa manopola consente di adattare l'attrattiva di ciascun processo al killer OOM nello spazio utente; impostandolo su -1000 si disabiliteranno completamente le uccisioni OOM, mentre l'impostazione su +1000 equivale a dipingere un bersaglio di grandi dimensioni sul processo associato.
Riferimenti
http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process
https://serverfault.com/a/571326