Come disabilitare completamente lo swap?


30

Sto usando Debian Sid, disco rigido formattato con ext4, in esecuzione su Linux 3.1

Ricordo che nelle versioni precedenti di Linux (forse prima della 3.0), se esaurivo la memoria e lo scambio non è abilitato, i programmi di solito si bloccano. Questo è perfetto per il mio ambiente: navigazione web semplice senza operazioni critiche. Cioè, se mi imbatto in un sito Web errato che utilizza troppa memoria, si blocca senza rendere inutilizzabile il mio terminale.

Ma nella mia configurazione attuale, il computer si blocca con un throughput I / O violento in background. iotop rivela che kswapd0 è il colpevole, il che significa che è dovuto allo scambio. Dopo aver usato swapon -sper determinare eventuali swap abilitati, ho usato swapoff -aper disabilitare tutti gli swap e di swapon -snuovo per confermare che tutti gli swap erano disabilitati.

Quindi ho provato di nuovo a massimizzare l'utilizzo della memoria. Purtroppo, il comportamento che mi aspettavo non si è verificato. Al contrario, kswapd0 prova ripetutamente a scambiare la RAM e fallisce perché non c'è spazio di scambio. Poiché non si arrende mai, il mio computer è bloccato in un eterno blocco I / O pesante, dannoso per la salute del mio disco.

Sto facendo qualcosa di sbagliato nel tentativo di farlo swapoff -a? Perché il comportamento è diverso da quello che era (probabilmente prima della 3.0)?


Non ha davvero senso. Fare da swapoff -a , se ci fosse qualcosa nello swap, genererà un sacco di I / O (e può causare l'uccisione di processi se non c'è abbastanza RAM disponibile). Sei sicuro che non sia stata la swapoff -acausa della "tempesta" I / O?
Mat

1
Suppongo che sia sufficiente commentare la fstabriga sullo swap. Prova se il comportamento è lo stesso.
enzotib,

@Mat swapoff -adovrebbe disabilitare lo scambio in modo permanente, il che significa che dovrebbe rimanere disabilitato dopo il prossimo riavvio. L'ho confermato. Tuttavia, la "tempesta" I / O si verifica ancora durante la sessione dopo il successivo riavvio. Per la cronaca, la "tempesta" I / O non è avvenuta nel momento in cui l'ho fatto swapoff -aperché lo swap era 0 in quel momento.
Syockit,

9
@syockit: nonswapoff -a è permanente.
Mat

1
il caricamento del database è arrivato a circa il 15% in 14 ore. Disattivato lo swap e al tentativo successivo è arrivato al 40% in 4 ore. è vero che il server è sotto-alimentato e si basa su ram, ma senza swap attivato OpenSuSE funziona molto più velocemente per questo processo. L'opinione del sistema operativo "migliore" e la mia differiscono notevolmente durante un semplice caricamento mysql db. ha commentato l'unità di scambio in / etc / fstab e riavviato.
TheSatinKnight il

Risposte:


15

La disabilitazione dello swap non farà ciò che desideri. Otterrai comunque un throughput I / O violento, ma sarà di pagine pulite piuttosto che sporche.

Senza scambio, il sistema comprimerà la cache di pagine pulite (non modificate) quasi a zero, poiché quelle sono le uniche pagine che è possibile eliminare dalla memoria fisica. Può solo sfrattare pagine sporche (modificate) dalla memoria scrivendole per scambiare, senza scambio, non ha modo di sfrattare pagine sporche.

Man mano che la memoria fisica si esaurisce, ogni processo dovrà caricare le sue tabelle codici dal disco mentre elimina le tabelle codici precedenti. Il risultato sarà un thrashing violento e un lavoro eccessivo svolto dal sottosistema di scambio.

Questo è un caso speciale di un principio molto importante: per un sistema ben progettato, non è possibile farlo funzionare meglio riducendo le sue scelte. Linux è un sistema ben progettato. La rimozione dello swap offre solo un minor numero di scelte, quindi non sorprende che si comporti peggio.


1
Questo è vero solo se si alloca solo poca memoria. Un processo di fuga di solito tenterà di allocare molto di più, e quindi verrà ucciso in anticipo, liberando quella memoria, invece di continuare a scambiare il sistema fino alla morte cercando di accogliere più allocazioni, quindi disabilitare lo swap può essere utile quando massimizzi il tuo utilizzo di ram da un processo in fuga.
psusi,

