Che cos'è Swappiness su Linux? (e come cambiarlo)

Stick di memoria ad accesso casuale (RAM) per un computer.
Subin-ch / Shutterstock.com

Il valore di scambio di Linux non ha nulla a che fare con la quantità di RAM utilizzata prima dell'inizio dello scambio. Questo è un errore ampiamente segnalato e ampiamente creduto. Spieghiamo cos'è veramente.

Busting Myths About Swapiness

Lo scambio è una tecnica in cui i dati nella RAM (Random Access Memory) vengono scritti in una posizione speciale sul disco rigido (una partizione di swap o un file di swap) per liberare la RAM.

Linux ha un'impostazione chiamata valore di swapiness. C'è molta confusione su ciò che controlla questa impostazione. La descrizione errata più comune di swappiness è che imposta una soglia per l'utilizzo della RAM e quando la quantità di RAM utilizzata raggiunge tale soglia, inizia lo scambio.

Questo è un malinteso che è stato ripetuto così spesso che ora riceve la saggezza. Se (quasi) tutti gli altri ti dicono che è esattamente come funziona la swappiness, perché dovresti crederci quando diciamo che non lo è?

Semplice. Lo dimostreremo.

La tua RAM è suddivisa in zone

Linux non pensa alla tua RAM come a un grande pool omogeneo di memoria. Considera che sia diviso in un numero di diverse regioni chiamate zone. Quali zone sono presenti sul tuo computer dipende dal fatto che sia a 32 o 64 bit. Ecco una descrizione semplificata delle possibili zone su un computer con architettura x86.

  • Accesso diretto alla memoria (DMA): Sono 16 MB di memoria insufficienti. La zona prende il nome perché, molto tempo fa, c'erano computer che potevano fare solo l'accesso diretto alla memoria in quest'area della memoria fisica.
  • Accesso diretto alla memoria 32: Nonostante il suo nome, Direct Memory Access 32 (DMA32) è una zona presente solo in Linux a 64 bit. Sono i 4 GB di memoria insufficienti. Linux in esecuzione su computer a 32 bit può fare DMA solo con questa quantità di RAM (a meno che non stiano usando il kernel di estensione dell'indirizzo fisico (PAE)), da cui la zona ha preso il nome. Sebbene, su computer a 32 bit, si chiama HighMem.
  • Normale: Sui computer a 64 bit, la memoria normale è tutta la RAM superiore a 4 GB (circa). Su macchine a 32 bit, ha una RAM compresa tra 16 MB e 896 MB.
  • HighMem: Esiste solo su computer Linux a 32 bit. È tutta RAM sopra 896 MB, inclusa la RAM sopra 4 GB su macchine sufficientemente grandi.

Il valore PAGESIZE

La RAM è allocata in pagine di dimensioni fisse. Tale dimensione è determinata dal kernel all'avvio rilevando l'architettura del computer. In genere la dimensione della pagina su un computer Linux è di 4 Kbyte.

Puoi vedere le dimensioni della tua pagina usando il getconf comando:

getconf PAGESIZE

getconf PAGESIZE

Le zone sono collegate ai nodi

Le zone sono collegate ai nodi. I nodi sono associati a una CPU (Central Processing Unit). Il kernel tenterà di allocare memoria per un processo in esecuzione su una CPU dal nodo associato a quella CPU.

Il concetto di nodi legati alle CPU consente l'installazione di tipi di memoria misti in computer multi-CPU specializzati, utilizzando l'architettura di accesso alla memoria non uniforme.

È tutto di altissimo livello. Il computer Linux medio avrà un singolo nodo, chiamato nodo zero. Tutte le zone apparterranno a quel nodo. Per vedere i nodi e le zone nel tuo computer, guarda all'interno di /proc/buddyinfo file. Useremo less fare così:

less /proc/buddyinfo

less / proc / buddyinfo in una finestra del terminale

Questo è l'output del computer a 64 bit su cui è stato studiato questo articolo:

Node 0, zone DMA   1  1  1  0  2  1  1  0  1  1  3
Node 0, zone DMA32 2 67 58 19  8  3  3  1  1  1 17

C'è un singolo nodo, nodo zero. Questo computer ha solo 2 GB di RAM, quindi non esiste una zona “normale”. Esistono solo due zone, DMA e DMA32.

Ogni colonna rappresenta il numero di pagine disponibili di una determinata dimensione. Ad esempio, per la zona DMA32, leggendo da sinistra:

  • 2: Ci sono 2 di 2 ^ (0* PAGESIZE) pezzi di memoria.
  • 67: Ci sono 67 di 2 ^ (1* PAGE_SIZE) pezzi di memoria.
  • 58: Ci sono 58 di 2 ^ (2* PAGESIZE) pezzi di memoria disponibili.
  • E così via, fino a …
  • 17: Ci sono 17 di 2 ^ (512* PAGESIZE) pezzi.

Ma davvero, l'unica ragione per cui stiamo guardando queste informazioni è vedere la relazione tra nodi e zone.

Pagine file e pagine anonime

La mappatura della memoria utilizza serie di voci della tabella delle pagine per registrare quali pagine di memoria vengono utilizzate e per cosa.

I mapping di memoria possono essere:

  • File di backup: I mapping supportati da file contengono dati che sono stati letti da un file. Può essere qualsiasi tipo di file. La cosa importante da notare è che se il sistema ha liberato questa memoria e aveva bisogno di ottenere nuovamente quei dati, possono essere letti nuovamente dal file. Tuttavia, se i dati sono stati modificati in memoria, tali modifiche dovranno essere scritte nel file sul disco rigido prima che la memoria possa essere liberata. Se ciò non accadesse, le modifiche andrebbero perse.
  • Anonimo: La memoria anonima è un'associazione di memoria senza file o dispositivo che la supporta. Queste pagine possono contenere la memoria richiesta al volo dai programmi per contenere i dati o per cose come lo stack e l'heap. Poiché non esiste alcun file dietro questo tipo di dati, è necessario riservare un posto speciale per la memorizzazione di dati anonimi. Quel posto è la partizione di swap o il file di swap. I dati anonimi vengono scritti per lo scambio prima che le pagine anonime vengano liberate.
  • Dispositivo supportato: I dispositivi vengono indirizzati attraverso i file dei dispositivi a blocchi che possono essere trattati come se fossero file. I dati possono essere letti da loro e scritti a loro. Una mappatura della memoria supportata da un dispositivo contiene dati da un dispositivo memorizzato al suo interno.
  • Condivisa: Più voci della tabella delle pagine possono essere associate alla stessa pagina di RAM. L'accesso alle posizioni di memoria tramite una qualsiasi delle mappature mostrerà gli stessi dati. Processi diversi possono comunicare tra loro in modo molto efficiente modificando i dati in queste posizioni di memoria controllate congiuntamente. I mapping scrivibili condivisi sono un mezzo comune per ottenere comunicazioni tra processi ad alte prestazioni.
  • Copia su scrittura: Copia su scrittura è una tecnica di allocazione lenta. Se viene richiesta una copia di una risorsa già in memoria, la richiesta viene soddisfatta restituendo un mapping alla risorsa originale. Se uno dei processi di “condivisione” della risorsa tenta di scrivere su di essa, la risorsa deve essere realmente replicata in memoria per consentire di apportare le modifiche alla nuova copia. Quindi l'allocazione della memoria avviene solo al primo comando di scrittura.

Per lo swapiness, dobbiamo preoccuparci solo dei primi due dell'elenco: pagine di file e pagine anonime.

swappiness

Ecco la descrizione dello swappiness dalla documentazione Linux su GitHub:

"This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60."

Sembra che lo swappiness aumenti o diminuisca l'intensità dello swap. È interessante notare che afferma che l'impostazione dello swappiness su zero non disattiva lo swap. Indica al kernel di non scambiare fino a quando non vengono soddisfatte determinate condizioni. Ma lo scambio può ancora verificarsi.

Scaviamo più a fondo. Ecco la definizione e il valore predefinito di vm_swappiness nel file di codice sorgente del kernel vmscan.c:

/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

Il valore di swapiness può variare da 0 a 100. Ancora una volta, il commento sembra certamente che il valore di swapiness abbia un impatto su quanto lo swap ha luogo, con una cifra più alta che porta a più swap.

Più avanti nel file del codice sorgente, possiamo vedere che una nuova variabile ha chiamato swappiness viene assegnato un valore che viene restituito dalla funzione mem_cgroup_swappiness(). Qualche ulteriore traccia attraverso il codice sorgente mostrerà che il valore restituito da questa funzione è vm_swappiness. Quindi ora, la variabile swappiness è impostato su uguale qualsiasi valore vm_swappiness era impostato su.

int swappiness = mem_cgroup_swappiness(memcg);

E un po 'più in basso nello stesso file di codice sorgente, vediamo questo:

/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/
anon_prio = swappiness;
file_prio = 200 - anon_prio;

Interessante. Sono derivati ​​due valori distinti swappiness. Il anon_prio e file_prio le variabili contengono questi valori. Quando uno aumenta, l'altro diminuisce e vice versa.

Il valore di swapiness di Linux in realtà imposta il rapporto fra Due valori.

Il rapporto aureo

Le pagine dei file contengono dati che possono essere facilmente recuperati se la memoria viene liberata. Linux può semplicemente leggere di nuovo il file. Come abbiamo visto, se i dati del file sono stati modificati nella RAM, tali modifiche devono essere scritte nel file prima di poter liberare la pagina del file. Ma, in entrambi i casi, la pagina del file nella RAM può essere ripopolata leggendo i dati dal file. Quindi perché preoccuparsi di aggiungere queste pagine alla partizione di swap o al file di swap? Se hai bisogno di quei dati di nuovo, potresti anche rileggerli dal file originale invece di una copia ridondante nello spazio di scambio. Quindi le pagine dei file non vengono archiviate in swap. Sono “archiviati” nel file originale.

Con pagine anonime, non esiste alcun file sottostante associato ai valori in memoria. I valori in quelle pagine sono stati raggiunti dinamicamente. Non puoi semplicemente rileggerli da un file. L'unico modo per recuperare i valori di memoria delle pagine anonime è archiviare i dati da qualche parte prima di liberare la memoria. Ed è ciò che vale lo scambio. Pagine anonime di cui dovrai fare nuovamente riferimento.

Si noti che per entrambe le pagine dei file e per le pagine anonime, liberare la memoria potrebbe richiedere una scrittura sul disco rigido. Se i dati della pagina del file o i dati della pagina anonima sono cambiati dall'ultima volta che sono stati scritti nel file o da scambiare, è necessaria una scrittura del file system. Per recuperare i dati richiederà una lettura del file system. Entrambi i tipi di recupero della pagina sono costosi. Cercare di ridurre l'input e l'output del disco rigido riducendo al minimo lo scambio di pagine anonime aumenta solo la quantità di input e output del disco rigido necessari per gestire le pagine dei file da scrivere e leggere sui file.

Come puoi vedere dall'ultimo frammento di codice, ci sono due variabili. Uno ha chiamato file_prio per “priorità file” e uno chiamato anon_prio per “priorità anonima”.

  • Il anon_prio La variabile è impostata sul valore di swapiness di Linux.
  • Il file_prio il valore è impostato su 200 meno il anon_prio valore.

Queste variabili contengono valori che funzionano in tandem. Se entrambi sono impostati su 100, sono uguali. Per qualsiasi altro valore, anon_prio diminuirà da 100 a 0 e file_prio aumenterà da 100 a 200. I due valori vengono inseriti in un algoritmo complicato che determina se il kernel Linux viene eseguito con una preferenza per il recupero (liberazione) di pagine di file o pagine anonime.

Puoi pensare file_prio come la volontà del sistema di liberare pagine di file e anon_prio come la volontà del sistema di liberare pagine anonime. Ciò che questi valori non fanno è impostare qualsiasi tipo di trigger o soglia per quando lo swap verrà utilizzato. Questo è deciso altrove.

Ma quando la memoria deve essere liberata, queste due variabili – e il loro rapporto – vengono prese in considerazione dagli algoritmi di recupero e di scambio per determinare quali tipi di pagina vengono considerati preferibilmente per liberare. E ciò determina se l'attività del disco rigido associata elaborerà i file per le pagine dei file o lo spazio di scambio per le pagine anonime.

Quando si interrompe effettivamente lo swap?

Abbiamo stabilito che il valore di swapiness di Linux imposta una preferenza per il tipo di pagine di memoria che verranno scansionate per una possibile rigenerazione. Va bene, ma qualcosa deve decidere quando lo swap verrà interrotto.

Ogni zona di memoria ha un contrassegno di livello elevato e un livello di livello basso. Questi sono valori derivati ​​dal sistema. Sono percentuali della RAM in ciascuna zona. Sono questi valori che vengono utilizzati come soglie del trigger di scambio.

Per verificare quali sono i tuoi segni di acqua alta e bassa, guarda dentro /proc/zoneinfo file con questo comando:

less /proc/zoneinfo

less / proc / zoneinfo in una finestra terminale

Ciascuna delle zone avrà un set di valori di memoria misurati in pagine. Ecco i valori per la zona DMA32 sulla macchina di prova. Il segno di livello basso è 13966 pagine e il segno di livello alto è 16759 pagine:

Valori del segno di impermeabilizzazione DMA32 in una finestra terminale

  • In normali condizioni di funzionamento, quando la memoria libera in una zona scende al di sotto del limite minimo della zona, l'algoritmo di scambio avvia la scansione delle pagine di memoria alla ricerca di memoria che può essere recuperata, tenendo conto dei valori relativi di anon_prio e file_prio.
  • Se il valore di scambio di Linux è impostato su zero, lo scambio si verifica quando il valore combinato delle pagine dei file e delle pagine libere è inferiore al limite massimo.

Quindi puoi vedere che non puoi usare il valore di swapiness di Linux per influenzare il comportamento dello swap rispetto all'utilizzo della RAM. Non funziona così.

Cosa dovrebbe essere impostato su Swapiness?

Ciò dipende dall'hardware, dal carico di lavoro, dal tipo di disco rigido e dal fatto che il computer sia un desktop o un server. Ovviamente, questa non sarà una taglia unica per tutti i tipi di impostazione.

E devi tenere presente che lo swap non è solo usato come meccanismo per liberare la RAM quando stai esaurendo lo spazio di memoria. Lo scambio è una parte importante di un sistema ben funzionante e senza di esso, la gestione della memoria sana diventa molto difficile da raggiungere per Linux.

La modifica del valore di swapiness di Linux ha un effetto immediato; non è necessario riavviare. Quindi puoi apportare piccole regolazioni e monitorare gli effetti. Idealmente, lo faresti per un periodo di giorni, con diversi tipi di attività sul tuo computer, per cercare di trovare l'impostazione più vicina a quella ideale che puoi.

Questi sono alcuni punti da considerare:

  • Cercare di “disabilitare lo scambio” impostando il valore di scambio di Linux su zero sposta semplicemente l'attività del disco rigido associata allo scambio sull'attività del disco rigido associata al file.
  • Se si dispone di dischi rigidi meccanici obsoleti, è possibile provare a ridurre il valore di swapiness di Linux per deviare dal recupero di pagine anonime e ridurre il churn della partizione di swap. Naturalmente, quando si abbassa un'impostazione, l'altra impostazione aumenta. Ridurre il churn di swap probabilmente aumenterà il churn del file system. Ma il tuo computer potrebbe essere più felice favorendo un metodo rispetto all'altro. Davvero, l'unico modo per saperlo con certezza è provare a vedere.
  • Per i server monouso, come i server di database, è possibile ottenere assistenza dai fornitori del software di database. Molto spesso, queste applicazioni hanno una propria cache di file appositamente progettata e routine di gestione della memoria su cui faresti meglio a fare affidamento. I fornitori di software possono suggerire un valore di swapiness di Linux in base alle specifiche della macchina e al carico di lavoro.
  • Per l'utente desktop medio con hardware relativamente recente? Lascialo così com'è.

Come impostare il valore di swappiness di Linux

Prima di modificare il valore di swapiness, devi sapere qual è il suo valore attuale. Se vuoi ridurlo un po ', la domanda è un po' meno di cosa? Puoi scoprirlo con questo comando:

cat /proc/sys/vm/swappiness

cat / proc / sys / vm / swappiness

Per configurare il valore di swapiness, utilizzare il sysctl comando:

sudo sysctl vm.swappiness=45

sudo sysctl vm.swappiness = 45 in una finestra terminale

Il nuovo valore viene utilizzato immediatamente, non è necessario riavviare.

In effetti, se si riavvia, il valore di swap tornerà al suo valore predefinito di 60. Al termine della sperimentazione e dopo aver deciso il nuovo valore che si desidera utilizzare, è possibile renderlo persistente in tutti i riavvii aggiungendolo al /etc/sysctl.conf file. Puoi usare qualunque editor tu preferisca. Utilizzare il comando seguente per modificare il file con nano Editor:

sudo nano /etc/sysctl.conf

sudo nano /etc/sysctl.conf in una finestra del terminale

quando nano si apre, scorrere fino alla fine del file e aggiungere questa riga. Stiamo usando 35 come valore di swapiness permanente. È necessario sostituire il valore che si desidera utilizzare.

vm.swappiness=35

Il file /etc/sysctl.conf nell'editor nano in una finestra del terminale

Per salvare le modifiche e uscire da nano, premi “Ctrl + O”, premi “Invio” e premi “Ctrl + Z”.

La gestione della memoria è complessa

La gestione della memoria è complicata. Ed è per questo che, per l'utente medio, di solito è meglio lasciarlo al kernel.

È facile pensare di utilizzare più RAM di te. Utilità come top e free può dare l'impressione sbagliata. Linux utilizzerà la RAM libera per una varietà di propri scopi, come la memorizzazione nella cache del disco. Ciò eleva artificialmente la figura di memoria “usata” e riduce la figura di memoria “libera”. In realtà, la RAM utilizzata come cache del disco è contrassegnata come “utilizzata” e “disponibile” perché può essere recuperata in qualsiasi momento, molto rapidamente.

A chi non lo sapesse che potrebbe sembrare che lo swap non funzioni o che il valore di swapiness debba essere modificato.

Come sempre, il diavolo è nei dettagli. O, in questo caso, il demone. Il demone di scambio del kernel.

Articoli correlati

Ultimi articoli