GNU/Linux >> Linux Esercitazione >  >> Linux

Linux - Linux esegue "scambio opportunistico" o è un Theth?

Supponiamo che un programma richieda un po' di memoria, ma non è rimasta abbastanza memoria libera. Esistono diversi modi in cui Linux potrebbe rispondere. Una risposta è selezionare un'altra memoria utilizzata, a cui non è stato effettuato l'accesso di recente, e spostare questa memoria inattiva per lo scambio.

Tuttavia, vedo molti articoli e commenti che vanno oltre. Dicono che anche quando c'è una grande quantità di memoria libera, Linux a volte deciderà di scrivere memoria inattiva da scambiare. Scrivere per swap in anticipo significa che quando alla fine vogliamo usare questa memoria, non dobbiamo aspettare una scrittura su disco. Dicono che questa sia una strategia deliberata per ottimizzare le prestazioni.

Hanno ragione? O è un mito? Cita le tue fonti.

Si prega di comprendere questa domanda utilizzando le seguenti definizioni:

  • scambia
  • gratuito memory – la memoria “libera” visualizzata dal comando free. Questo è il MemFree valore da /proc/meminfo . /proc/meminfo è un file di testo virtuale fornito dal kernel. Vedere proc(5) o documenti RHEL.
  • anche quando c'è una grande quantità di memoria libera – ai fini dell'argomentazione, immagina che ci sia più del 10% di memoria libera.

Riferimenti

Ecco alcuni termini di ricerca:linux “scambio opportunistico” OR (scambia “quando il sistema non ha niente di meglio da fare” OR “quando non ha niente di meglio da fare” OR “quando il sistema è inattivo” OR “durante il tempo di inattività”)

Nel secondo risultato più alto su Google, un utente di StackExchange chiede "Perché utilizzare lo scambio quando c'è spazio libero più che sufficiente nella RAM?" e copia i risultati di free comando che mostra circa il 20% di memoria libera. In risposta a questa domanda specifica, vedo che questa risposta è molto votata:

Linux inizia lo scambio prima che la RAM si riempia. Questo viene fatto per
migliorare le prestazioni e la reattività:

  • Le prestazioni sono aumentate perché a volte la RAM viene utilizzata meglio per la cache del disco piuttosto che per archiviare la memoria del programma. Quindi è meglio sostituire un programma
    che è stato inattivo per un po' di tempo e invece tenere nella cache i file
    usati di frequente.

  • La reattività è migliorata scambiando le pagine quando il sistema è inattivo, anziché quando la memoria è piena e alcuni programmi sono in esecuzione
    e richiedendo più RAM per completare un'attività.

Lo scambio, ovviamente, rallenta il sistema, ma l'alternativa allo
non è lo scambio, ma avere più RAM o utilizzare meno RAM.

Il primo risultato su Google è stato contrassegnato come duplicato della domanda precedente :-). In questo caso, il richiedente ha copiato i dettagli che mostravano 7 GB di MemFree , su 16 GB. La domanda ha una sua risposta accettata e votata a favore:

Lo scambio solo quando non c'è memoria libera è possibile solo se si imposta swappiness a 0. Altrimenti, durante il tempo di inattività, il kernel scambierà la memoria. In questo modo i dati non vengono rimossi dalla memoria, ma viene eseguita una copia nella partizione di swap.

Ciò significa che, se si verifica la situazione in cui la memoria è esaurita, non è necessario scrivere sul disco in quel momento. In questo caso il kernel può semplicemente sovrascrivere le pagine di memoria che sono già state scambiate, per le quali sa di avere una copia dei dati.

La swappiness il parametro fondamentalmente controlla solo quanto lo fa.

L'altra citazione non afferma esplicitamente che anche i dati scambiati vengano mantenuti in memoria. Ma sembra che tu preferisca questo approccio, se stai effettuando lo scambio anche nei momenti in cui hai il 20% di memoria libera e il motivo per cui lo fai è migliorare le prestazioni.

Per quanto ne so, Linux supporta il mantenimento di una copia degli stessi dati sia nella memoria principale che nello spazio di scambio.

Ho anche notato l'affermazione comune secondo cui "lo scambio opportunistico" avviene "durante il tempo di inattività". Capisco che dovrebbe aiutarmi a rassicurarmi sul fatto che questa funzione è generalmente buona per le prestazioni. Non lo includo nella mia definizione sopra, perché penso che abbia già abbastanza dettagli per fare una bella domanda chiara. Non voglio renderlo più complicato del necessario.

Motivazione originale

in alto mostra `swout` (scambio) quando ho gigabyte di memoria libera. Perché?

Ci sono un paio di rapporti come questo, sulla scrittura di Linux da scambiare quando c'è molta memoria libera. "Scambio opportunistico" potrebbe spiegare questi rapporti. Allo stesso tempo, è stata suggerita almeno una causa alternativa. Come primo passo per esaminare le possibili cause:Linux esegue mai lo "scambio opportunistico" come definito sopra?

