Rilascio di spazio di swap


10

A volte il kernel sembra intenzionato a mantenere ad esempio firefox in swap, anche se c'è abbastanza memoria fisica disponibile e sto usando firefox:

robert@rm:~> free -m
             total       used       free     shared    buffers     cached
Mem:          3009       1904       1104          0        109        679
-/+ buffers/cache:       1116       1892
Swap:         4102        885       3216

Esiste un comando per indicare al kernel di eliminare lo spazio di swap e utilizzare la memoria disponibile disponibile?


Aggiornamento : anche se a breve termine ho usato swapon / swapoff, ora ho impostato

sudo sysctl vm.swappiness=30

come suggerito in un'altra risposta, e ottenere risultati molto buoni.

Risposte:


2

Potresti fare unswapoff - avrai bisogno dei privilegi di root,
ma, immagino che non sia un problema per te.


15

Potresti fare ciò che Nik ha suggerito e usare swapoff . Tuttavia, esiste un altro modo più elegante per modificare la "swappiness", o quanto aggressivamente il kernel scambia i programmi su disco nei sistemi che eseguono i kernel 2.6.

Ci sono stati accesi dibattiti sulle mailing list del kernel linux sulla politica che il kernel dovrebbe seguire riguardo al comportamento di scambio . Il risultato è che ora abbiamo una patch nei kernel 2.6 che ci consente di modificare questo comportamento in larga misura.

Tieni presente che hai bisogno dei privilegi di root per farlo, come faresti per eseguire i comandi swapoff / swapon.

Il valore corrente di "swappiness" può essere verificato nel file / proc / sys / vm / swappiness o eseguendo questo comando sysctl :

sudo sysctl vm.swappiness

I valori di "scambio" possono variare da 0 (nessuno scambio) a 100 (scambio il più possibile sul disco ). Ubuntu viene fornito con lo swappiness predefinito impostato su 60.

Per cambiarlo per una sessione, chiama di nuovo sysctl e passagli un valore di swapiness da usare:

sudo sysctl vm.swappiness=30

Oltre gratuitamente , puoi ovviamente monitorare gli effetti di ciò tramite le eccellenti utility htop o iotop .

Se ti piace quello che vedi e vuoi conservare questo valore durante i riavvii, inserisci "vm.swappiness = 30" nel file /etc/sysctl.conf .

$ sudo sysctl vm.swappiness
vm.swappiness = 30
$ sudo sysctl vm.swappiness=40
vm.swappiness = 40
$ sudo sysctl vm.swappiness
vm.swappiness = 40
$ sudo tail /etc/sysctl.conf 
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv6.conf.all.accept_source_route = 0
#
# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1
#
# The contents of /proc/<pid>/maps and smaps files are only visible to 
# readers that are allowed to ptrace() the process
# kernel.maps_protect = 1
vm.swappiness=30

Puoi giocare con valori diversi fino a quando non ne trovi uno che comporta un livello accettabile di scambio sul tuo computer.


+1 per sysctl. Quando si sperimentano diversi valori di swappiness, è possibile scrivere direttamente nel file proc (echo "30"> / proc / sys / vm / swappiness). Questa modifica è temporanea e non scriverà in /etc/sysctl.conf. Quando sei soddisfatto delle impostazioni, utilizza sysctl per apportare una modifica "permanente".
Shawn Chin,

6

Ricorda che le cose in scambio sono state messe lì in un momento più affollato di adesso.

È possibile che i dati si trovino anche nella RAM, essendo stati ricaricati per l'uso ma non cancellati dallo swap. Il kernel lo fa per risparmiare tempo nel prossimo periodo di occupato - se i dati sono già stati copiati lì, può semplicemente rilasciare la RAM che sta usando invece di dover fare prima le scritture su disco. Quindi, a meno che tu non sappia che la macchina non avrà bisogno di scambiare di nuovo nel prossimo futuro, forzare la liberazione dello spazio di scambio potrebbe non ottenere nulla se non rallentare un po 'di più la prossima volta che è necessario lo scambio.

Questo viene gestito su base di eliminazione in scrittura, quindi se la copia nella RAM viene aggiornata i blocchi in swap verranno rilasciati.

Se lo spazio di swap è necessario per qualcos'altro, che non sarà al momento in quanto ne hai molto libero, sarà ovviamente rilasciato per quell'uso.

Non è possibile visualizzare la quantità di dati in questo stato (di essere sia nelle pagine basate su disco nelle aree di scambio, sia nella RAM) nell'output da free. Puoi vederlo tramite il /procfile system speciale però. Guarda l'output di cat /proc/meminfoper il SwapCachedconteggio.

Altre due ragioni per cui ci sono swap in uso quando c'è apparentemente memoria libera sono

  • quando sotto carico di I / O pesanti il ​​kernel ha deciso che le pagine che non sono state usate per secoli sono meglio scambiate in modo da poter usare la RAM per cache / buffer, anche se guardando il tuo freeoutput probabilmente non è il caso qui come te hanno un pezzo di RAM veramente non allocata e quella utilizzata dalla cache / buffer IO.
  • le pagine sono state scambiate per qualche motivo in precedenza, e da allora non sono più state necessarie - forse è la memoria in uso da un processo che è rimasto inattivo da qualche tempo. In questo caso il rilascio dello swap (quindi il caricamento delle pagine nella RAM) può migliorare il tempo di risposta di quel processo la prossima volta che è necessario fare qualcosa di diverso da sleep, ma se è inattivo da un po 'di tempo potrebbe non essere necessario in qualsiasi momento nel prossimo futuro comunque.

1
+1 per una spiegazione eccellente. Cordiali saluti, vmstat ti permette di vedere i dati / proc / meminfo attraverso non tutti.

1

Ricorda che freeè solo un'istantanea dell'utilizzo della memoria. Il risultato che stai vedendo potrebbe implicare che, ad un certo punto in passato, il sistema stava esaurendo la RAM, quindi materiale residente RAM sostituito. Da allora, la RAM è diventata gratuita ma il materiale su swap non è stato richiesto, quindi è ancora trattenuto su swap piuttosto che ingombrare la RAM. In tal caso, disattivare lo swap sarebbe una cattiva idea. Esistono processi che potrebbero richiedere una così grande quantità di RAM dall'ultima ricarica?

Inoltre, potresti voler verificare di non avere una limitazione sulla dimensione massima del residente impostata tramite ulimit (di solito in / etc / profile ma forse varia con le distribuzioni e può essere impostata per processo (ad esempio in uno script di avvio) ).

Infine, su Microsoft Windows ci sono segnalazioni di problemi specifici con Firefox che viene scambiato su disco, ad esempio quando ridotto a icona (ad es http://joeabiraad.com/mozilla-firefox/control-your-firefox-ram-usage/113 ). Non ne ho sentito parlare su sistemi GNU / Linux ma potrebbe valere la pena esplorarlo.


Grazie per la risposta. Il mio problema non è che lo swap viene utilizzato, ma che ora viene utilizzato per programmi attivi, ad esempio Firefox e Thunderbird, che sembrano lenti. Uno swapoff / swapon li ha fatti sentire di nuovo scattanti.
Robert Munteanu,
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.