In che modo il killer OOM decide quale processo uccidere per primo?


92

Questa risposta spiega le azioni intraprese dal kernel quando si verifica una situazione OOM in base al valore di sysctl vm.overcommit_memory.

Quando overcommit_memoryè impostato su 0 o 1, overcommitè abilitato e ai programmi è consentito allocare più memoria di quella realmente disponibile.

Cosa succede quando rimaniamo a corto di memoria in questa situazione? In che modo il killer OOM decide quale processo uccidere per primo?


1
Credo che i valori siano 1 an 2 - non 0 e 1.
fpmurphy il

Da qui serverfault.com/questions/606185/… , 0 e 1 sono i valori corretti.
Rui F Ribeiro,

1
C'è una descrizione eccellente disponibile su linux-mm.org/OOM_Killer
Jarek Przygódzki

Secondo kernel.org/doc/Documentation/vm/overcommit-accounting 0, 1 e 2 sono tutti valori validi.
Derek Lewis,

Risposte:


109

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_scoreper ciascuno dei processi. Puoi vedere oom_scoreciascuno dei processi nel /procfilesystem nella piddirectory.

$ cat /proc/10292/oom_score

Maggiore è il valore di oom_scorequalsiasi processo, maggiore è la probabilità di essere ucciso dall'OOM Killer in una situazione di memoria insufficiente.

Come viene OOM_Scorecalcolato?

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


3
Anche la gentilezza non ha un ruolo?
neverMind9
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.