GNU/Linux >> Linux Esercitazione >  >> Linux

Pulsante "uccidi il processo più grande"?

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 bloccarsi. C'è un modo per implementare un pulsante "uccidi il processo più grande" che va direttamente al kernel nel caso in cui noti il ​​blocco abbastanza velocemente? Oppure, poiché si tratta di un computer, andrebbe bene anche un'euristica per quando inizia a bloccarsi e a riprendere il processo più grande.

Risposta accettata:

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

Linux ha un killer OOM, che viene invocato quando il sistema ha eseguito un overcommit della sua memoria e ora è esaurito.
Linux esegue per impostazione predefinita il memory overcommit, il che sostanzialmente significa che fornisce ai programmi più memoria di quella che il sistema ha effettivamente. Lo fa partendo dal presupposto che i programmi non utilizzeranno 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ù semplicemente negarla. Invece quello che fa è invocare il killer OOM. Il killer OOM trova sostanzialmente un processo che secondo il kernel allevierà 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ì.

Dal momento che hai overcommit_memory impostato su (modalità automatica), il kernel sta eseguendo l'overcommit della memoria. Quindi dal tuo comportamento spiegato, sembra che il sistema si stia solo scambiando pesantemente.

Da qui ci sono 2 opzioni.

Riduci lo scambio

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

La tua idea originale, termina manualmente un processo.

Puoi uccidere 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 "magic SysRq". Questa è una piccola funzionalità che dice al kernel di eseguire una sorta di operazione di emergenza. Questo può essere cose come "rimontare tutti i volumi in sola lettura", "sincronizzare tutti i filesystem" o "riavviare ora". Una di queste opzioni è anche invocare il killer OOM.

Correlati:come eseguire calcoli interi e float, in bash o in altri linguaggi/framework?

Se il tuo kernel ha magic SysRq abilitato (opzione del 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
    Questo eseguirà esattamente lo stesso compito del metodo da tastiera, ma lo fa in modo programmatico.

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

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


Linux
  1. Perché il kernel dovrebbe eliminare i pacchetti?

  2. Linux – Partecipare alla mailing list del kernel?

  3. Linux:parti proprietarie o chiuse del kernel?

  4. Esecuzione di una funzione dello spazio utente dallo spazio del kernel

  5. Qual è l'attuale sorgente del kernel Linux?

Come il kernel Linux gestisce gli interrupt

Test di integrazione continui per il kernel Linux

Come controllare la versione del kernel in Linux

Personalizzazione di Grub nel modo più semplice:Grub-customizer

Gestione dello swap nel moderno sistema Linux

Dove va la memoria rimanente di vm.overcommit_ratio?