Nell'esempio che ho riportato, la domanda ha ora una risposta. La causa non era lo scambio opportunistico.

Risposta accettata:

Linux non esegue lo "scambio opportunistico" come definito in questa domanda.

I seguenti riferimenti primari non menzionano affatto il concetto:

  1. Capire il Gestore della memoria virtuale di Linux. Un libro online di Mel Gorman. Scritto nel 2003, poco prima del rilascio di Linux 2.6.0.
  2. Documentazione/admin-guide/sysctl/vm.rst. Questa è la documentazione principale delle impostazioni sintonizzabili della gestione della memoria virtuale di Linux.
Correlati:reindirizzare STDERR e STDOUT a variabili diverse senza file temporanei?

Più precisamente:

10.6 Demone di Pageout (kswapd)

Storicamente kswapd utilizzato per svegliarsi ogni 10 secondi, ma ora viene svegliato dall'allocatore di pagine fisico solo quando viene raggiunto il numero pages_low di pagine libere in una zona. […] Sotto un'estrema pressione di memoria, i processi faranno il lavoro di kswapd in modo sincrono. […] kswapd continua a liberare pagine finché non viene raggiunta la filigrana pages_high.

Sulla base di quanto sopra, non ci aspetteremmo alcuno scambio quando il numero di pagine libere è superiore al "limite massimo".

In secondo luogo, questo ci dice lo scopo di kswapd è creare più pagine libere.

Quando kswapd scrive una pagina di memoria da scambiare, libera immediatamente la pagina di memoria. kswapd non conserva in memoria una copia della pagina scambiata .

Linux 2.6 usa la “rmap” per liberare la pagina. In Linux 2.4, la storia era più complessa. Quando una pagina è stata condivisa da più processi, kswapd non è stato in grado di liberarla immediatamente. Questa è storia antica. Tutti i post collegati riguardano Linux 2.6 o versioni successive.

scambio

Questo controllo viene utilizzato per definire l'aggressività con cui il kernel scambierà
le pagine di memoria. Valori più alti aumenteranno l'aggressività, valori più bassi
diminuiranno la quantità di swap. Un valore pari a 0 indica al kernel di non
avviare lo scambio fino alla quantità di pagine supportate da file libere è inferiore
rispetto al limite massimo in una zona.

