Può.
Esistono due diverse condizioni di memoria insufficiente che è possibile riscontrare in Linux. Che incontri dipende dal valore di sysctl vm.overcommit_memory
( /proc/sys/vm/overcommit_memory
)
Introduzione:
il kernel può eseguire quello che viene chiamato 'overcommit di memoria'. Questo è quando il kernel assegna ai programmi più memoria di quanta ne sia realmente presente nel sistema. Questo viene fatto nella speranza che i programmi non utilizzino effettivamente tutta la memoria che hanno allocato, poiché si tratta di un evento abbastanza comune.
overcommit_memory = 2
Quando overcommit_memory
è impostato su 2
, il kernel non esegue alcun overcommit. Invece quando un programma è allocato in memoria, è garantito l'accesso per avere quella memoria. Se il sistema non ha abbastanza memoria libera per soddisfare una richiesta di allocazione, il kernel restituirà semplicemente un errore per la richiesta. Spetta al programma gestire con garbo la situazione. Se non verifica che l'allocazione abbia avuto esito positivo quando ha avuto esito negativo, l'applicazione riscontrerà spesso un segfault.
Nel caso del segfault, dovresti trovare una linea come questa nell'output di dmesg
:
[1962.987529] myapp[3303]: segfault at 0 ip 00400559 sp 5bc7b1b0 error 6 in myapp[400000+1000]
Ciò at 0
significa che l'applicazione ha tentato di accedere a un puntatore non inizializzato, che può essere il risultato di una chiamata di allocazione della memoria non riuscita (ma non è l'unico modo).
overcommit_memory = 0 e 1
Quando overcommit_memory
è impostato su 0
o 1
, l'overcommit è abilitato e ai programmi è consentito allocare più memoria di quella realmente disponibile.
Tuttavia, quando un programma vuole usare la memoria che è stata allocata, ma il kernel scopre che in realtà non ha memoria sufficiente per soddisfarla, deve recuperare un po 'di memoria. Tenta innanzitutto di eseguire varie attività di pulizia della memoria, come svuotare le cache, ma se ciò non bastasse, termina un processo. Questa terminazione viene eseguita da OOM-Killer. OOM-Killer guarda il sistema per vedere quali programmi utilizzano quale memoria, da quanto tempo sono in esecuzione, chi li sta eseguendo e una serie di altri fattori per determinare quale viene ucciso.
Dopo che il processo è stato terminato, la memoria che stava usando viene liberata e il programma che ha causato la condizione di memoria insufficiente ora ha la memoria di cui ha bisogno.
Tuttavia, anche in questa modalità, è ancora possibile rifiutare le richieste di allocazione ai programmi. Quando overcommit_memory
è 0
, il kernel prova a indovinare quando dovrebbe iniziare a negare le richieste di allocazione. Quando è impostato su 1
, non sono sicuro di quale determinazione usi per determinare quando deve rifiutare una richiesta ma può rifiutare richieste molto grandi.
Puoi vedere se OOM-Killer è coinvolto guardando l'output di dmesg
e trovando un messaggio come:
[11686.043641] Out of memory: Kill process 2603 (flasherav) score 761 or sacrifice child
[11686.043647] Killed process 2603 (flasherav) total-vm:1498536kB, anon-rss:721784kB, file-rss:4228kB