Come posso usare oom_score_adj?


24

L'11.04 /proc/[pid]contiene oom_score_adj, ma man procdescrive il vecchio oom_adj. Ho cercato su Google senza successo per qualsiasi informazione su come utilizzare questo.

Quello che devo sistemare è che i processi avviati da 'pbs' o 'gridengine' vengano uccisi prima che venga ucciso qualsiasi altro. Come lo posso fare?


Per avere questa modifica in modo permanente per i servizi gestiti da Upstart: Come impostare permanentemente le regolazioni del killer OOM per i demoni? .
gertvdijk,

È già una risposta. Si collega ad esso. :)
gertvdijk,

Ma non su questo sito :-)
bmargulies

Risposte:


13

Basato sulle mie domande e risposte su Unix e Linux su una domanda simile.

Come Stuart ha sottolineato molto bene nella sua risposta , i valori validi sono numeri interi compresi tra -1000 e 1000 oom_score_adj. Più basso è il valore, minore è la probabilità che venga ucciso.

È molto scomodo dover cambiare questo valore più volte una volta riavviata l'applicazione. Le informazioni vengono semplicemente perse al termine del processo. Upstart (il demone init in Ubuntu), ha una bella opzione per questo da configurare per i demoni per assicurarsi che sia impostato ogni volta che viene (ri) avviato:

oom score

[...] snip [...]

Esempio:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Quindi, in sostanza, puoi modificare il /etc/init/myservice.conffile di configurazione per i servizi che desideri modificare, per includere una riga oom score -1000. Suppongo che i servizi 'pbs' o 'gridengine' di cui stai parlando nella tua domanda siano abilitati per Upstart, altrimenti avrai bisogno di un altro modo per cambiarlo permanentemente.


7

Se è possibile modificare lo script iniziale generando il processo a cui si desidera dare la priorità per oom-killer, aggiungere quanto segue allo script iniziale:

echo 1000 > /proc/self/oom_score_adj

Il valore è ereditato per i processi figlio.


6

Se imposti un valore alto (ish) per oom_adj o oom_score_adj, verranno eliminati per primi. per esempio

echo 15 > /proc/[pid]/oom_adj

oom_adj va da -16 a 15 e come detto sopra oom_score_adj accetta -1000 a 1000


Devi essere root per farlo. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil,

2
In realtà, puoi aumentare il punteggio per i tuoi processi senza root ("sì, questo può essere ucciso oom"). La riduzione (inferiore a 0) richiede il root.
Piskvor,

5

Esaminare il codice è sempre una buona idea. Normalmente uso la funzione di ricerca di kernel.org, ma al momento non funziona. Anche Github fa un buon lavoro. Ho trovato questo:

Invece, viene aggiunto un nuovo parametro sintonizzabile, / proc / pid / oom_score_adj, che va da -1000 a +1000. Può essere usato per polarizzare l'euristica in modo tale che alcuni compiti non vengano mai considerati per uccidere oom mentre altri possono sempre essere considerati. Il valore viene aggiunto direttamente al punteggio badness (), quindi un valore di -500, ad esempio, significa scontare il 50% del suo consumo di memoria rispetto ad altre attività sul sistema, legate al mempolicy, nel cpuset, oppure condividendo lo stesso controller di memoria.

Da https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h


Grazie per il puntatore, ma spero che qualcuno guidi e spari in una ricetta per l'intero problema, che sembra organizzare questo valore per il demone exec di pbs prima che forchi qualsiasi lavoro.
bmargulies,

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.