Questa citazione descrive un caso speciale:se configuri lo swappiness il valore deve essere . In questo caso, inoltre, non dovremmo aspettarci alcuno scambio fino a quando il numero di pagine della cache non è sceso al limite massimo. In altre parole, il kernel proverà a eliminare quasi tutta la cache dei file prima di iniziare lo scambio. (Ciò potrebbe causare enormi rallentamenti. È necessario disporre di una cache di file! La cache di file viene utilizzata per contenere il codice di tutti i programmi in esecuzione 🙂

Quali sono le filigrane?

Le citazioni di cui sopra sollevano la domanda:quanto sono grandi le riserve di memoria della "filigrana" sul mio sistema? Risposta:su un sistema "piccolo", le filigrane di zona predefinite potrebbero raggiungere il 3% della memoria. Ciò è dovuto al calcolo della filigrana "min". Su sistemi più grandi le filigrane saranno una proporzione minore, avvicinandosi allo 0,3% della memoria.

Quindi, se la domanda riguarda un sistema con più del 10% di memoria libera, i dettagli esatti di questa logica di filigrana non sono significativi.

Le filigrane per ogni singola "zona" sono mostrate in /proc/zoneinfo , come documentato in proc(5). Un estratto da my zoneinfo:

Node 0, zone    DMA32
  pages free     304988
        min      7250
        low      9062
        high     10874
        spanned  1044480
        present  888973
        managed  872457
        protection: (0, 0, 4424, 4424, 4424)
...
Node 0, zone   Normal
  pages free     11977
        min      9611
        low      12013
        high     14415
        spanned  1173504
        present  1173504
        managed  1134236
        protection: (0, 0, 0, 0, 0)

Le attuali "filigrane" sono min , low e high . Se un programma richiede memoria sufficiente per ridurre free sotto min , il programma entra in “rivendicazione diretta”. Il programma viene fatto attendere mentre il kernel libera memoria.

Vogliamo evitare il reclamo diretto, se possibile. Quindi se free scenderebbe al di sotto del low filigrana, il kernel riattiva kswapd . kswapd libera memoria scambiando e/o eliminando le cache, fino a free è superiore a high di nuovo.

Qualifica aggiuntiva:kswapd verrà eseguito anche per proteggere l'intero importo lowmem_reserve, per l'utilizzo di kernel lowmem e DMA. La lowmem_reserve predefinita è circa 1/256 dei primi 4GiB di RAM (zona DMA32), quindi di solito è di circa 16MiB.

Il codice Linux esegue il commit

mm:scala filigrane kswapd in proporzione alla memoria

[…]

watermark_scale_factor:

Questo fattore controlla l'aggressività di kswapd. Definisce la
quantità di memoria rimasta in un nodo/sistema prima che kswapd venga riattivato e
quanta memoria deve essere libera prima che kswapd torni a dormire.

L'unità è in frazioni di 10.000. Il valore predefinito di 10 significa che le distanze
tra filigrane sono lo 0,1% della memoria disponibile nel nodo/sistema
. Il valore massimo è 1000, ovvero il 10% della memoria.

Un alto tasso di thread che entrano in reclaim diretto (allocstall) o kswapd
vanno a dormire prematuramente (kswapd_low_wmark_hit_quickly) può indicare
che il numero di pagine libere che kswapd mantiene per motivi di latenza è
troppo piccolo per il burst di allocazione che si verificano nel sistema. Questa manopola
può quindi essere utilizzata per regolare l'aggressività di kswapd di conseguenza.

proc:meminfo:stima la memoria disponibile in modo più prudente

Il MemAvailable elemento in /proc/meminfo è quello di fornire agli utenti un suggerimento su come
è allocabile molta memoria senza causare lo scambio, quindi esclude
i limiti minimi delle zone in quanto non disponibili per lo spazio utente.

Tuttavia, per un'allocazione dello spazio utente, kswapd reclamerà effettivamente
fino a quando le pagine libere non raggiungono una combinazione di high watermark e protezione lowmem dell'allocatore di pagine
che mantiene anche una certa quantità di memoria DMA
e DMA32 dallo spazio utente.

Sottrarre l'intero importo che sappiamo essere non disponibile per lo spazio utente dal
dal numero di pagine libere durante il calcolo di MemAvailable.

Codice Linux

A volte si dice che la modifica di swappiness a disabiliterà efficacemente lo "scambio opportunistico". Ciò fornisce un'interessante via di indagine. Se c'è qualcosa chiamato "scambio opportunistico", e può essere regolato da swappiness, allora potremmo inseguirlo trovando tutte le catene di chiamate che leggono vm_swappiness . Nota che possiamo ridurre il nostro spazio di ricerca assumendo CONFIG_MEMCG non è impostato (cioè i “cgroup di memoria” sono disabilitati). La catena di chiamate va:

  • vm_swappiness
  • mem_cgroup_swappiness
  • get_scan_count
  • shrink_node_memcg
  • shrink_node
Correlati:quale PERCORSO usa `sudo` per cercare ``?

shrink_node_memcg è commentato “Questa è una pagina per nodo di base più libera. Utilizzato sia da kswapd che da direct reclaim”. Cioè. questa funzione aumenta il numero di liberi pagine. Non si tratta di duplicare le pagine da scambiare in modo che possano essere liberate molto più tardi. Ma anche se lo scontiamo:

La catena sopra è chiamata da tre diverse funzioni, mostrate di seguito. Come previsto, possiamo dividere i siti di chiamata in reclamo diretto vs. kswapd. Non avrebbe senso eseguire "scambio opportunistico" in un reclamo diretto.

  1. /*
     * This is the direct reclaim path, for page-allocating processes.  We only
     * try to reclaim pages from zones which will satisfy the caller's allocation
     * request.
     *
     * If a zone is deemed to be full of pinned pages then just give it a light
     * scan then give up on it.
     */
    static void shrink_zones
    
  2.  * kswapd shrinks a node of pages that are at or below the highest usable
     * zone that is currently unbalanced.
     *
     * Returns true if kswapd scanned at least the requested number of pages to
     * reclaim or if the lack of progress was due to pages under writeback.
     * This is used to determine if the scanning priority needs to be raised.
     */
    static bool kswapd_shrink_node
    
  3.  * For kswapd, balance_pgdat() will reclaim pages across a node from zones
     * that are eligible for use by the caller until at least one zone is
     * balanced.
     *
     * Returns the order kswapd finished reclaiming at.
     *
     * kswapd scans the zones in the highmem->normal->dma direction.  It skips
     * zones which have free_pages > high_wmark_pages(zone), but once a zone is
     * found to have free_pages <= high_wmark_pages(zone), any page in that zone
     * or lower is eligible for reclaim until at least one usable zone is
     * balanced.
     */
    static int balance_pgdat
    

Quindi, presumibilmente l'affermazione è che kswapd viene svegliato in qualche modo, anche quando tutte le allocazioni di memoria vengono soddisfatte immediatamente dalla memoria libera. Ho esaminato gli usi di wake_up_interruptible(&pgdat->kswapd_wait) , e non vedo nessun risveglio come questo.


Linux
  1. Utilizzo della memoria di Linux

  2. Linux gratuito mostra un elevato utilizzo della memoria, ma top no

  3. Memoria inattiva di Linux

  4. quali processi killer ha Linux?

  5. Linux esegue lo scambio opportunistico o è un mito?

Comando gratuito Linux (controlla l'utilizzo della memoria)

Comando gratuito in Linux

Linux Oom in modo casuale quando c'è ancora memoria libera?

Come funziona la memoria di scambio in Linux?

Esempi di comandi gratuiti in Linux

Trova la dimensione della RAM in Linux