Il kernel Linux offre un certo grado di flessibilità per quanto riguarda l’allocazione della memoria. Un parametro sysctl, vm.overcommit_memory, controlla il modo in cui il kernel gestisce le situazioni in cui i processi richiedono più memoria di quella fisicamente disponibile. Se impostato su 0 o 1, il kernel consente l'”overcommit”, consentendo essenzialmente ai programmi di allocare più memoria di quella esistente. Ciò può portare a una situazione critica se la memoria allocata è completamente utilizzata, poiché il sistema può esaurire le risorse fisiche.

Eccessivo impegno ed esaurimento della memoria

Quando la memoria è esaurita, la stabilità dell’intero sistema è minacciata. I processi potrebbero bloccarsi, i servizi essenziali potrebbero fallire e le prestazioni complessive potrebbero peggiorare drasticamente. Per evitare ciò, il kernel Linux utilizza un meccanismo noto come Out of Memory (OOM) Killer.

Il processo decisionale del killer OOM

Il ruolo principale di OOM Killer è terminare selettivamente i processi per liberare memoria sufficiente affinché il sistema funzioni.  La sfida sta nello scegliere il processo “migliore” da eliminare, quello che rilascerà più memoria causando interruzioni minime.

OOM Score: per prendere questa decisione, il kernel assegna un oom_score a ciascun processo. This score can be viewed under the /proc filesystem within the process ID directory. Più alto è oom_score, maggiore è la probabilità che il processo venga interrotto durante una situazione OOM.

Calcolo del punteggio OOM: nei moderni kernel Linux, oom_score viene calcolato come una semplice percentuale della memoria disponibile utilizzata dal processo.

  1. Se l’intero sistema ha poca memoria, la “memoria disponibile” è il totale della RAM e dello spazio di swap.
  2. Se la carenza si verifica all’interno di uno specifico gruppo di controllo (cgroup), la “memoria disponibile” è la quantità allocata a quel cgroup.
  3. Sfumature del punteggio: il calcolo risulta in un numero compreso tra 0 (utilizzando nessuna memoria) e 1000 (utilizzando tutta la memoria disponibile). Ci sono piccole modifiche:
  4. I processi di proprietà root hanno il loro punteggio leggermente ridotto, poiché spesso sono considerati più importanti.
  5. È possibile aggiungere la variabile oom_score_adj (regolabile tramite /proc), consentendo agli utenti di influenzare l’attrattiva di un processo per OOM Killer.

Implicazioni e considerazioni

Comprendere il comportamento di OOM Killer è fondamentale per gli amministratori di sistema e gli sviluppatori. Monitorando l’utilizzo della memoria dei processi e i valori oom_score, puoi ottenere informazioni su come il sistema potrebbe reagire sotto pressione della memoria. Tieni presente che OOM Killer è l’ultima risorsa. È progettato per mitigare i guasti catastrofici, ma i processi di uccisione possono comunque avere conseguenze negative.

Misure proattive

  1. Ottimizza le applicazioni: assicurati che il tuo software sia ben scritto e non consumi troppa memoria.
  2. Monitora l’utilizzo della memoria: controlla regolarmente l’utilizzo della memoria a livello di sistema e le statistiche dei singoli processi.
  3. Imposta limiti di memoria:  valuta la possibilità di utilizzare cgroup o altri meccanismi per impostare limiti sull’utilizzo della memoria per processo o gruppo di processi.

Il Linux OOM Killer svolge un ruolo cruciale nel mantenere la stabilità del sistema durante carenze critiche di memoria. Il suo processo decisionale, sebbene complesso, mira a ridurre al minimo i danni selezionando i processi più sacrificabili. Comprendendo come funziona OOM Killer e adottando misure proattive per gestire l’utilizzo della memoria, è possibile ridurre la probabilità di incontrare situazioni OOM e garantire un funzionamento del sistema più fluido e affidabile.