====== 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 ---- === Konfigurace `swapspace` === Po odstranění pevně definovaného swapu jsem upravil konfigurační soubor **`/etc/swapspace.conf`**, aby swapspace lépe reagoval na změny dostupné paměti. Soubor jsem otevřel k editaci: sudo nano /etc/swapspace.conf A upravil jsem následující parametry: lower_freelimit=15 upper_freelimit=20 freetarget=18 === Vysvětlení parametrů: === * **`lower_freelimit=15`** – Pokud volná paměť klesne pod 15 %, swapspace začne vytvářet nový swapovací prostor. * **`upper_freelimit=20`** – Pokud volná paměť přesáhne 20 %, swapspace začne odstraňovat nepotřebný swap. * **`freetarget=18`** – Swapspace se snaží udržovat volnou paměť kolem 18 %. Tato konfigurace zajišťuje, že systém bude dynamicky udržovat vyvážené množství swapu podle aktuální dostupnosti paměti. ---- === Restart swapspace a ověření funkčnosti === Po úpravě konfigurace jsem restartoval `swapspace`, aby se změny projevily: sudo systemctl restart swapspace Ověření správné funkčnosti proběhlo příkazem: free -h Pokud se swapovací prostor dynamicky mění podle potřeby, znamená to, že `swapspace` funguje správně. Tímto způsobem jsem zajistil, že swapování se bude řídit dynamicky podle skutečné potřeby systému, což přispívá k lepší správě paměti. === Ověření správné funkčnosti swapspace === Po konfiguraci `swapspace` je důležité ověřit, zda vše funguje správně. K tomu jsem použil následující příkazy: # Zobrazí aktuální využití swapu a volné paměti free -h # Sleduje logy swapspace a zobrazí posledních 50 záznamů journalctl -u swapspace --no-pager | tail -n 50 # Zkontroluje stav swapspace služby systemctl status swapspace # Ověří, zda je nějaký swap aktivní swapon --summary # Sleduje dynamické vytváření a odstraňování swapu v reálném čase sudo tail -f /var/log/syslog | grep swapspace # Zobrazí detailní informace o aktuálně aktivních swapových zařízeních/souborech cat /proc/swaps Pokud logy neobsahují žádné chyby a výstupy příkazů ukazují dynamické přidávání a odebírání swapu podle volné paměti, znamená to, že **swapspace funguje správně**. === Simulace zaplnění RAM === Pokud chceš otestovat, zda se swap aktivuje při vysokém využití RAM, spusť tento test: # Simuluje zátěž paměti – využije 90 % dostupné RAM po dobu 30 sekund stress-ng --vm 2 --vm-bytes 90% --timeout 30s Po dokončení testu ověř, zda se swap aktivoval: # Zkontroluje aktuální využití RAM a swapu free -h # Ověří, zda swapspace vytvořil nový swapovací soubor swapon --summary Pokud swapovací soubor nevznikl a RAM je téměř plná, znamená to, že `swapspace` **nefunguje správně** a je potřeba prověřit jeho konfiguraci. === Ověření chování swapu při uvolnění paměti === Chci ověřit, zda `swapspace` uvolňuje swapovací prostor podle nastaveného parametru **upper_freelimit**. K tomu jsem použil následující postup: 1️⃣ Nejprve jsem si zaznamenal aktuální hodnoty využití RAM a swapu: free -h 2️⃣ Poté jsem uvolnil cache a paměť, buď zavřením několika aplikací, nebo pomocí příkazu: sync && echo 3 | sudo tee /proc/sys/vm/drop_caches Tento příkaz: - **`sync`** zajistí, že se všechna data z paměti zapíší na disk. - **`echo 3 > /proc/sys/vm/drop_caches`** vyprázdní cache, což okamžitě uvolní část paměti. 3️⃣ Po uvolnění paměti jsem znovu zkontroloval využití RAM a swapu: free -h Pokud `swapspace` funguje správně, měl by swapovací soubor začít mizet, pokud dostupná RAM překročí hodnotu **upper_freelimit** nastavenou v `/etc/swapspace.conf`. Pokud se swap neodstranil, může být problém v konfiguraci `swapspace`, který je potřeba dále analyzovat. ==== Použití `cgroups` k omezení swapování per proces ==== Další možností, jak omezit swapování, je využití **cgroups**, které umožňují řídit využití zdrojů pro jednotlivé procesy nebo uživatelské skupiny. V Xubuntu (a obecně v systémech založených na Ubuntu/Debianu) lze nastavit omezení swapování pomocí `systemd` a `cgroups v2`. === Povolení swapového limitu v jádře === Nejprve je třeba zajistit, že systém umožňuje řízení swapu pomocí `cgroups`. V Ubuntu 20.04+ a novějších je podpora obvykle aktivní, ale pro jistotu ji lze zapnout úpravou GRUBu: echo "GRUB_CMDLINE_LINUX_DEFAULT=\"$GRUB_CMDLINE_LINUX_DEFAULT swapaccount=1\"" | sudo tee -a /etc/default/grub sudo update-grub sudo reboot Po restartu ověř, zda je swapový limit aktivní: cat /proc/cmdline | grep swapaccount=1 Pokud se ve výstupu objeví `swapaccount=1`, je nastavení aktivní. === Zakázání swapování pro všechny procesy uživatele === Pokud chceš zcela zakázat swap pro všechny procesy běžící pod aktuálním uživatelem (např. u desktopového prohlížeče), použij: sudo systemctl set-property user-$(id -u).slice MemorySwapMax=0 Tento příkaz: - Omezuje swapování pro všechny procesy aktuálního uživatele. - Po restartu systému se nastavení zachová. Pokud chceš nastavení aplikovat na konkrétní službu spravovanou systemd, například prohlížeč běžící jako služba: sudo systemctl set-property firefox.service MemorySwapMax=0 === Omezení swapu pro konkrétní procesy === Pokud chceš nastavit konkrétní limit pro swap u určité aplikace, můžeš použít `cgroups` ručně: 1️⃣ **Vytvoř cgroup pro daný proces**: sudo mkdir -p /sys/fs/cgroup/memory/limited_swap 2️⃣ **Nastav maximální povolený swap na 500 MB**: echo 500M | sudo tee /sys/fs/cgroup/memory/limited_swap/memory.memsw.limit_in_bytes 3️⃣ **Přidej běžící proces do této cgroup**: echo $$ | sudo tee /sys/fs/cgroup/memory/limited_swap/cgroup.procs Tímto způsobem se omezení aplikuje na procesy běžící v této skupině. === Ověření správné funkčnosti === Po aplikaci změn můžeš ověřit, zda omezení swapu funguje: cat /sys/fs/cgroup/memory/limited_swap/memory.memsw.limit_in_bytes Pokud se ve výstupu zobrazí správná hodnota (např. **500 MB**), konfigurace funguje. Pokud chceš zjistit, které procesy v cgroup běží: cat /sys/fs/cgroup/memory/limited_swap/cgroup.procs 📌 **Tímto způsobem lze swapování jemně řídit na úrovni uživatelů i jednotlivých aplikací.** ==== Použití `zswap` ==== Pokud nechceš dynamické swap soubory, ale raději kompresi dat v RAM, můžeš použít **zswap**, který je součástí jádra. `zswap` uchovává swapovaná data v RAM ve **zkomprimované podobě** a na disk zapisuje pouze tehdy, pokud už není místo. **Aktivace `zswap`**: echo zswap.enabled=1 | sudo tee -a /etc/default/grub.d/99-zswap.cfg sudo update-grub sudo reboot Po restartu ověř, zda je `zswap` aktivní: cat /sys/module/zswap/parameters/enabled Výstup by měl být **`Y`**, což znamená, že `zswap` je zapnutý. 📌 **Tím swapování probíhá primárně v RAM a na disk jde méně dat, což snižuje opotřebení disku a zlepšuje výkon.**