Cosa controlla realmente il parametro vm.swappiness?


37

Secondo la documentazione del kernel:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

Tuttavia, questo è piuttosto vago. Sto cercando di capire esattamente cosa controlla il parametro alla fine. So che regola quanto aggressivamente il kernel cerca di scambiare pagine, ma quale processo decisionale nel codice del kernel influenza?

Regola da quanto tempo è necessario accedere a una pagina prima che il kernel la cambi? In tal caso, cosa rappresenta il valore predefinito di 60? E quanto viene modificato da un incremento / decremento di 1 (una formula sarebbe utile)?
O scambia le pagine in base alla loro frequenza di accesso?
O qualcos'altro?


2
Sì, la swapiness è vaga ;-)
ℝafink

Risposte:


27

Dalla versione 2.6.28 del kernel, Linux usa a strategia di sostituzione della pagina LRU ( Split Least recentemente utilizzata ). Le pagine con un'origine file system, come il testo del programma o le librerie condivise appartengono alla cache dei file. Le pagine senza supporto del file system sono chiamate pagine anonime e sono costituite da dati di runtime come lo spazio dello stack riservato per le applicazioni ecc. In genere, le pagine appartenenti alla cache dei file sono più economiche da eliminare dalla memoria (poiché possono essere semplicemente lette dal disco quando necessario) . Dal momento che le pagine anonime non hanno il backup del filesystem, devono rimanere in memoria fintanto che sono necessarie per un programma a meno che non ci sia spazio di scambio in cui memorizzarle.

L' vm.swappinessopzione entra in gioco in get_scan_count()definita in mm/vmscan.c.get_scan_count()determina in che modo gli elenchi LRU anonimi e file devono essere scansionati quando si cercano pagine da sfrattare. Il valore di ciascun caso è determinato dalla media mobile dei rapporti recentemente ruotati e scansionati di recente in cui i riferimenti più recenti hanno più peso di quelli precedenti per tenere conto del cambiamento del carico di lavoro del sistema.

Il vm.swappinessè un modificatore che cambia l'equilibrio tra sostituendo le pagine della cache di file in favore di pagine anonime. vm.swappinessè il valore di priorità assegnato alle pagine anonime, impostato per impostazione predefinita su 60 . Alla cache del file viene assegnato un valore di priorità di 200 da cui vm.swappinessviene dedotto il modificatore ( file_prio=200-anon_prio). Ciò significa che, per impostazione predefinita, i pesi di priorità sono moderatamente a favore di pagine anonime ( anon_prio=60, file_prio=200-60=140). Tuttavia, quando il sistema è vicino a una condizione di memoria insufficiente, gli elenchi LRU sia anonimi che file vengono analizzati allo stesso modo, a meno che non vm.swappinesssia impostato su zero.

Quando vm.swappinessè impostato su 100, le priorità sarebbero uguali ( anon_prio=100, file_prio=200-100=100). L'impostazione vm.swappinesssu zero impedisce al kernel di eliminare le pagine anonime a favore delle pagine dalla cache dei file.


C'è un modo per cambiare la swappiness di file_prio? O limitarlo a una directory specifica?
CMCDragonkai,

13

Esiste una formula che viene utilizzata per calcolare quale pagina verrà scambiata. In vmscan.cpuoi vedere questo algoritmo:

tendenza allo scambio = mapped_ratio / 2 + angoscia + vm_swappiness

Qui puoi vedere che lo swappiness è una scala, che viene aggiunta in alcuni algoritmi e puoi controllare con questo parametro come si comporterà il kernel quando deve scambiare. Puoi immaginarlo come percentuale di probabilità che una pagina di memoria inattiva venga scambiata. Se impostate lo swappiness su 100, non vi è alcuna probabilità, ma una garanzia che lo swap e se lo impostate su 0, il kernel tenterà di non scambiare affatto fintanto che ha memoria vuota.


6

È stato detto (penso Norman 1986) che spesso il pulsante "CHIUDI PORTA" in un ascensore è rotto o non è mai stato collegato a nulla in primo luogo. Questo rende il controllo ersatz non un modo di manipolare l'ascensore ma di pacificare il ciclista troppo frettoloso.

In modo simile, lo swappiness ha un effetto non correlato al suo controllo deterministico ben definito di un predicato del kernel. Come notato da @neon_overlord su askubuntu.com

Perché la maggior parte crede che lo scambio = cattivo e che se non si riduce lo scambio, il sistema cambierà quando non è realmente necessario. Nessuno di questi è veramente vero. Le persone associano lo scambio a momenti in cui il loro sistema viene impantanato, tuttavia, è principalmente scambiato perché il sistema viene impantanato, non viceversa. È vero che ci sono alcuni momenti in cui lo scambio può avere una penalità notevole, ma la riduzione della swap per quel caso può ridurre le prestazioni complessive del sistema o la stabilità in altri modi che in seguito potrebbero diventare evidenti ...

Quindi cosa controlla veramente ? Una risposta valida - oltre alle belle risposte già fornite - è che modifica la tua aspettativa di avere un maggiore controllo sul tuo sistema e che agitando una manopola ti permetterà di esercitare quel controllo in modo significativo.

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.