È possibile attivare OOM-killer in caso di scambio forzato?


26

È possibile fare in modo che il sistema sostituisca preventivamente le pagine inattive ( vm.swappiness), ma invochi il killer di Oom quando il sistema esaurisce la RAM (anziché esaurire la memoria) ed è costretto a scambiare?

L'obiettivo finale è quello di impedire che il sistema si fermi quando inizia a bloccare il disco a causa di errori di pagina importanti, ma consente comunque di scambiare pagine inattive.

Un altro desiderio sarebbe quello di configurare la quantità di memoria di swap che il sistema è costretto a usare prima che si inneschi il killer. In questo modo il sistema può immergersi nello swap solo un po ', purché non vada troppo lontano. Oppure potrei impostare una tale soglia per innescare oom-killer prima di utilizzare tutta la RAM in modo che ci sia sempre spazio per la cache del file system (e quindi evitare un maggiore thrashing del disco).

Non sembra che questo sarebbe così difficile da fare. Sembra che potresti semplicemente dire all'oom-killer di innescarsi quando il sistema ha X ram usato / libero. Ma è per questo che lo sto chiedendo; Non lo so.

Per chiarimenti, non sto cercando di disattivare lo scambio o regolare il vm.swappinessparametro


3
È interessante notare che succede anche quando non ci sono file di scambio. Apparentemente, invece, i file mappati in memoria di sola lettura (come eseguibili, librerie, forse risorse grafiche) vengono sostituiti.
WGH,

Oomd di Facebook è un demone dello spazio utente progettato per uccidere i processi in base alla velocità complessiva del sistema (vale a dire, solo quando si rompe). Ma sembra abbastanza complicato da configurare per desktop / workstation (che probabilmente non inseriscono attività in cgroups o container).
Jeffrey Bosboom,

Risposte:


22

Ho anche lottato con questo problema. Voglio solo che il mio sistema rimanga reattivo, qualunque cosa accada, e preferisco perdere i processi ad aspettare qualche minuto. Sembra che non ci sia modo di ottenere questo risultato usando il kernel oom killer.

Tuttavia, nello spazio utente, possiamo fare quello che vogliamo. Quindi ho scritto Early OOM Daemon ( https://github.com/rfjakob/earlyoom ) che ucciderà il processo più grande (tramite RSS) una volta che la RAM disponibile sarà inferiore al 10%.

Senza earlyoom, è stato facile bloccare la mia macchina (8 GB di RAM) avviando alcune volte http://www.unrealengine.com/html5/ . Ora, le schede del browser colpevoli vengono uccise prima che le cose sfuggano di mano.


1
Grazie, è esattamente quello che stavo cercando. Ora posso continuare a correre column -t -s,su alcuni enormi file CSV e lasciarlo earlyoomuccidere quando ciò non è possibile, prima di notare alcuna mancanza di risposta.
henfiber,

4

Sembra una soluzione troppo elaborata. Suggerirei (e lo faccio su macchine che installo che non necessitano di ibernazione) semplicemente allocando una piccola quantità di spazio di swap (128-256 MiB). In questo modo il kernel può scambiare alcune pagine, ma l'OOM-killer viene invocato prima che le cose peggiorino.

Se vuoi davvero farlo, penso che dovrai scrivere il tuo script / programma che monitora l'utilizzo dello swap e invoca OOM-killer usando il tasto Magic SysReq (che può essere fatto programmaticamente scrivendo su /proc/sysrq-trigger).


1
Direi che avere un piccolo swap non è una soluzione molto elegante. Fondamentalmente finisci per limitare l'utilità del tuo swap. Che cosa succede se si hanno molte pagine inattive e si trarrebbe beneficio dall'avere 10 GB di swap in giro? Ho scatole con ~ 100 GB di RAM in cui 10 GB di swap non sono un'idea inverosimile. E scrivere un'applicazione per farlo nello spazio utente è solo aperto ai problemi (rispetto a nativamente nel kernel).
Patrick,

Perché allora hai essenzialmente bisogno di un meccanismo per distinguere il "buon scambio" dal "cattivo scambio", e questo è un algoritmo difficile da escogitare. La quantità di swap che è appropriato dipende ovviamente dalla quantità di RAM e dal carico di lavoro che stai eseguendo, quindi se 10GiB è appropriato per le tue macchine, assegna che :-)
mgorven

Perché sarebbe difficile? Esistono solo 2 tipi di scambio, scambio preventivo dovuto vm.swappinesse scambio forzato a causa dell'esaurimento della ram. Tutto ciò che deve accadere è quando il kernel è costretto a scambiarsi, per innescare oom-killer. E 10 GB lascia anche tonnellate di spazio per lo scambio forzato per bloccare il disco.
Patrick,
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.