Per anni, il killer OOM del mio sistema operativo non funziona correttamente e porta a un sistema congelato.
Quando l'utilizzo della memoria è molto elevato, l'intero sistema tende a "congelare" (in effetti: diventando estremamente lento) per ore o addirittura giorni , invece di uccidere i processi per liberare la memoria.
Il massimo che ho registrato è di 7 giorni prima di dimettermi per eseguire un ripristino.
Quando sta per essere raggiunto OOM, lo iowait è molto alto (~ 70%), prima di diventare non misurabile.
Lo strumento: iotop
ha dimostrato che tutti i programmi leggono a una velocità effettiva molto elevata (per decine di MB / sec) dal mio disco rigido.
Cosa stanno leggendo quei programmi?
- La gerarchia di directory?
- Il codice eseguibile stesso?
Non esattamente ora.
[modificato] Al momento in cui ho scritto questo messaggio (nel 2017) stavo usando un ArchLinux aggiornato (4.9.27-1-lts), ma avevo già riscontrato il problema per anni.
Ho riscontrato lo stesso problema con varie distribuzioni Linux e diverse configurazioni hardware.
Attualmente (2019), sto usando un Debian 9.6 aggiornato (4.9.0) Ho 16 GB di RAM fisica, un SSD su cui è installato il mio sistema operativo e nessuna partizione di swap .
A causa della quantità di RAM che ho, non voglio abilitare una partizione di swap, dal momento che ritarderebbe solo l'apparizione del problema.
Inoltre, con gli SSD lo scambio troppo spesso potrebbe potenzialmente ridurre la durata del disco.
A proposito, ho già provato con e senza una partizione di swap, ha dimostrato di ritardare solo l'apparizione del problema, ma non essere la soluzione.
Per me il problema è causato dal fatto che Linux elimina i dati essenziali dalla cache , il che porta a un sistema congelato perché deve leggere tutto, ogni volta dal disco rigido.
Mi chiedo anche se Linux non lascerebbe cadere le code page eseguibili dei programmi in esecuzione, il che spiegherebbe perché i programmi che normalmente non leggono molti dati, si comportano in questo modo in questa situazione.
Ho provato diverse cose nella speranza di risolvere questo problema.
Uno era di impostare /proc/sys/vm/min_free_kbytes
su 1000000
(1 GB).
Poiché questo 1 GB dovrebbe rimanere libero, ho pensato che questa memoria sarebbe stata riservata da Linux per memorizzare nella cache dati importanti.
Ma non ha funzionato.
Inoltre, credo che utile aggiungere che, anche se può sembrare grande, in teoria, limitando la dimensione della memoria virtuale per la dimensione della memoria fisica, definendo /proc/sys/vm/overcommit_memory
per 2
non è decentemente tecnicamente possibile nella mia situazione, perché il tipo di applicazioni che uso, richiedono più memoria virtuale di quella che usano effettivamente per alcuni motivi.
Secondo il file /proc/meminfo
, il Commited_AS
valore è spesso superiore al doppio della RAM fisica sul mio sistema (16 GB, Commited_AS è spesso> 32 GB).
Ho riscontrato questo problema con il /proc/sys/vm/overcommit_memory
suo valore predefinito:, 0
e per un po 'l'ho definito: 1
perché ho preferito che i programmi venissero uccisi dal killer OOM piuttosto che comportarsi male perché non controllano i valori di ritorno di malloc
quando le allocazioni sono rifiutate.
Quando stavo parlando di questo problema su IRC , ho incontrato altri utenti Linux che hanno riscontrato questo stesso problema, quindi immagino che molti utenti ne siano preoccupati.
Per me questo non è accettabile poiché anche Windows gestisce meglio l'utilizzo di memoria elevata.
Se hai bisogno di maggiori informazioni, invia un suggerimento, per favore dimmelo.
Documentazione:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/
Ne parlano:
perché il killer di memoria di Linux (OOM) non viene eseguito automaticamente, ma funziona su sysrq-key?
Perché a volte OOM-killer non riesce a uccidere i maiali delle risorse?
Precaricamento di OOM Killer
È possibile attivare OOM-killer in caso di scambio forzato?
Come evitare la latenza elevata vicino alla situazione OOM?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843
min_free_kbytes
non è pertinente, non è una riserva per le pagine memorizzate nella cache. AFAICT nessuno dei sistemi VM consente di riservare memoria specificamente per le pagine memorizzate nella cache, vale a dire limitando le allocazioni MAP_ANONYMOUS :(.