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_memory
impostato 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.
- Alt+ SysRq+ f
Basta premere questi 3 tasti sulla tastiera.
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.