Toto je starší verze dokumentu!
Práce s pamětí RAM v Linuxu
Přestal jsem používat Swap na počítači, kde mám dostatek RAM paměti a chtěl jsem blíže porozumět tomu, jak Linux nakládá s pamětí a jejím uvolňování. Docela stručně a srozumitelně o tom popisuje stránka https://www.linuxatemyram.com/.
Pokud si vyjedu výpis zaplnění paměti v (MB):
$ free -m total used free shared buff/cache available Mem: 1504 1491 13 0 855 792 Swap: 2047 6 2041
Tak z výpisu se nekoukám na sloupeček free, ale zajímá mě sloupeček available. Protože část paměti je sice obsazená, ale je stále považována jako k využití. Takže sloupeček free je z hlediska chápání volné RAM zavádějící.
Linux využívá nevyužitou RAM pro cacheování disku - řekněme do maxima fyzické RAM. Pokud ale aplikace potřebuje více RAM a není už žádná volná, tak systém začne uvolňovat část paměti pro cacheování disku. Pokud chci jednorázově bezpečně uvolnit RAM (která sloužila jako cache pro disk), tak to lze nedestruktivně udělat takto:
echo 3 | sudo tee /proc/sys/vm/drop_caches
Jak vytvořit a zapnout swap file na Raspberry Pi
Tento návod popisuje, jak vytvořit a zapnout swap file na Raspberry Pi.
1. Vytvoření swapového souboru:
Pro vytvoření swapového souboru o velikosti 1 GB použijte následující příkaz:
sudo fallocate -l 1G /swapfile
Poznámka: Velikost můžete upravit podle potřeby (např. pro 512 MB použijte 512M).
2. Nastavení správných oprávnění:
Nastavte oprávnění k souboru příkazem:
sudo chmod 600 /swapfile
3. Inicializace swapového souboru: Inicializujte swapový soubor příkazem:
sudo mkswap /swapfile
4. Zapnutí swapového souboru: Swapový soubor aktivujte příkazem:
sudo swapon /swapfile sudo swapon --show
5. Automatické zapnutí při startu: Pro zajištění automatického zapnutí swapového souboru při startu systému přidejte následující řádek do souboru /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
6. Ověření funkčnosti swapu: Pomocí příkazu níže můžete ověřit, zda swap funguje:
free -h
Pokud budete potřebovat změnit velikost nebo konfiguraci swapového souboru, můžete jej odstranit, vytvořit nový s jinou velikostí a zopakovat uvedené kroky.
Omezení swapování na disk
Při správě Linuxového systému jsem se setkal s potřebou omezit swapování na disk, aby se minimalizovalo zpomalování systému při práci s pamětí. V tomto článku shrnu několik metod, které jsem použil k dosažení tohoto cíle.
Úprava `vm.swappiness`
Prvním krokem k omezení swapování bylo snížení hodnoty `vm.swappiness`, která určuje, jak agresivně jádro využívá swap. Výchozí hodnota bývá 60, což znamená, že systém začne poměrně brzy swapovat na disk. Cílem bylo snížit tuto hodnotu na 10, což udrží procesy v RAM co nejdéle.
Hodnotu jsem dočasně upravil příkazem:
sudo sysctl -w vm.swappiness=10
Pro trvalou změnu jsem upravil konfigurační soubor:
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
Tím jsem zajistil, že se nastavení zachová i po restartu.
Instalace a konfigurace `swapspace`
Místo pevně definovaného swapu o pevné velikosti jsem se rozhodl použít swapspace, což je dynamický swapovací mechanismus, který přidává a odebírá swapový prostor podle potřeby.
Instalace proběhla jednoduše:
sudo apt install swapspace
Následně jsem musel upravit fstab, aby se systém nesnažil používat původní swapovací soubor. Otevřel jsem fstab:
sudo nano /etc/fstab
A odstranil/překomentoval řádek obsahující `swap`. Poté jsem deaktivoval stávající swap:
sudo swapoff -a sudo rm -f /swapfile
Nakonec jsem restartoval `swapspace`, aby začal fungovat správně:
sudo systemctl restart swapspace
Ověření, že swapspace funguje správně, jsem provedl příkazem:
free -h
Pokud se swapovací prostor dynamicky mění, znamená to, že `swapspace` funguje správně.
Použití `cgroups` k omezení swapování per proces
Další možností, jak omezit swapování, je využití cgroups k nastavení limitu swapu pro konkrétní procesy. Cgroups umožňují řídit využití zdrojů na úrovni jednotlivých skupin procesů.
Pro zapnutí omezení swapu v cgroups jsem nejprve povolil swapový limit v jádře:
sudo grubby --update-kernel=ALL --args="swapaccount=1" sudo reboot
Pak jsem vytvořil cgroup pro omezení swapování a nastavil maximální swap na 500 MB:
sudo mkdir -p /sys/fs/cgroup/memory/limited_swap echo 500M | sudo tee /sys/fs/cgroup/memory/limited_swap/memory.memsw.limit_in_bytes echo $$ | sudo tee /sys/fs/cgroup/memory/limited_swap/cgroup.procs
Tím jsem zajistil, že procesy běžící v této skupině nemohou využít více než 500 MB swapu.
Použití `zswap`
Alternativou ke klasickému swapování na disk je použití zswap, což je kompresní mechanismus pro swapovaná data. Umožňuje systémům odložit swapovaná data do RAM v komprimované podobě místo zápisu na disk, což zlepšuje výkon.
Pro aktivaci `zswap` stačilo zavést parametr při startu systému:
sudo grubby --update-kernel=ALL --args="zswap.enabled=1" sudo reboot
Ověření, že `zswap` je aktivní:
cat /sys/module/zswap/parameters/enabled
Pokud vrátí `Y`, znamená to, že zswap funguje správně.
Tímto způsobem jsem úspěšně omezil nadměrné swapování na disk a zlepšil výkon systému.