1
Quasi sempre tutta la memoria verrà quasi sempre allocata. Linux è specificamente ottimizzato in questo modo. Esegui cat /proc/meminfosu qualsiasi tipico box Linux dopo alcune ore di carico.
David Schwartz,

2
@syockit Se si disabilita il paging, non è possibile eseguire alcun programma. Il paging è il meccanismo mediante il quale i file vengono letti quando mappati in memoria.
David Schwartz,

2
@psusi: le pagine pulite non saranno ridotte al minimo in caso di scambio. Sostituirà invece pagine sporche e anonime che non sono state utilizzate di recente. Ovviamente, in entrambi i casi, alla fine si verificherà un thrash violento se il set di lavoro supera la memoria fisica. Il punto è, con o senza scambio, che riceverai un sacco di colpi violenti prima di esaurire la memoria. La differenza è che, con lo swap, il thrashing violento verrà scambiato (pagine sporche, scrivere e leggere). Senza scambio, il thrashing violento comporterà errori di codice (pagine pulite, sola lettura).
David Schwartz,

2
@psusi: hai ragione se la preoccupazione è un processo in fuga che esplode rapidamente nel consumo di memoria. Ma non è di questo che parla l'OP, che è un processo che consuma memoria eccessiva, ma non illimitata o eccessivamente massiccia. Man mano che cresce attraverso l'ampio punto dolce (dove viene compressa la cache), crescerà sempre più lentamente man mano che il sistema si blocca.
David Schwartz,

13

Una soluzione migliore rispetto alla disattivazione dello swap, che nella migliore delle ipotesi causerà l'interruzione di processi casuali quando la memoria si esaurisce, consiste nell'impostare il limite del segmento di dati per processo per i processi che rimuovono le cose dalla rete. In questo modo un browser in fuga colpirà il limite e morirà, anziché rendere inutilizzabile l'intero sistema. Esempio, dalla shell

(ulimit -d 400000; firefox) &

Il numero dopo -d è in kilobyte. Dovresti provare questo sul tuo sistema per scegliere il valore migliore per le tue abitudini di navigazione. Le parentesi causano la creazione di una subshell; il comando ulimit influenza solo quella shell e i suoi figli, isolandone gli effetti dalla shell madre.


Funzionerà per il cromo, diciamo, dove abbiamo un sacco di chromiumprocessi che usano piccoli blocchi di memoria?
jberryman,

@jberryman No, i limiti di memoria sono per processo anziché per utente.
Kyle Jones,

C'è un modo per inviargli un segnale specificato (ad es. SIGHUP) quando raggiunge il limite di memoria?
Geremia,

1
@Geremia No. Le chiamate del sistema brk e sbrk smettono di funzionare, il che farà piegare e morire la maggior parte delle cose.
Kyle Jones,

Se si desidera procedere con l'ottimizzazione manuale, suggerirei di utilizzare il cgroup di memoria anziché ulimit perché con il cgroup di memoria è possibile impostare il limite per l'intero gruppo di processi e configurare il processo di allocazione della memoria da interrompere e il processo dei criteri in modalità utente può decidere cosa fare (ad esempio inviare alcuni segnali, selezionare il processo da eliminare, aumentare al volo il limite di memoria). Vedi kernel.org/doc/Documentation/cgroup-v1/memory.txt e kernel.org/doc/Documentation/cgroup-v2.txt per i dettagli.
Mikko Rantalainen,

4

Per assicurarti che lo swap non venga utilizzato, ti conviene evitare che qualsiasi swap venga aggiunto all'avvio. Questo può essere fatto, a seconda del sistema, disabilitando il swapservizio di avvio o semplicemente commentando la voce di scambio in /etc/fstab.

Per quanto riguarda il tuo hangup, la stop()funzione in /etc/init.d/swappotrebbe dare un indizio:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Notare la parte su deadlock . Puoi provare a fare umount -a -t tmpfste stesso prima di disattivare lo scambio.


Modificare:

Probabilmente, potresti anche raggiungere il tuo obiettivo modificando le sysctlimpostazioni (vedi questa domanda ).


Non ho swapin init.d, né ho su fstab, ma ho /etc/init.d/mountoverflowtmpche monta tmpfsper le scritture di registro di emergenza. Anche il demone di swap usa tmpfs?
Syockit,

Potresti averlo abilitato altrove, fallo grep -RF swap /etc/se desideri trovarlo. Ma per disabilitare un servizio, useresti un comando come service(IIRC; non uso Debian da solo).
rozcietrzewiacz,

