▶ Swapujme do RAM

Založil Roman Horník, 20. 12. 2015, 00:02:43

Předchozí téma - Další téma

Roman Horník

Zní to jako šílenej paradox, vždyť swap je přece nástavbou RAM, když její kapacita už došla, když už se do ní nic nevejde. Ale jde to, jde to vskutku velice dobře.
Píšu tady o zRAM, principem činnosti je komprese stránek uložených v RAM kompresním algoritmem, jinými slovy, do RAM se vejde víc dat, než za normálních okolností dokáže pojmout. Na Debíkovi je tato vlastnost k dispozici od jádra verze 3.2, využívá se u operačních systémů Android.

Výhody:
* Mnohem vyšší rychlost a plynulost chodu swapujícího systému v porovnání se swapováním na disk, mnohem nižší, prakticky zanedbatelné latence (nikde neběhá rameno s hlavičkami a nehledá stopu na disku)
* Nechrochtá jako swapující disk, ba naopak, takovýto způsob swapování je absolutně neslyšný
* Je schopen využít všechna jádra CPU, čím víc jader, tím vyšší výkon
* Šetří disky. DRAM se neopotřebí (přestože stále pracuje na plné obrátky), zatímco mechanismus HDD dostává dost na prdel a flash paměť SSD má omezený počet zápisů a přepisů na buňku (tam je čtení, zápis a navíc i přepis; čtení nic nepoškozuje)
* Do RAM lze vměstnat i víc jak dvojnásobek její kapacity

Nevýhody:
* Kdo chce uspávat na disk, stejně logicky swapovací oddíl na disku potřebuje; jak se RAM vypne šťáva, není schopna uchovat data (kromě logických nul)
* K zpomalení běhu systému a aplikací stejně dochází, komprese i dekomprese zabírají všechen dostupný procesorový čas. Jen to trvá mnohem kratší dobu a systém je během swapování mnohem použitelnější

Následující postup byl převzat a počeštěn z wiki Debianu a je mnou velmi dobře odzkoušený:



1) Vytvořte soubor /etc/init.d/zram a nasypejte do něj (přepsáno, už nepotřebujete Perl, stačí jen BASH a jeho vestavěné funkce):

#!/bin/bash
### BEGIN INIT INFO
# Provides:          zram
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Default-Start:     S 1 2
# Default-Stop:      0 6
# Short-Description: Use compressed RAM as in-memory swap
# Description:       Use compressed RAM as in-memory swap
### END INIT INFO

FRAC=111
MMRY=`grep MemTotal: /proc/meminfo | awk '{print $2}'`
CPUS=`grep -c processor /proc/cpuinfo`
SIZE=$((MMRY*1024*FRAC/100/CPUS))


START() {
param=`modinfo zram | grep num_devices | cut -f2 -d: | tr -d ' '`
for n in `seq $CPUS`; do
  I=$((n-1))
  modprobe zram $param=$CPUS
  echo $SIZE > /sys/block/zram$I/disksize
  mkswap /dev/zram$I
  swapon /dev/zram$I -p 10
done &
wait
}

STOP() {
for n in `seq $CPUS`; do
  I=$((n-1))
  swapoff /dev/zram$I; echo "Odstraněn disk $n/$CPUS"
done &
wait
modprobe -r zram
}

RELOAD() {
systemctl daemon-reload
}

case "$1" in
"start") START;;
"stop") STOP;;
"restart") STOP; START;;
"reload") STOP; RELOAD; START;;
*) echo "Použití: `basename $0` (start | stop | restart | reload)" & exit 1;;
esac


2) V terminálu mu (jako root) nastavte spustitelnost:
chmod +x /etc/init.d/zram

3) Systému řekněte, aby se skript automaticky spouštěl při jeho startu (zase jako root):
insserv zram

4) A rovnou si to můžete spustit (opět spusťte jako root):
service zram start
nebo
/etc/init.d/zram start

Nakonec pár poznámek:
1) Na řádku 12 v tom skriptu je proměnná FRAC - je to hodnota v procentech, a tou se nastavuje, jak velkou část z RAM použít pro zRAM swap použijte číslo v intervalu {1..100, jde to kolikrát i víc, mám 111%, musíte odzkoušet}
2) Pro swapování má zRAM vyšší prioritu jak normální swap na disku, čili nejdřív se bude při zaplnění RAM plnit zRAM swap, až potom ten na disku
3) Nebojte se, že přijdete o možnost uspávání na disk, ta priorita pro uspávání neplatí, odkládací oddíl na disku je přednější


