Teknik basker : agressiv swappiness, og komprimeret swap i fysisk RAM (zswap)

Har du en guide til en funktion eller et program? Har du tips og trick, som du gerne vil dele med andre? Post dem her.
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Teknik basker : agressiv swappiness, og komprimeret swap i fysisk RAM (zswap)

Indlæg af lath »

Teknik basker : agressiv swappiness, og komprimeret swap i fysisk RAM (zswap)

Hvorfor bruge zswap?

Hvis du har en ældre maskine med lidt fysisk hukommelse så kan man med fordel bruge zswap.
Eksempel,
Min netbook computer har 2 GB RAM, hvis vi nu siger at kernen bruger lige så meget RAM som min desktop maskine minus 10% (netbook er en 32-bit, og desktop er 64 bit), så bruger den
10% af

Kode: Vælg alt

grep Slab /proc/meminfo

Som skriver
Slab: 332728 kB

Altså så er bruger kernen 0,9 * 324,9 MB = 292 MB

Det giver så 2096-292 MB = 1804 MB fri fysisk hukommelse at lege med:

Fortæller vi så zswap at den skal bruge max 40% af den ledige hukommelse med en 2:1 komprimerings ratio, så er der nu

(1-0,4)*1804 * 2 MB = 2164,8 MB plads at lege med., hvor:
  • 1 - 0,4 er 100% minus 40 %
  • 1804 er ledig hukommelse efter at kernen har taget sin andel
  • 2 kommer fra komprimeringsfaktoren 2:1

Vi har så praktisk talt lavet en kunstig forøgelse af tilgængelig hukommelsen med 2164,8 - 1804 MB = 360,2 MB hukommelse.

Bemærk dog at komprimering godt kan være ringere da komprimeringen fortages for meget små mængder af hukommelse.

Introduktion

De fleste kender nok noget til vm.swappiness. Den læses med denne kommando :

Kode: Vælg alt

# sysctl vm.swappiness

... som skriver vm.swappiness = 60, hvis man bruger sin maskine med en desktop.
  • # er et symbol som betyder at kommandoen skal køres med superbruger rettigheder, og $ er et symbol for en normal brugers rettigheder. Du må ikke skrive # eller $ tegnet
  • vm i vm.swappiness betyder "virtual memory", altså virtuel hukommelse.

Praktisk forhåndsviden

Programmer bruger virtuel hukommelse og ikke (direkte) fysisk hukommelse. Den tilgængelige mængde af hukommelse i den virtuelle hukommelse er summen af ledig plads i fysisk hukommelse, samt swap.

En page er 4096 bytes, som er den mindste mængde af hukommelse (virtuel eller fysisk) som Linux (og Windows) kernen kan bruge.

For de engelsk udfordrede, så betyder et "s" i pages at der er tale om mere end en page.

Programmer kan allokere mere virtuel hukommelse end der er til rådighed. Det kaldes for overcommit. Man kan begrænse overcommit for et program, for eksempel Firefox. det gjorde jeg engang Firefox havde en memory leak. Når et program møder sin maksimum commit størrelse er programmet out-of-memory (OOM). Kernens respons på en OOM for et program, som er commit begrænset er at SIGHUP det (lukke programmet ned ved tvang).

I alle tilfælde overcommit eller ej, så er kernen så praktisk indrettet at den først giver et program en ledig page, når programmer vil bruge en ny page.

Swappiness

Swappiness er hvor aggressivt (Linux) kernen skal flytte en page til swap.

0 (nul) betyder at den skal vente til den er løbet tør for plads til en ekstra page i fysik RAM, og derfor må page(flytte) flere pages til swap.

100 betyder at den skal være meget aggressiv med at flytte pages ud i swap.

Der er en hel del pages som kun bruges, når kernen starter, og derefter aldrig igen. Aggressiv swapping vil flytte dem ud i swap. Det har den fordel at de nu ledige pages så kan bruges af programmer.

Mit system bruger vm.swappiness=100, som man midlertiligt aktivere således

Kode: Vælg alt

# sysctl -w vm.swappiness=100


Du går tilbage til 60 ved at køre denne kommando

Kode: Vælg alt

# sysctl -w vm.swappiness=60


Hvis du permanent vil ændre vm.swappines, så skal du lave en ændring i /etc/sysctl.conf filen.
Hvis du skal ændre swappiness til 100, så skriv det her nederst i filen

Kode: Vælg alt

vm.swappiness=100

Hvis den allerede eksistere skal du rette i stedet rette i den. Du kan lave en eksisterende være ved at udkommentere den med lade det tegn i en line være #. Det er også en god ide at lave en kommentar om hvad du selv har lavet af rettelser samt hvorfor du gjorde det.

zswap

