È una cattiva idea creare uno script cron che svuota lo scambio ogni ora?


26

Per anni ho avuto lo stesso problema con le mie piccole configurazioni di Ubuntu: lo spazio di swap usato aumenta con il tempo. Ho l'impressione che ciò sia dovuto principalmente al fatto che la memoria allocata non ritorna mai nella RAM anche se vi è spazio sufficiente, tranne nel caso di un'azione dell'utente come la disabilitazione dello scambio.

Ho fatto un breve croncomando per automatizzare questo, e ho buoni risultati:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Ma poiché è più un trucco che una vera soluzione a questo problema, mi chiedo quali siano le ragioni potenziali per cui potrebbe essere una cattiva idea o come potrei migliorare questo script per renderlo un po 'più intelligente?


29
Perdonate la mia ignoranza, ma cosa intendete esattamente dicendo che lo spazio SWAP cresce con il tempo e lo svuotamento nella RAM della memoria allocata ? Normalmente allochi un po 'di spazio come swap al sistema e non ne ascolti mai più. A chi importa quanta parte dello swap è effettivamente presa? Qual è il problema?
dessert

5
Perché vuoi farlo? Perché ritieni che l'utilizzo dello swap sia negativo? Di quale utilizzo di swap stiamo parlando?
marzo

25
Sono un po 'perplesso. Continui a parlare di un "problema" ma in realtà non descrivi effetti negativi di alcun tipo. Perché lo consideri un problema?
David Schwartz,

17
Se qualcosa viene scambiato e rimane lì, è perché nulla lo sta usando. E se nulla lo utilizza, è meglio lasciare che la RAM venga utilizzata per qualcosa a cui si accede, come la cache, piuttosto che scambiare nuovamente i dati.
hobbs

12
In che modo è meglio che lasciare semplicemente lo swap?
user253751

Risposte:


51

Usandolo così: sì, male. È necessario verificare se è disponibile memoria sufficiente prima di disattivare lo scambio. Consulta /ubuntu//a/90399/15811 per una versione migliore.

Inoltre: ne sei sicuro? Lo swap assegnato non significa che lo swap venga utilizzato. Il comando vmstat, colonne si(scambia dentro) e so(scambia fuori). Se quelli rimangono 0 hai un altro problema. Nella mia esperienza, lo swap è poco utilizzato e potresti non utilizzarlo pensando che non lo svuota ma non c'è nulla da svuotare.


3
Aspetta cosa? Se non c'è abbastanza memoria perché lo swapoff abbia successo, lo swapoff viene ucciso per primo dal killer OOM. Sì, lo hanno effettivamente codificato (verifica tramite chiamata di sistema).
Giosuè,

@Joshua certo ma vuole che funzioni automaticamente. Non errore.
Rinzwind,

4
Per elaborare senza andare a scrivere la mia risposta, l'utilizzo di swap che cresce nel tempo non è affatto una cosa negativa . Ciò significa che il kernel sta lentamente scoprendo quale spazzatura che consuma memoria non viene mai utilizzata e lo sposta per scambiare in modo che la memoria possa essere utilizzata per cose che ti aiutano effettivamente (come essere in grado di mantenere più dati fs memorizzati nella cache in modo non deve continuare a scartarlo e rileggerlo dal disco).
R ..

@Rinzwind cron funziona bene con i lavori che sbagliano e neanche lo script collegato lo usa vmstat.
jpaugh l'

41

Direi che è una cattiva idea. Se ritieni di avere memoria libera e che un processo attivo non venga spostato dallo swap alla RAM, allora o non hai tanta memoria libera come pensi di fare o il processo non è attivo come pensi è.

Se un processo attivo continua a essere scambiato, dovresti correggere qualsiasi cosa stia causando pressione sulla memoria. Se non è un processo attivo, qual è il grosso problema?


1
+1: qual è il grosso problema? Non cambiare mai un sistema in esecuzione , non penso che si debba fare casini con le funzioni principali del sistema in quel modo, soprattutto non senza alcuna necessità.
dessert,