Nakonec pár měření na mém téměř muzejním stroji:

Konfigurace:
CPU: Intel Pentium Dual-Core E2180 (2 jádra, 2.0GHz, 800MHz FSB), přetaktováno na 2.64GHz, 1.05GHz FSB
Mámoprkno: Aušus P5QPL-AM (G41 + ICH7)
RAM: 2x 1GiB DDR2, 800MHz, přetaktováno na 874MHz
SSD: ADATA SP600, 64GB/59.6GiB (novej)
HDD1: Western Digital WD3200AAKS, 320GB/298GiB (starej)
HDD2: Seagate Barracuda ST380817AS, 80GB/74.5GiB (starší)

Benchmark spáchán programem gnome-disks při odpojených oddílech a za výchozího nastavení benchmarku

      Čtení [MB/s]   Zápis [MB/s]   Přístupová doba [ms]   %zRAM (R+W)   R+W [MB/s]
zRAM    2110.0         2540.0              0.00               100.00       4650.0
SSD      270.0           78.4              0.13                 7.49        348.4
HDD1      94.5           84.7             15.36                 3.85        179.2
HDD2      48.3           46.6             12.75                 2.04         94.9


Tady je vidět, že co do všech parametrů nemá konkurenci ani u SSD.

EDIT: Na svým nynějším stroji (viz podpis) jsem udělal benchmark čtení z zRAM bloku - 11.9GB/s (80x rychlejší jak SSD)

Tak ať vám slouží, fakt to stojí za to! ;)
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

Brano Dohoda

Super parada Romane a taka otazka ten swap na disku co mam da sa nejako rozumne pripojit k /home napriklad ? vies aby som sa potom swapu co je na disku zbail inak toto kamos pouzil aj na windowsoch a vravel ze paradna vec..
Debian 11 "bullseye" released + KDE Plasma
- - - - - - - - - - - - - - - - - - - - - - - -
[diakritika off]
- - - - - - - - - - - - - - - - - - - - - - - -
* CPU: Intel i3-8130U 2.2GHz Turbo Boost 3.4GHz
* GPU: Intel UHD620 + Nvidia MX130 2GB VRam
* RAM: DDR4 12GB @ 2133MHz

Roman Horník

Swapovat můžeš, stejně jako u wokňouzů, do souboru, jestli tohle myslíš. Buďto můžeš mít swapovací soubor s pevnou kapacitou, nebo s dynamickou.
Obojí má svoje výhody a nevýhody:

Pevná velikost: Zabere na disku furt stejně místa, bez ohledu na jeho zaplnění
Dynamická velikost: Velikost toho souboru je dynamická, podle potřeby. Ale způsobuje vyšší fragmentaci na onom oddílu a taky bude o něco pomalejší

Swapovací soubor s pevnou velikostí vyřešíš takhle a swapovací soubor s dynamickou velikostí zprostředkuje program swapspace, jenž je v repu.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

Ota Trkola

Tak jsem to nahodil, uvidíme, jak se to projeví...

Roman Horník

Nebój, kdyby to nefachalo, tak to sem nedávám.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

Roman Horník

Po 5 letech nepatrná aktualizace kódu - nevyžaduje už Perl a líp si rozumí se Systemd.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

radek_dr

Citace od: Roman Horník kdy 20. 12. 2015, 00:02:43
Zní to jako šílenej paradox, ......
.... zvlášť dnes. Když se podívám na výpis RAM, mám obvykle obsazeno kolem 35-40% ze 4GB a swap sice mám, ale jeho využití je 0 - 0,5%, navíc na SSD. Takže si neumím představit, že bych nějak poznal zrychlení. Jistě, pokud někdo používá aplikace extrémně náročné na paměť, může to využít, ale předpokládám, že takový uživatel si raději pořídí větší RAM, než si z ní ještě ukrajovat na swap; dnes to není až tak finančně náročné...  ???
Acer Swift1, N4200 2.5 GHz max., 4GB RAM, 64+250GB SSD, Intel graphic, Debian 12 Cinnamon
Intel NUC,  Celeron J3455, 8GB RAM, 256GB SSD, Debian 11 server, Apache, Nginx proxy, KVM...
AS8940G, Intel i7 ..., LM19 xfce