1
Lo stesso swap non usa tmpfs , perché tmpfsè un filesystem in memoria (RAM). Ma altri servizi / programmi che usano tmpfspotrebbero fare affidamento sullo swap in un modo speciale. Non lo so davvero, ma potrebbe avere qualcosa a che fare con la memorizzazione nella cache o in un modo speciale in cui il tmpfsconducente dichiara l'accesso allo spazio di scambio.
rozcietrzewiacz,

C'è qualcosa su come Linux gestisce la memoria virtuale che non capisco. Ho disabilitato lo scambio nella maggior parte dei modi possibili: via swapoffe via vm.swappiness=0. Eppure kswapd0corre ancora! Mi chiedo se questa è una regressione dai 2,4 giorni ...
syockit,

5
@syockit È un comportamento previsto. Il sistema sta ancora scambiando pagine pulite (pagine che contengono copie dei dati dei file). Non richiede spazio di scambio per scambiare pagine pulite, poiché possono essere lette da fonti diverse dallo scambio.
David Schwartz,

2

È meglio commentare la voce della partizione di swap /etc/fstabpiuttosto che eseguirla swapoff -adopo ogni avvio.

Ho lo stesso problema con kswapd0 sul mio hardware.

L'ottimizzazione del vm.swappinessparametro di sistema non mi aiuta.

sysctl -w vm.swappiness=0

Ho cercato su Google e letto molti post, mailing list e ora penso che questo sia un bug del kernel.

Quando non c'è alcuna partizione di swap attiva e la memoria libera diventa inferiore a qualche soglia (circa 300 MB nel mio caso) il sistema non risponde a causa della follia di kswapd0.

Probabilmente è riprodotto con una configurazione e condizioni speciali.

Per qualcuno è risolto dalla reinstallazione del sistema con il partizionamento per gli altri creando kernel personalizzati con kswapd0disabilitato.


2
Se kswapd0impazzisce e non hai attivato lo swap, hai esaurito la RAM. Le tue scelte sono OOM Killer o kswapd0. Linux va avanti kswapd0perché il kernel presume che sia più importante finire lentamente che interrompere il processo. Per gli umani casuali, la soglia in cui il kernel pensa che avvengano ancora abbastanza progressi in avanti è già glacialmente lenta e quasi chiunque preferirebbe selezionare OOM Killer.
Mikko Rantalainen,

1

Sul mio sistema (debian sid 2016-11-15), ho fatto questo:

  1. disabilita subito lo swap:

    swapoff -a
    
  2. commentare la riga con la partizione di swap in / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. disabilitare il montaggio di swap in systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Sarebbe abbastanza. C'è riferimento allo scambio nel /etc/initramfs-tools/conf.d/resumefile. Non so quale sia lo scopo di questo. Forse questo file sarà un problema al prossimo riavvio (non provo ancora a riavviare, il mio tempo di attività è prezioso;)).


1

il computer si blocca con un throughput I / O violento in background. iotop rivela kswapd0 come colpevole

Ho trovato un modo (finora) per evitarlo. Se vuoi testarlo e vedere come funziona sul tuo sistema, vedi la patch del kernel all'interno di questa domanda . Fondamentalmente, non sfrutta le Active(file)pagine (almeno) quando è sotto pressione della memoria, quindi il thrashing del disco (lettura costante) è ridotto a quasi nulla e OOM-killer può essere attivato entro 1 secondo, invece di congelare il sistema operativo per quello che sembra come permanentemente (o almeno per molti minuti). Spero che i programmatori reali (di cui non sono) migliorino la patch e la trasformino in una soluzione reale, ora che vedono che ciò che fa funziona in queste situazioni.


questa patch del kernel è già stata mantenuta?
umanità e

@humanityANDpeace probabilmente no, perché non è così buono (poiché non sono un programmatore), tuttavia ho riscontrato qualche problema con esso, come ad esempio: a volte, a seconda del carico di lavoro, con questa patch, puoi esaurire la memoria in casi in cui senza questa patch non avresti e quindi OOM-killer ucciderà Xorg e xfwm4, A MENO CHE corro echo 1 | sudo tee /proc/sys/vm/drop_cachesquando Active(file):(di / proc / meminfo) è superiore a 2 GB (su un sistema RAM da 16G), può arrivare a un massimo di 4G
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.