Linux: come annullare esplicitamente tutto il possibile?


59

Ho lanciato qualcosa che ha richiesto molta memoria e ora tutto è molto indietro. Immagino che la memoria di tutte le applicazioni sia andata a scambiarsi per liberare spazio per il processo ad alta intensità di memoria, e ora tutto torna lentamente alla RAM quando vi si accede.

C'è un modo per spostare esplicitamente tutto il possibile dallo swap alla RAM? O forse non tutto, ma solo alcuni dati di processi particolari?

Risposte:


59

Consiglierei di consentire il normale scambio di controllo della memoria Linux nelle cose che sono effettivamente utilizzate, mentre vengono utilizzate.

L'unica cosa a cui riesco a pensare è di disattivare e riattivare lo swap

sudo swapoff -a
sudo swapon -a

Ciò presuppone che tu abbia abbastanza memoria fisica di riserva per contenere tutto in scambio ...


4
Funziona, molto lentamente però :) Grazie! Ma credo comunque che ci sia una soluzione più elegante :)
kolypto

7
Attento con questa soluzione, prenderà tutto dallo swap forzatamente ... se non si adatta alla memoria fisica, il kernel avvierà il micidiale assassino OOM. Non conosco alcun comando "prova a spostare tutto nella RAM, ma fallisci con grazia se non è possibile".
Juliano

1
L'ho provato e ho scoperto che funziona molto lentamente. Quindi è possibile monitorare la RAM libera e uccidere swapoffse la memoria si
esaurisce

2
Non sono sicuro che uccidere swapoff interromperà effettivamente l'operazione. Dipende da come è implementato.
Douglas Leeder,

3
Sembra che il comando swapoff faccia qualcosa come "non consentire lo scambio di nuove scritture" mentre qualsiasi altro processo in esecuzione (che stava / sta usando swap) può ancora "rilasciare swap". Questo potrebbe essere il motivo per cui sembra andare così lentamente. Non sembra causare OOM come ha detto un'altra persona (sto usando Ubuntu Bionic) - probabilmente sarebbe così solo se "processi aggiuntivi (o esistenti) iniziano a usare nuova memoria" (cioè OOM reali). Quindi tutto sommato lo swapoff / swapon sembra un'ottima soluzione. Gentle / costante. Ciò presuppone che non si avvia più memoria utilizzando i processi (o aumentando il consumo in quelli in esecuzione).
Roel Van de Paar,

13

Puoi sintonizzarlo facendo eco ad un numero compreso tra 0 e 100 in /proc/sys/vm/swappiness.

Questo controllo è usato per definire quanto aggressivo il kernel cambierà le pagine di memoria. Valori più alti aumentano la aggressività, valori più bassi diminuiscono la quantità di swap . Un valore pari a 0 indica al kernel di non avviare lo scambio fino a quando la quantità di pagine libere e supportate da file è inferiore al limite massimo in una zona.

Il valore predefinito è 60.


13
Non utilizzare / proc / sys direttamente, utilizzare sysctlinvece il comando. In questo caso, lo è sysctl vm.swappiness=x.
Juliano

7
Non credo che nemmeno uno swappiness causerà il trasferimento esplicito delle pagine nella memoria principale?
Douglas Leeder,

1
@Douglas ha ragione. vm.swappiness controllerà principalmente la decisione se spostare le cose da scambiare o ridurre la quantità di cache e buffer quando è richiesta memoria.
Juliano

@Juliano, perché non dovrebbe essere usato / proc / sys?
James,

@James Perché / proc / sys è l'interfaccia di livello inferiore utilizzata per modificare e interrogare la configurazione del kernel (è "dettaglio di implementazione"). Linux fornisce il sysctlcomando di livello superiore per l'interazione dell'utente. Il risultato finale è lo stesso, ma in genere le interfacce di livello superiore sono preferite per l'interazione diretta dell'utente. Un po 'come avviare il motore cortocircuitando i cavi di accensione (livello inferiore) invece di girare semplicemente la chiave (livello superiore).
Juliano,

5

Linux fa un ottimo lavoro nella gestione della memoria e non dovresti ostacolarti. L'impostazione vm.swappiness (menzionata in precedenza) non si frappone. È più probabile che tu abbia problemi strani a fare le cose in qualsiasi altro modo.

Cosa hai lanciato che era così affamato di memoria? Può essere sintonizzato? Se non ha le sue direttive sui limiti di memoria, puoi guardare anche ulimit.


Nel mio caso lo era convert -density 200 file.pdf jpegs/file.jpg. Per qualche ragione usa molta memoria, ma hai ragione: può essere sintonizzato. Ad ogni modo, la situazione è possibile con qualsiasi applicazione :)
kolypto

1
Sono d'accordo con questa risposta - dovresti probabilmente lasciare le normali operazioni sulla macchina per scambiare ciò che è effettivamente necessario.
Douglas Leeder,

convertha l' -limitargomento per controllare la sua memoria rispetto all'utilizzo del disco, e dovresti leggere su di essi. L'impostazione -limit memory 512MBo simile sarebbe buono. Probabilmente sarebbe anche utile specificare un MAGICK_TEMPORARY_PATH esplicito e ripulirlo dopo aver eseguito il comando.
slacy

3

Se hai la memoria disponibile per tutte le tue applicazioni, è ok impostare lo swappiness su 0 in modo che le cose non si scambino. Ad esempio, qemu-kvm è un obiettivo importante per il VMM da scambiare, perché "sembra" essere inattivo per la maggior parte del tempo. Ho visto che fino all'80% della memoria di una memoria qemu-kvm viene scritta per scambiare. Le macchine virtuali in esecuzione in qemu-kvm diventeranno quasi non rispondenti perché stanno esaurendo lo scambio (sebbene l'ospite non abbia idea che ciò stia accadendo). La VM ospite penserà che stia funzionando in modo eccellente, anche se in verità sta trascinando terribilmente. Quando un gruppo di VM si "sveglia" e inizia a fare le cose, può aumentare il carico medio fino a oltre 30, anche su hardware di livello enterprise con memoria e disco veloci. Immagino che questo sia un fallimento nel design immediato di qemu-kvm.

Spero che questo aiuti qualcuno.


Temo che questo non sia del tutto preciso.
Marc.2377,

2

Vorrei sconsigliare di provare a superare il sottosistema VM nel kernel. È ESTREMAMENTE improbabile che tu abbia effettivamente abbastanza informazioni per prendere decisioni migliori di quanto non faccia. E se lo costringi in qualche modo a fare la cosa sbagliata, finirai per rendere le cose ancora più lente.


9
Ci sono alcuni casi in cui voglio fare ciò che l'OP vuole. Se acconsento accidentalmente a un processo di eseguire una rivolta e occupare tutta la mia RAM + scambio, allora posso aspettare 15 secondi ogni volta che cambio applicazioni per far uscire la memoria dallo scambio o semplicemente forzarlo e far funzionare tutto più velocemente del solito.
Alex

Bene ... Voglio che il "unswap" accada durante la mia pausa caffè, non tutte le volte che provo a cambiare applicazione. È "superfluo il sottosistema VM" quando voglio informarlo di un'interruzione della pausa caffè?
Klaws,

1

Se riesci a riavviare il sistema che dovrebbe farlo (e potrebbe richiedere molto meno tempo rispetto a provare qualsiasi altra soluzione).


1

Per copiare parte della mia risposta da questa domanda .

In modo che tu sappia come funziona il parametro sintonizzabile della swappiness. Funziona dicendo al sottosistema VM di cercare pagine da scambiare quando la% di memoria mappata per elaborare le tabelle delle pagine + il valore di swapiness è> 100. Quindi un'impostazione di 60 farà iniziare il paging delle pagine obsolete dalla tabella delle pagine di processo quando utilizza più del 40% della memoria del sistema. Se si desidera consentire ai programmi di utilizzare più memoria a spese della cache, è necessario ridurre il valore di swapiness.


Non penso che il problema sia la memoria del programma rispetto alla cache - penso che sia la memoria dell'applicazione rispetto alla memoria inutilizzata. E non penso che la swappiness influirà su questo.
Douglas Leeder,

0

Il processo è ancora in esecuzione? Apri un terminale e vedi se riesci a individuare i processi che sono stati avviati. (ps aux | grep nome processo potrebbe renderlo un po 'più semplice) Usa kill -9 PID per eliminarli se sono ancora in esecuzione. Fai attenzione a ciò che uccidi. Se non sai qual è il processo, non ucciderlo! Inoltre, pubblica l'output di free -m in modo che possiamo vedere se stai ancora utilizzando molto swap.

Se le cose continuano a funzionare lentamente, potresti avere ancora tutto ciò che hai avviato. Non disattivarei mai lo scambio se non sai davvero cosa stai facendo o non ti piace vivere al limite. =)


0

Credo che non ci sia davvero un buon modo per forzare i dati Linux di swap dal disco alla memoria. Quando swapoff / swapon è una soluzione funzionante, ma è sporca e può facilmente rendere instabile il sistema. Per i casi in cui si hanno più dati nello swap della memoria libera, sarà difficile immaginare qualsiasi politica efficiente che Linux possa impiegare per decidere quali pezzi di dati si spostano in memoria e quali pezzi mantengono sul disco.

Riepilogo: lascia che Linux ripristini gradualmente le sue prestazioni in modo normale. Il suo sottosistema VM è organizzato in modo tale da sforzarsi e spostarsi costantemente verso uno stato bilanciato ideale.


-2

Svuotare la cache dei buffer

Se mai vuoi svuotarli puoi usare questa catena di comandi.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

È possibile segnalare al kernel Linux di eliminare vari aspetti degli elementi memorizzati nella cache modificando l'argomento numerico con il comando precedente.

NOTA: ripulire la memoria di cose inutili (kernel 2.6.16 o più recente). Assicurati sempre di eseguire prima la sincronizzazione per scaricare le cose utili sul disco !!!

  • Per liberare pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • Per liberare dentisti e inode:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • Per liberare pagecache, dentries e inode:

    $ echo 3 > /proc/sys/vm/drop_caches
    

Quanto sopra è pensato per essere eseguito come root. Se stai provando a farli usando sudo, dovrai cambiare leggermente la sintassi in qualcosa del genere:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
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.