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:
- zswap aktiveres ved at placere nogle parametre i Linux kommando linien.
- Æ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
- Hvad du skal tilføje, og som for Lubuntus vedkommende er en ændring
- Aktivere zswap
Kode: Vælg alt
zswap.enabled=1
- 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
- Komprimeringsalgoritme
Default (standard) algoritmen der er den der komprimerer bedst er LZO, så skal du brugeKode: Vælg alt
zswap.compressor=lzo
Den lidt dårliger, men meget hurtigere er LZ4Kode: 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. - 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.
- Aktivere zswap
- 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
- 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
- Hvis din computer har dedikeret hardware til komprimering/dekomprimering, så vil kernen bruge det.
- 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