Pulsante "Uccidi il processo più grande"


14

Questo laptop ha un SSD e quindi ho deciso di omettere lo scambio. Funziona bene nella maggior parte dei casi, ma a volte la RAM diventa un po 'corta e il computer diventa molto lento e tende a congelarsi. C'è un modo per implementare un pulsante "uccidi il processo più grande" che va direttamente al kernel nel caso in cui noti il ​​congelamento abbastanza velocemente? Oppure, poiché si tratta di un computer, un'euristica per quando inizia a congelare e girare il processo più grande stesso andrebbe bene.


Intendi il comando "uccidi il processo più grande"?
Ramesh,

Linux ha questo. Si chiama killer OOM. Ma devi abilitare l'overcommit della memoria (ed è attivo di default nella maggior parte delle distro).
Patrick,

@Patrick overcommit_memoryè 0, overcommit_ratioè 50.
Reactormonk,

Risposte:


12

Dal tuo commento, sembra che il sistema stia solo scambiando.

Linux ha un killer OOM, che viene invocato quando il sistema ha sovraccaricato la sua memoria e ora si è esaurito.
Linux per impostazione predefinita esegue il sovraccarico della memoria, il che significa sostanzialmente che fornisce ai programmi più memoria di quella effettivamente fornita dal sistema. Lo fa supponendo che i programmi non utilizzino effettivamente tutta la memoria richiesta. Tuttavia, quando il sistema esaurisce la memoria, ha già detto ai vari processi in esecuzione che hanno la memoria, quindi non può più negarlo. Invece, ciò che fa è invocare il killer OOM. Il killer OOM fondamentalmente trova un processo che il kernel ritiene possa alleviare la condizione di memoria insufficiente. Di solito questo è solo il processo che utilizza la maggior quantità di memoria, ma l'algoritmo è in realtà molto più complesso di così.

Dato che hai overcommit_memoryimpostato su 0(modalità automatica), il kernel sta eseguendo un sovraccarico di memoria. Quindi, dal tuo comportamento spiegato, sembra che il sistema stia semplicemente cambiando pesantemente.

Da qui ci sono 2 opzioni.

Ridurre lo scambio

Il tuo sistema sta esaurendo la RAM, quindi il kernel inizia a scambiare le cose. Se il tuo sistema esaurisce lo scambio, invoca il killer OOM. Tuttavia, poiché rimane spazio libero di swap, ciò non accade.

La tua idea originale, uccidi manualmente un processo.

Puoi interrompere manualmente un processo quando pensi che il sistema stia scambiando troppo e che qualcosa debba morire. Questo può essere fatto tramite i trigger SysRq del kernel.

Il kernel ha quello che chiama "SysRq magico". Questa è una funzionalità che dice al kernel di eseguire una sorta di operazione di emergenza. Può trattarsi di "rimontare tutti i volumi di sola lettura", "sincronizzare tutti i filesystem" o "riavviare ora". Una di queste opzioni è anche quella di invocare il killer OOM.

Se il tuo kernel ha SysRq magico abilitato (opzione kernel CONFIG_MAGIC_SYSRQ), puoi farlo in 2 modi.

  1. Alt+ SysRq+ f
    Basta premere questi 3 tasti sulla tastiera.
  2. echo f > /proc/sysrq-trigger
    Ciò eseguirà esattamente lo stesso compito del metodo della tastiera, ma lo fa programmaticamente.

Potresti anche disabilitare completamente lo swap, e questo è quello che faccio sulla maggior parte dei miei sistemi, e per questo motivo esatto. Lo scambio è vantaggioso in quanto il kernel scambia preventivamente i dati che non vengono utilizzati, consentendo di utilizzare più cache per la cache. Ma porta a questo problema di scambio forzato che stai vedendo.

Personalmente penso che la soluzione migliore sia una sorta di opzione del kernel per invocare il killer OOM sullo scambio forzato. Fondamentalmente lascia che lo scambio preventivo funzioni, ma se il kernel è costretto a spostare qualcosa in scambio perché sei fuori dalla RAM, allora invoca OOM killer.
Purtroppo questo è solo il mio desiderio personale. Non lo fa.


Non sapevo di OOM Killer. Stavo pensando a uno script che controlla continuamente l'utilizzo della memoria usando topo il pscomando e se supera un certo limite di soglia, uccidendo quel processo usando il killcomando.
Ramesh,

Non uso alcuno scambio.
Reactormonk,

per vedere quale processo è stato ucciso dall'omicida:grep -E "oom-killer|Killed process" /var/log/syslog /var/log/syslog.1
lesmana il

@Tass Oh, ho completamente ignorato il commento "Ho deciso di omettere lo scambio", scusa :-(. Anche se l'informazione "uccidi manualmente un processo" è ancora valida. Tuttavia non dovresti provare lentezza quando esaurisci la memoria. dovrebbe sperimentare che il kernel sta solo uccidendo le cose.
Patrick,

@Patrick che succede, ma dopo ~ 30 minuti.
Reactormonk,
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.