3
A volte ho problemi in cui uccido un processo con una perdita di memoria (che ha costretto tutti gli altri a scambiarsi), lasciandomi con ~ 10% di RAM utilizzata ... ma tutti i programmi in esecuzione sono in scambio fino a quando non accedo nuovamente a loro. Quindi ogni volta che tocchi qualcosa, c'è un ritardo di due secondi. Vedo da dove proviene l'OP, e sarebbe bello che fosse fatto automaticamente, ma non è questo il modo giusto.
Someone Somewhere

1
@SomeoneSomewhere Ma non è così che funziona, comunque. Se il processo perde memoria, per definizione non utilizza attivamente quella memoria (non la legge e non la scrive); lo ha appena assegnato, per caso. Se ci sono altri processi attivi in ​​giro, la memoria trapelata verrà sostituita e sarà lo swap ad essere pieno di immondizia, non la RAM fisica.
David Richerby,

@DavidRicherby Se hai un programma aperto in background, quel programma è ancora meno attivo della perdita di memoria - e quando vai a tornare ad esso, deve uscire dallo scambio.
Qualcuno da qualche parte il

@SomeoneSomewhere Sembra che tu abbia frainteso il funzionamento del sistema di memoria. Non è necessario disporre di un intero processo nella RAM fisica: lo swap è gestito alla granularità delle singole pagine. Qualsiasi pagina che non è stata utilizzata per un po 'può essere sostituita, e una pagina che è interamente costituita da memoria trapelata non verrà mai più utilizzata, quindi non verrà più sostituita dopo essere stata sostituita.
David Richerby,

34

È una cattiva idea.

Il kernel inizia a copiare (non spostare) i dati per scambiarli molto prima che la memoria fisica sia quasi piena, perché se un processo richiede molta memoria, qualsiasi pagina che ha già una copia valida in scambio può essere riutilizzata immediatamente senza richiedere un'altra scrittura su disco.

Generalmente ciò accade principalmente per le pagine a cui non si è avuto accesso da molto tempo, il che è un buon indicatore del fatto che è improbabile che possano accedervi presto.

Se si eliminano esplicitamente le copie, ciò non porta alcun vantaggio, poiché i dati esistono ancora nella RAM, ma possono costare la velocità quando un processo vuole allocare molta memoria e lo scambio diventa necessario.

Il kernel userà sempre anche lo spazio di swap non appena la memoria fisica sarà piena al di sopra del 50%, quindi questi numeri saranno diversi da zero anche se hai abbastanza memoria installata.


4
sempre : penso che tu stia supponendo che /proc/sys/vm/swappinesssia lasciato al suo valore predefinito di 70, che è buono per i server e le pagine in modo abbastanza aggressivo escono pagine sporche da processi che non li hanno toccati per un po 'per fare spazio a più pagecache. Questo è spesso negativo per i desktop perché alt-tab può rallentare.
Peter Cordes,

@PeterCordes, se le pagine sono state effettivamente sfrattate, le cache hanno visto più accessi rispetto alle pagine dell'applicazione in questione, quindi c'è stato un netto vantaggio nell'utilizzarle come cache del disco. Vedo come le prestazioni di Alt-Tab sono più visibili all'utente rispetto ad esempio al tempo di compilazione per un grande progetto, ma trovo difficile formulare una politica che garantisca una risposta immediata senza sacrificare troppo le prestazioni.
Simon Richter,

1
In altre parole: il kernel è ottimizzato per throughput ( swappiness=70), ma la latenza è più importante per l'esperienza utente su un desktop. È un compromesso. Se compili routinariamente roba leggermente troppo grande per rimanere nella pagecache, sicuramente lascia swappinessun po 'più in alto, come 20 o 30 invece di 5 o 10. Vedi anche akitaonrails.com/2017/01/17/optimizing-linux-for -slow-computer . Vedere vm.vfs_cache_pressuremeno di 100 favorisce anche la memorizzazione nella cache di metadati inode / directory su pagine di dati, il che è utile anche per la reattività dell'interfaccia utente.
Peter Cordes,

1
Altri parametri sintonizzabili: soglie di riscrittura lonesysadmin.net/2013/12/22/… . Questi controllano la velocità con cui Linux inizia a scrivere su disco dopo che qualcosa ha scritto sui file e quante pagine sporche sono consentite. (ovvero quanta memoria può essere spesa per scrivere nella cache)
Peter Cordes,

