Ogni distribuzione Linux® include il processo Out-of-Memory (OOM) Killer, ma che cos'è? In poche parole, questo è il processo di autoconservazione del server. Per comprendere appieno cosa significa, considera come Linux alloca la memoria.
allocazione della memoria Linux
Il kernel Linux alloca memoria su richiesta per tutte le applicazioni attualmente in esecuzione sul server. Poiché in genere ciò avviene in anticipo, le applicazioni di solito non utilizzano tutta la memoria assegnata. Ciò consente al kernel di sovraccaricare la memoria, rendendo la memoria più efficiente. Questo impegno eccessivo consente al kernel di impegnare più memoria di quella effettivamente disponibile fisicamente. In genere, questo non è un problema. Il problema si verifica quando troppe applicazioni iniziano a utilizzare contemporaneamente la memoria loro assegnata. Il server corre il rischio di arresto anomalo perché ha esaurito la memoria. Per evitare che il server raggiunga quello stato critico, il kernel contiene anche un processo noto come OOM Killer . Il kernel usa questo processo per iniziare a uccidere i processi non essenziali in modo che il server possa rimanere operativo.
Anche se potresti pensare che questo non dovrebbe essere un problema, OOM Killerkills elabora che il server ha ritenuto non essenziali, non l'utente. Ad esempio, le due applicazioni che OOM Killer di solito uccide per prime sono Apache® e MySQL® perché utilizzano una grande quantità di memoria. Chiunque abbia un sito web sa immediatamente che è un grosso problema. Se OOM Killer uccide uno di questi, un sito Web spesso si arresta in modo anomalo immediatamente.
Perché un processo specifico è stato interrotto?
Quando cerchi di scoprire perché il killer OOM ha ucciso un'applicazione o un processo, puoi cercare alcune cose che possono aiutare a rivelare come e perché il processo è stato interrotto. Il primo posto in cui cercare è nel syslog eseguendo il seguente comando:
$ grep -i kill /var/log/messages*
host kernel: Out of Memory: Killed process 5123 (exampleprocess)
Dovresti ottenere un output simile all'esempio precedente. La capitale K inUcciso ti dice che il processo è stato terminato con un -9
segnale, e questo in genere è un buon indicatore della colpa dell'OOM Killer.
Inoltre, puoi eseguire il seguente comando per controllare le statistiche di memoria alta e bassa del server:
$ free -lh
Il -l
l'interruttore mostra le statistiche di memoria alta e bassa e -h
switch inserisce l'output in gigabyte per una più facile leggibilità umana. Puoi cambiarlo in -m
cambia se preferisci l'output in megabyte. Un ulteriore vantaggio di questo comando è che fornisce anche le informazioni sull'utilizzo della memoria Swap. Un avvertimento è che free
Il comando fornisce solo un'istantanea di questo momento, quindi è necessario controllarlo più volte per avere un'idea di ciò che sta accadendo.
Fortunatamente, il vmstat
il comando ottiene l'output di memoria in un periodo di tempo e ha anche un'opzione per una tabella di facile lettura:
$ vmstat -SM 10 20
Il comando precedente emette informazioni sulla memoria di sistema venti volte a intervalli di 10 secondi. Questo è ciò che significano 10 e 20 nell'esempio precedente. Puoi modificare entrambi questi numeri per adattarli a una frequenza e a un totale più adatti alle tue esigenze. Il -S
switch visualizza l'output in un formato tabella e il -M
switch mostra l'output in megabyte. Usa questo comando per mostrare cosa sta succedendo attivamente durante i parametri temporali che specifichi.
Un altro buon strumento da usare è, ovviamente, il top
comando. top
ordini emessi dalla variabile CPU per impostazione predefinita, ma se fai clic su MAIUSC + M dopo aver eseguito il top
comando, puoi ottenere aggiornamenti in tempo reale per l'utilizzo della memoria invece dell'utilizzo della CPU.
Configura il killer OOM
Poiché OOM Killer è un processo, puoi configurarlo in base alle tue esigenze. In effetti, OOM Killer ha già diverse opzioni di configurazione integrate che consentono agli amministratori e agli sviluppatori di scegliere come vogliono che il processo OOM Killer si comporti di fronte a un la memoria sta diventando pericolosamente bassa. Tieni presente che queste opzioni possono variare in base a fattori quali l'ambiente e le applicazioni in esecuzione.
Come per qualsiasi cosa che implichi la modifica delle configurazioni, è sempre meglio testare le modifiche proposte in un ambiente di sviluppo o di staging prima di apportare tali modifiche in un ambiente di produzione live. In questo modo, sai come reagisce il sistema a tali modifiche. Infine, anche se sei sicuro del tuo piano, esegui sempre un backup prima di apportare modifiche. Per le seguenti opzioni di configurazione, devi essere il root
utente.
Opzione 1:riavvia
La prima opzione prevede la modifica di sysctl configurazione(/etc/sysctl.conf ), che consente alle modifiche di persistere tra i riavvii:
sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf
La X
nel comando precedente è il numero di secondi che si desidera che il sistema attenda prima del riavvio.
Nella maggior parte delle situazioni, non è possibile riavviare ogni volta che la memoria del sistema si esaurisce in modo critico. Sebbene questo approccio possa essere necessario per alcune situazioni, la maggior parte non ha bisogno o garantisce un riavvio dell'intero sistema per risolvere il problema.
Opzione 2:proteggere o sacrificare i processi
Questa particolare opzione richiede un approccio più raffinato. È possibile (a) proteggere determinati processi rendendoli meno probabili essere uccisi dall'OOM Killer o (b) impostare determinati processi in modo che abbiano maggiori probabilità di essere uccisi. Puoi farlo con i seguenti comandi:
echo -15 > /proc/(PID)/oom_adj (less likely)
echo 10 > /proc/(PID)/oom_adj (more likely)
Sostituisci il (PID)
segnaposto nel comando di esempio con l'ID (o PID) del processo particolare a cui sei interessato. Per proteggere o sacrificare un processo, devi trovare il processo padre (l'originale). Usa il comando seguente per individuare il PPID (o l'ID del processo padre), in cui sostituisci il processo con il tuo processo (come Apache, MySQL e così via):
pstree -p | grep "process" | head -1
Puoi vedere che questa opzione è leggermente migliore dell'opzione nucleare di un intero riavvio del sistema. Tuttavia, cosa succede se hai un processo che è cruciale e non può essere ucciso?
Opzione 3:esenta un processo
Questa opzione viene fornita con una nota di avvertimento. L'esenzione dei processi può, in alcune circostanze, causare cambiamenti di comportamento non intenzionali, che dipendono in gran parte dal sistema e dalle configurazioni delle risorse. Se il kernel non è in grado di uccidere un processo utilizzando una grande quantità di memoria, inizierà a uccidere altri processi disponibili. Questo può includere processi che potrebbero anche essere processi importanti del sistema operativo. Di conseguenza, il sistema potrebbe interrompersi completamente. Basti dire che usa questa opzione con estrema cautela.
Perché l'intervallo valido per le regolazioni di OOM Killer è compreso tra -16
e +15
, impostazione di -17
esenta completamente un processo perché non rientra nell'ambito degli interi accettabili per la scala di regolazione dell'OOM Killer. La regola generale è:più alto è il valore numerico, più è probabile che un processo selezionato venga ucciso. Pertanto, il comando per esentare completamente un processo è:
echo -17 > /proc/(PID)/oom_adj
Opzione 4:l'opzione rischiosa
Avviso :Rackspace non lo consiglia per gli ambienti di produzione.
Se i riavvii e la protezione, il sacrificio o l'esenzione dei processi non sono sufficienti, c'è l'ultima opzione rischiosa:disabilita completamente OOM Killer opzione.
Questa opzione può causare uno qualsiasi dei seguenti risultati:
- un grave panico nel kernel
- un blocco del sistema
- un arresto anomalo dell'intero sistema
Come mai? Impedisce al server di impedirsi di esaurire le risorse. Se si disabilita completamente OOM Killer, nulla protegge il server dall'esaurimento della memoria. Usa estrema moderazione e cautela quando consideri questa opzione.
Per esercitare questa opzione, esegui il seguente comando:
sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf
Ora che hai imparato a conoscere OOM Killer, sai come adattare il processo al tuo ambiente e alle tue esigenze di sistema individuali. Come regola generale, fai attenzione ogni volta che modifichi i processi del kernel. L'OOM Killer non fa eccezione a questa regola.