Nikdo není dokonalý !

Roman Horník

No tak najdou se hyperkonzervy, co si udržujou NTB z 90. let v provozu (zeptej se Oty), ale to je extrém, spousta domácností furt jede na strojích z počátku milénia, třeba rok 2004-2006, protože ten počítač s Celeronem a maximálně giga DDR RAM byl moc drahej, a dokud ňáko funguje...
Pak jsou tady krom mobilů a tabletů, kde na Androidu zRAM figuruje pěknejch pár let, miniaturní počítače dle střihu Raspberry Pi, taky založený na SoC, s relativně malou RAM a nemožností swapovat na úložiště (obvykle SD karta), protože by paměťovka velice rychle odešla.
Já to mám, protože dělám grafiku, právě kvůli žravejm programům (teda ne programům, ale kvůli fotkám, co se musej natahat do RAM)- Když jsem měl 4GiB RAM (a pozdějc 6GiB), tak to stačilo leda na osmibitovou grafiku, kde každá úprava degraduje kvalitu obrazu, a relativně nízký rozlišení u panoramat (třeba jen do 50MPx), protože úprava takovýho 100MPx panoramatu právě kvůli swapování na mechanickej disk netrvala pár desítek minut, ale klidně čtvrt dne.
Nemusíš ale nutně dělat grafiku, i webový stránky, jejich skripty, jsou kolikrát dost nenažraný, stačí pár hodin brouzdat, listovat na Xichtbooku, pročíst pár PDF, a RAM je za chvíli natolik plná, že spuštění nějakýho jinýho programu část paměťovejch stránek prohlížeče pošle do swapu, tím spíš, čím větší je hodnota parametru vm.swappiness (tendence ke swapování, jeho měkkost; výchozí je 60).
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

radek_dr

Ale jo, sám mám taky pár historických kousků, i když už je pomalu likviduji. Můj "nejvýkonnější" stroj je 11 let starý, má sice i7, ale...
Ovšem to Raspberry - to je dobrý nápad, tam RAM nepřidám. Musím to zkusit. Mám na něm Apache s PHP a MySQL, testuji na tom občas skripty a přistupuji výhradně přes SSH, a ještě funguje jako print server, tak si to dovedeš představit. Někdy nevím, jestli vypadla na chvíli síť nebo vynechává myš :D
Acer Swift1, N4200 2.5 GHz max., 4GB RAM, 64+250GB SSD, Intel graphic, Debian 12 Cinnamon
Intel NUC,  Celeron J3455, 8GB RAM, 256GB SSD, Debian 11 server, Apache, Nginx proxy, KVM...
AS8940G, Intel i7 ..., LM19 xfce

Nikdo není dokonalý !

piquick

Jaký k tomu, prosím, máte nastavený swappiness? Dí za odpověď.

Roman Horník

Já mám hodnotu 1, ale mělo by platit, čím větší je nouze o RAM, tím větší hodnota, ale víc jak 60 (výchozí) bych to nedával.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

Ota Trkola

Zkoušel jsem od 0 do 60 a moc velký rozdíl v tom není, když je RAM dostatek. A když není, tak to stejně swapuje i když dáš 0. Podle mě tenhle parametr nemá velký vliv.

Roman Horník

Ty musíš mít furt něco extra :D. Ve swapu nemám ani jeden bajt obsazenej. Se spíš podívej, jestli máš v /etc/sysctl.conf vm.swappiness = <číslo> správně a bez překlepu. Máme stejnej systém, musí bejt stejnej výsledek.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

Ota Trkola

Tak právě proto, že nemáš ve swapu ani jeden bajt obsazenej, tak nechápu k čemu tohle je? Nějak mi furt uniká smysl týhle věci :D Jinak nejsem blb a swap mám nastavenej, tak jak chci...

$ cat /proc/sys/vm/swappiness
10

Roman Horník

Dědku, nezřídkakdy do něj zabrousím například při tvorbě panoramat, takže...

Mimo to, zrovna Tobě, konzervě odmítající novější technologie, to nenutím. Když stroj používáš jak standardní BFU, nepoužíváš náročný aplikace a zároveň máš dostatek systémovejch prostředků, u nichž svým chováním nedokážeš dosáhnout jejich limitů, nebo je dokonce překročit, tak to nepotřebuješ, vlastně můžeš mít swap na disketě.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz