GNU/Linux >> Znalost Linux >  >> Linux

Provádí Linux oportunní swapování, nebo je to mýtus?

Linux neprovádí "oportunistické swapování", jak je definováno v této otázce.

Následující primární odkazy tento koncept vůbec nezmiňují:

  1. Pochopení správce virtuální paměti Linux. Online kniha od Mela Gormana. Napsáno v roce 2003, těsně před vydáním Linuxu 2.6.0.
  2. Dokumentace/admin-guide/sysctl/vm.rst. Toto je primární dokumentace laditelných nastavení správy virtuální paměti Linuxu.

Přesněji:

10.6 Démon Pageout (kswapd)

Historicky kswapd dříve se probouzelo každých 10 sekund, ale nyní je probouzeno pouze fyzickým alokátorem stránek, když je dosaženo počtu stránek_nízkého počtu volných stránek v zóně. [...] Pod extrémním tlakem paměti budou procesy dělat práci kswapd synchronně. [...] kswapd uvolňuje stránky, dokud není dosaženo vodoznaku pages_high.

Na základě výše uvedeného bychom neočekávali žádnou výměnu, když je počet volných stránek vyšší než "vysoký vodoznak".

Za druhé, toto nám říká účel kswapd je vytvořit více bezplatných stránek.

Když kswapd zapíše paměťovou stránku k odložení, okamžitě uvolní paměťovou stránku. kswapd neuchovává kopii zaměněné stránky v paměti .

Linux 2.6 používá "rmap" k uvolnění stránky. V Linuxu 2.4 byl příběh složitější. Když byla stránka sdílena více procesy, kswapd ji nedokázal okamžitě uvolnit. To je dávná historie. Všechny propojené příspěvky se týkají Linuxu 2.6 nebo vyššího.

swappiness

Tento ovládací prvek se používá k definování toho, jak agresivní bude jádro odkládat stránky paměti. Vyšší hodnoty zvýší agresivitu, nižší hodnoty sníží množství swapu. Hodnota 0 dává jádru pokyn, aby nezahájilo swap, dokud nebude dostatek volných stránek zálohovaných soubory je menší než horní hranice v zóně.

Tento citát popisuje speciální případ:pokud nakonfigurujete swappiness hodnota bude 0 . V tomto případě bychom navíc neměli očekávat žádnou výměnu, dokud počet stránek mezipaměti neklesne na vysoký vodoznak. Jinými slovy, jádro se pokusí zahodit téměř veškerou mezipaměť souborů, než začne swapovat. (To může způsobit masivní zpomalení. Musíte mít nějakou mezipaměť souborů! Mezipaměť souborů se používá k uložení kódu všech vašich spuštěných programů :-)

Co jsou vodoznaky?

Výše uvedené citace vyvolávají otázku:Jak velké jsou rezervace paměti "vodoznak" v mém systému? Odpověď:na "malém" systému mohou mít výchozí vodoznaky zóny až 3 % paměti. Důvodem je výpočet vodoznaku "min". Na větších systémech budou mít vodoznaky menší podíl, blíží se 0,3 % paměti.

Pokud se tedy otázka týká systému s více než 10 % volné paměti, přesné detaily této logiky vodoznaku nejsou podstatné.

Vodoznaky pro každou jednotlivou "zónu" jsou zobrazeny v /proc/zoneinfo , jak je zdokumentováno v proc(5). Výňatek z mého 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)

Aktuální "vodoznaky" jsou min , low a high . Pokud program někdy požádá o dostatek paměti ke snížení free níže min , program zadá "přímé vymáhání". Program čeká, dokud jádro neuvolní paměť.

Chceme se pokud možno vyhnout přímé reklamaci. Pokud tedy free by klesla pod low vodoznak, jádro probudí kswapd . kswapd uvolňuje paměť výměnou a/nebo zrušením mezipaměti až do free je vyšší než high znovu.

Další kvalifikace:kswapd bude také spuštěn, aby chránil celou částku lowmem_reserve pro použití s ​​nízkou pamětí jádra a DMA. Výchozí lowmem_reserve je asi 1/256 z prvních 4GiB RAM (zóna DMA32), takže je to obvykle kolem 16MiB.

Linux kód se odevzdá

mm:měřítko vodoznaků kswapd v poměru k paměti

[...]

watermark_scale_factor:

Tento faktor řídí agresivitu kswapd. Definuje množství paměti zbývající v uzlu/systému, než se kswapd probudí, a kolik paměti musí být volné, než se kswapd vrátí do režimu spánku.

Jednotka je ve zlomcích 10 000. Výchozí hodnota 10 znamená, že vzdálenosti mezi vodoznaky jsou 0,1 % dostupné paměti v uzlu/systému. Maximální hodnota je 1000 nebo 10 % paměti.

Vysoký počet vláken vstupujících do přímého obnovení (allocstall) nebo předčasného přechodu kswapd do režimu spánku (kswapd_low_wmark_hit_quickly) může naznačovat, že počet volných stránek, které kswapd udržuje z důvodů latence, je příliš malý na alokační shluky vyskytující se v systému. Tento knoflík pak lze použít k odpovídajícímu vyladění agresivity kswapd.

proc:meminfo:odhadnout dostupnou paměť konzervativněji

MemAvailable položka v /proc/meminfo je poskytnout uživatelům nápovědu o tom, kolik paměti je možné alokovat, aniž by došlo k odkládání, takže se vyloučí nízké vodoznaky zón jako nedostupné pro uživatelský prostor.

