Fuori dallo scambio - cosa succede?


8

Sulla mia macchina Debian VM con 512 MB di RAM e 348 MB di scambio, cosa accadrà se apro un file da 1 GB in un editor e esaurisco la memoria?

Arresta in crash il sistema? O in caso contrario, come gestirà Linux?

Non sarebbe saggio installare Swapspace quindi se necessario ci sarà abbastanza swap creato automaticamente e dinamicamente?

sudo apt-get install swapspace

Perché non gli dai più Swap?
Guntbert,

Lo spazio su disco
fisso

1
Nota che alcuni editor semplicemente mappano il file e non lo caricano completamente in anticipo, questo risolve completamente il problema mentre usano il file sorgente stesso come 'swap'.
Valità

Risposte:


17

Dipende dalle impostazioni con cui stai eseguendo, in particolare dal sovraccarico di memoria ( /proc/sys/vm/overcommit_memory; vedi man 5 procper i dettagli).

Se l'overcommit di memoria è disabilitato, il tentativo dell'editor (e possibilmente altri programmi che tentano contemporaneamente) di allocare memoria non riuscirà. Otterranno un risultato di errore dalla chiamata di sistema. Spetta a ciascun programma gestirlo, sebbene sfortunatamente un risultato comune sia il crash del programma. L'editor può anche, ad esempio, rifiutare di aprire il file.

Se l'overcommit di memoria è abilitato, la chiamata di sistema che richiede memoria potrebbe avere esito positivo. In tal caso, quando si accede effettivamente alla memoria, il kernel noterà che è esaurito e uccide un processo per recuperare la memoria. Tale processo può essere o meno l'editor. La scelta è regolata dal oom_score(risultato di diverse euristiche del kernel) e oom_score_adj(configurato) di ogni processo sul sistema. Quelli sono anche in quella manpage proc (5).


5

C'è un grosso problema in Linux in questo caso se ti avvicini alla condizione di memoria insufficiente: noterai che l'intero sistema non risponde completamente perché inizia a scambiare molto. Anche il cursore del mouse potrebbe diventare così "lento" che non è possibile avviare un terminale e interrompere manualmente un processo di divoratore di memoria offensivo. Ciò è dovuto all'enorme numero di operazioni su disco.

Per evitare questa situazione, di solito disabilito completamente lo swap, quindi il kernel Linux è sempre reattivo e nel peggiore dei casi il killer di memoria esaurita (OOM) ucciderà alcuni processi. La logica di quale processo viene interrotto da OOM dipende dalla versione del kernel.

Quindi la risposta è no: non abilitare l'allocazione di scambio dinamico. Dovrai affrontare blocchi della macchina.

È facile provarlo con un programma che alloca costantemente un po 'di memoria in un ciclo. Salva l'applicazione su un file di testo, memeater.c:

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Quindi compilarlo:

$ gcc memeater.c -o memeater

e corri:

$ ./memeater

Provalo con swap, senza swap e con l'allocazione di swap dinamico.

Inoltre, tieni presente che nella maggior parte dei casi questa condizione OOM si verifica perché un bug nel software (perdita di memoria) o hai fatto qualcosa di sbagliato come 'caricare questo file da 10 GB nell'editor' o 'eseguire troppi ridimensionamenti di file grafici in parallelo' e fare la conclusione: hai bisogno di scambiare o no?


1
+1 per aver suggerito il semplice metodo per
testarlo

1
Risponde alla seconda domanda "è una buona idea utilizzare l'allocazione di scambio dinamico".
gena2x,

@ gena2x Sì, è un'ottima idea, perché rende il tuo sistema più reattivo in situazioni di sovraccarico, invece di uccidere i tuoi compiti uno dopo l'altro. -1. Sebbene sia il migliore se si dispone di una grande partizione di swap fissa, ma ha un'altra causa (ridotta frammentazione dello swap).
Peter - Ripristina Monica il

Se hai un grande scambio fisso, il tuo sistema non risponderà perché proverebbe a scambiare le attività attive su disco e loro le scambieranno per sempre.
gena2x,
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.