Defenition:
zswap is a Linux kernel feature that provides a compressed write-back cache for swapped pages, as a form of virtual memory compression. Instead of moving memory pages to a swap device when they are to be swapped out, zswap performs their compression and then stores them into a memory pool dynamically allocated in the system RAM.

... som jeg har sakset fra engelsk wikipedia: https://en.wikipedia.org/wiki/Zswap

zswap er altså komprimeret swap der bor i den fysiske hukommelse. zswap kræver det man kalder for et backing block device, også bedre kendt som en swap partition.

zswap aktiveres således:
  1. zswap aktiveres ved at placere nogle parametre i Linux kommando linien.
  2. Ændringerne udføres på GRUB2 boot loaderens konfigurationsfil (/etc/default/grub) i linien der starter med

    Kode: Vælg alt

    GRUB_CMDLINE_LINUX_DEFAULT="

    Du kan ikke starte Ubuntu, hvis du glemmer at linien herover SKAL slutte med kun ET "-tegn!
    Derefter skal du regenerere koden som GRUB2 kører efter boot/reboot ved at køre:

    Kode: Vælg alt

    # update-grub

  3. Hvad du skal tilføje, og som for Lubuntus vedkommende er en ændring

    1. Aktivere zswap

      Kode: Vælg alt

      zswap.enabled=1

    2. Fortælle hvor mange % (procent af hukommelsen du maksimalt vil bruge, for 20% ser det således ud:

      Kode: Vælg alt

      zswap.max_pool_percent=20

    3. Komprimeringsalgoritme
      Default (standard) algoritmen der er den der komprimerer bedst er LZO, så skal du bruge

      Kode: Vælg alt

      zswap.compressor=lzo

      Den lidt dårliger, men meget hurtigere er LZ4

      Kode: Vælg alt

      zswap.compressor=lz4

      Hvilken du vil bruge er en overvejelse over hvor langsomt du vil have pages tilbage fra zswap. Har du en gammel computer med en langsom CPU, så er LZ4 bedst, ellers er det LZ0.
    4. zpool, styring af den måde zswaps memory pool(=den hukommelse som bruges af zswap) bruges på:

      Kode: Vælg alt

      zswap.zpool=zbud

      ... på Linux kernens argument liste.

      For det første så er en zpool ikke aldrig præ-allokeret. En zpool forbrug af fysik hukommelse justeres efter behov. Det betyder at hvis kernen ikke bruger zswap, så fylder zswap's zpool 0 bytes i den fysiske hukommelse.

      Default (standard metoden hedder zbud. Det som zbud gør er at der bruges 1 page for hver gang der skal komprimeres 2 pages, altså at komprimeringsfaktoren er 2:1, eller værre end 2:1 (1,5:1 f.eks)

      Der er også zsmalloc. Den kan lave en bedre komprimering, men den understøtter ikke komprimere fjernelse, så med den zpool metode, og når en zswap er fyldt op, så kan zsmalloc ikke fjerne gamle pages, men kun afvise nye pages (swap partitionen bruges).

      Brug zbud, hvis du er i tvivl.
  4. Bonus info: Du kan ændre i zswap indstillingene på run-time (=imens Ubuntu kører)

    • Når zswap behøver at flytte den ældste page (vælges med LRU - Least Resently used algoritmen) ned i en swap partition, så bliver pages dekomprimeret, så kernen bare kan råkopiere pages, såfremt den skal bruges igen
    • Detaktivere zswap

      Kode: Vælg alt

      # echo 0 > /sys/module/zswap//enabled

      Brug 1 i stedet for 0 hvis du vil aktivere zswap
    • Ændre hvor mange procent fysisk hukommelse der skal bruges
      Send et tal til /sys/module/zswap/parameters/max_pool_percent,. Hvis det er 25% så er det:

      Kode: Vælg alt

      # echo 25 > /sys/module/zswap/parameters/max_pool_percent

    • Ændre kromprimeringsalgoritmen, her er det til LZO. Erstat LZ0 med LZ4, hvis du vil bruge LZ4

      Kode: Vælg alt

      echo lzo > /sys/module/zswap/parameters/compressor
  5. Hvis din computer har dedikeret hardware til komprimering/dekomprimering, så vil kernen bruge det.
  6. Android enheder bruger zram, der er zswap uden en swap partition.

Jeg har sakset de fleste informationer fra kernel.org: https://www.kernel.org/doc/html/v4.18/vm/zswap.html

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags
Claus Henriksen
Forfatter
Indlæg: 794
Tilmeldt: 21. jan 2007, 17:45
Geografisk sted: Christianshavn

Re: Teknik basker : agressiv swappiness, og komprimeret swap i fysisk RAM (zswap)

Indlæg af Claus Henriksen »

Tak for gennemgang. Skal helt klart afprøves!
Claus Gårde Henriksen / Jeg bruger ikke Ubuntu / Debian Stable 12