Pro alokaci uživatelského prostoru však kswapd bude skutečně znovu získat, dokud volné stránky nezasáhnou kombinaci vysokého vodoznaku a ochrany lowmem alokátoru stránek, která také uchovává určité množství paměti DMA a DMA32 z uživatelského prostoru.

Při výpočtu MemAvailable odečtěte celou částku, o které víme, že je nedostupná pro uživatelský prostor, od počtu stránek zdarma.

Linuxový kód

Někdy se tvrdí, že změna swappiness na 0 účinně zakáže "oportunistické swapování". To poskytuje zajímavou cestu vyšetřování. Pokud existuje něco, čemu se říká „oportunistické swapování“ a lze to vyladit swappiness, pak bychom to mohli dohnat nalezením všech call-chainů, které čtou vm_swappiness . Všimněte si, že můžeme snížit náš vyhledávací prostor za předpokladu CONFIG_MEMCG není nastaveno (tj. "paměťové cgroups" jsou zakázány). Řetězec hovorů:

  • vm_swappiness
  • mem_cgroup_swappiness
  • get_scan_count
  • shrink_node_memcg
  • zmenšit_uzel

shrink_node_memcg je komentován "Toto je základní stránka volnější pro jednotlivé uzly. Používá ji kswapd i direct reclaim". Tj. tato funkce zvyšuje počet volných stránky. Nesnaží se duplikovat stránky k výměně, aby mohly být uvolněny mnohem později. Ale i když to slevíme:

Výše uvedený řetězec je volán ze tří různých funkcí, které jsou zobrazeny níže. Jak se dalo očekávat, můžeme call-site rozdělit na přímé reclaim v.s. kswapd. Nemělo by smysl provádět „oportunistické swapování“ v přímém zpětném získávání.

  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
    

Pravděpodobně se tedy tvrdí, že kswapd se nějak probudí, i když jsou všechny alokace paměti okamžitě uspokojeny z volné paměti. Podíval jsem se na použití wake_up_interruptible(&pgdat->kswapd_wait) , a žádné takovéto probuzení nevidím.


Ne, v Linuxu nic takového jako oportunistické swapování neexistuje. Strávil jsem nějaký čas zkoumáním problému a všechny zdroje (učebnice, e-maily na mail listech vývojářů jádra, zdrojový kód Linuxu a komentáře k odevzdání a některé výměny Twitteru s Melem Gormanem) mi říkají to samé:Linux pouze reclaims paměť v reakci na nějakou formu tlaku paměti (se zřejmou výjimkou hibernace).

Všechny populární mylné představy na toto téma pravděpodobně pramení z prostého faktu, že Linux si nemůže dovolit čekat až do posledního bajtu volné paměti, než začne swapovat. Potřebuje nějaký druh polštáře, který ho ochrání před extrémními formami vyčerpání paměti, a existují některá laditelná nastavení, která mohou ovlivnit velikost tohoto polštáře (např. vm.min_free_kbytes ). Ale není to totéž jako „vyměnit, protože není nic lepšího na práci“.

Algoritmus rekultivace rámců stránky se bohužel stal mnohem složitějším oproti verzi 2.6 (když byl podrobně popsán v knize Mela Gormana), ale základní myšlenka je víceméně stejná:rekultivace stránky je spuštěna neúspěšnými alokacemi, které pak buď probudit kswapd nebo zkuste uvolnit stránky synchronně (v závislosti na tlaku paměti, příznakech přidělení a dalších faktorech).

Nejzřejmějším důvodem, proč alokace stránek mohou začít selhávat s dostatkem volné paměti, je to, že mohou vyžadovat souvislou paměť, zatímco ve skutečnosti může být paměť příliš fragmentovaná, aby uspokojila požadavek. Historicky vývojáři linuxového jádra šli hodně daleko, aby se vyhnuli potřebě souvislých alokací. Nicméně některé ovladače zařízení to stále vyžadují - buď proto, že nemohou provádět vícestránkové I/O paměti (scatter-gather DMA), nebo to může být jen nedbalé kódování vývojářů ovladačů. Příchod Transparent Huge Pages (THP) poskytl další důvod pro alokaci paměti ve fyzicky sousedících blocích.

Zhutňování zón, které bylo představeno ve stejném časovém rámci, má pomoci s problémem fragmentace paměti, ale ne vždy přináší očekávaný efekt.

Existují různé vmscan sledovací body, které vám mohou pomoci pochopit, co se přesně děje ve vašem konkrétním případě – je vždy snazší najít věci, které potřebujete v kódu jádra Linuxu, když máte konkrétní zásobníky volání, než jen skenovat vše, co vypadá vzdáleně relevantní.


Linux
  1. Linux Out-of-Memory Killer

  2. Vydání Kali Linux 2018.1

  3. Je alokace paměti v linuxu neblokující?

  1. Linux – skutečné využití paměti?

  2. Linux – Provádí Linux „oportunistické swapování“, nebo je to Theth?

  3. Linux zdarma ukazuje vysoké využití paměti, ale top ne

  1. Provádějte forenzní analýzu paměti Linuxu pomocí tohoto nástroje s otevřeným zdrojovým kódem

  2. Využití paměti Linuxu

  3. Jak vymazat mezipaměť v Linuxu