21

Questa è una cattiva idea. Se ciò fosse utile, il kernel Linux lo implementerebbe in questo modo. Non credo che ci sia un motivo per cambiare più di alcuni parametri di ottimizzazione, poiché un semplice script di shell molto probabilmente non è più intelligente degli algoritmi degli sviluppatori del kernel.

Fondamentalmente hai due casi:

  • I processi nello spazio di swap non vengono comunque utilizzati. Perché vuoi riportarli nella RAM?
  • C'è poca RAM, quindi vengono scambiati e li si ritira nella RAM. Quindi il tuo sistema li metterà nuovamente in scambio il prima possibile.

Quindi ci sono due punti principali:

  1. Innanzitutto, il sistema sarà lento quando la RAM è insufficiente per eseguire contemporaneamente tutti i programmi. Swap ti aiuterà a eseguire più programmi, ma non a passare rapidamente a uno usato raramente, che può essere sostituito. Nessuno scambio può far uccidere quello usato raramente o inviare a quello usato un'eccezione di memoria insufficiente.
  2. In secondo luogo, lo scambio è una buona cosa, così come lo sono anche gli oggetti in scambio, poiché hai RAM libera al costo dei programmi che attualmente non stai utilizzando comunque.

Nonostante non si verifichino problemi di memoria insufficiente con troppi programmi, alcuni programmi potrebbero allocare memoria in base alla RAM attualmente libera (forse il tuo browser utilizzerà più memcache e potrai navigare più velocemente) e il kernel può usare RAM libera per la memorizzazione nella cache del disco e ottimizzazioni simili. Quando imponi che lo swap sia vuoto, il kernel rilascerà la sua cache di lettura e, ad esempio, l'avvio di una nuova istanza di Firefox richiederà più tempo rispetto a quando Firefox è ancora nella cache del disco.

Se si desidera ottimizzare il comportamento del kernel, consultare il parametro swappiness .

Due risorse aggiuntive contribuiscono con @ peter-cordes:

Se vuoi davvero avere uno scambio vuoto, puoi disattivare lo scambio in modo permanente. Non vedo perché averlo acceso per un'ora e poi svuotarlo ha dei vantaggi rispetto al non avere swap.


1
Vedi anche akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computer e lonesysadmin.net/2013/12/22/… per ulteriori suggerimenti / dettagli sulla messa a punto.
Peter Cordes,

5

Puoi ottenere gli stessi risultati dicendo al kernel di liberare le cache:

echo 3 > /proc/sys/vm/drop_caches

In questo modo si evita il breve momento della possibile fame di memoria e si lascia al kernel la decisione di cosa è necessario e cosa può essere scartato.


0

Contrariamente all'idea comune, SWAP in sé non è male .
Ciò che effettivamente rallenta il sistema è l'attività del kernel che sposta i dati dalla RAM allo SWAP e di nuovo nella RAM, il swappiness.
Il sistema lo fa automaticamente come è configurato con swappiness.
Questo fa sì che la memoria dei processi inattivi venga scaricata nella partizione di scambio del disco rigido.
Io stesso ho lavorato per anni con una macchina che non aveva così tanta memoria RAM e ho sempre avuto un po 'di memoria SWAP utilizzata. Tuttavia la mia macchina ha funzionato bene fino a quando non si inizia a spostare nuovamente la memoria nella RAM, forse tentando di chiudere un'applicazione aperta. Quindi il carico di lavoro ha iniziato ad aumentare.

  • Quindi, pulendo costantemente la memoria SWAP, il carico di lavoro sulla macchina aumenterà considerevolmente.
  • L'esecuzione di applicazioni che hanno la loro memoria sulla partizione SWAP può corromperne l'esecuzione.

Piuttosto, ti suggerirei di studiare da vicino quale applicazione utilizza la tua memoria sulla riga di comando con l' htopapplicazione e decidere di chiudere alcune Applicazioni. La gnome-system-monitorsi può dare buona intuizione pure, nel suo processo-Tab.
Se hai grandi applicazioni che usano molta RAM. Non eseguirli tutti in una volta.

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.