Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
it:server:pamet-ram-swap [2025/01/12 23:40] – [Jak vytvořit a zapnout swap file na Raspberry Pi] Petr Nosek | it:server:pamet-ram-swap [2025/02/14 12:29] (aktuální) – [Použití `cgroups` k omezení swapování per proces] Petr Nosek | ||
---|---|---|---|
Řádek 53: | Řádek 53: | ||
<code bash> | <code bash> | ||
sudo swapon /swapfile | sudo swapon /swapfile | ||
+ | sudo swapon --show | ||
</ | </ | ||
Řádek 69: | Řádek 70: | ||
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. | 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`**, | ||
+ | |||
+ | Hodnotu jsem dočasně upravil příkazem: | ||
+ | |||
+ | <code bash> | ||
+ | sudo sysctl -w vm.swappiness=10 | ||
+ | </ | ||
+ | |||
+ | Pro trvalou změnu jsem upravil konfigurační soubor: | ||
+ | |||
+ | <code bash> | ||
+ | echo " | ||
+ | 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**, | ||
+ | |||
+ | Instalace proběhla jednoduše: | ||
+ | |||
+ | <code bash> | ||
+ | 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`: | ||
+ | |||
+ | <code bash> | ||
+ | sudo nano /etc/fstab | ||
+ | </ | ||
+ | |||
+ | A odstranil/ | ||
+ | |||
+ | <code bash> | ||
+ | sudo swapoff -a | ||
+ | sudo rm -f /swapfile | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === Konfigurace `swapspace` === | ||
+ | Po odstranění pevně definovaného swapu jsem upravil konfigurační soubor **`/ | ||
+ | |||
+ | <code bash> | ||
+ | sudo nano / | ||
+ | </ | ||
+ | |||
+ | A upravil jsem následující parametry: | ||
+ | |||
+ | <code ini> | ||
+ | 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, | ||
+ | |||
+ | ---- | ||
+ | |||
+ | === Restart swapspace a ověření funkčnosti === | ||
+ | Po úpravě konfigurace jsem restartoval `swapspace`, | ||
+ | |||
+ | <code bash> | ||
+ | sudo systemctl restart swapspace | ||
+ | </ | ||
+ | |||
+ | Ověření správné funkčnosti proběhlo příkazem: | ||
+ | |||
+ | <code bash> | ||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | # Zobrazí aktuální využití swapu a volné paměti | ||
+ | free -h | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Sleduje logy swapspace a zobrazí posledních 50 záznamů | ||
+ | journalctl -u swapspace --no-pager | tail -n 50 | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Zkontroluje stav swapspace služby | ||
+ | systemctl status swapspace | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Ověří, zda je nějaký swap aktivní | ||
+ | swapon --summary | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Sleduje dynamické vytváření a odstraňování swapu v reálném čase | ||
+ | sudo tail -f / | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Zobrazí detailní informace o aktuálně aktivních swapových zařízeních/ | ||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | # 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: | ||
+ | |||
+ | <code bash> | ||
+ | # Zkontroluje aktuální využití RAM a swapu | ||
+ | free -h | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # 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: | ||
+ | |||
+ | <code bash> | ||
+ | free -h | ||
+ | </ | ||
+ | |||
+ | 2️⃣ Poté jsem uvolnil cache a paměť, buď zavřením několika aplikací, nebo pomocí příkazu: | ||
+ | |||
+ | <code bash> | ||
+ | sync && echo 3 | sudo tee / | ||
+ | </ | ||
+ | |||
+ | Tento příkaz: | ||
+ | - **`sync`** zajistí, že se všechna data z paměti zapíší na disk. | ||
+ | - **`echo 3 > / | ||
+ | |||
+ | 3️⃣ Po uvolnění paměti jsem znovu zkontroloval využití RAM a swapu: | ||
+ | |||
+ | <code bash> | ||
+ | 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 `/ | ||
+ | |||
+ | Pokud se swap neodstranil, | ||
+ | |||
+ | |||
+ | ==== Použití `cgroups` k omezení swapování per proces ==== | ||
+ | |||
+ | Další možností, jak omezit swapování, | ||
+ | |||
+ | === 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: | ||
+ | |||
+ | <code bash> | ||
+ | echo " | ||
+ | sudo update-grub | ||
+ | sudo reboot | ||
+ | </ | ||
+ | |||
+ | Po restartu ověř, zda je swapový limit aktivní: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | </ | ||
+ | |||
+ | Pokud se ve výstupu objeví `swapaccount=1`, | ||
+ | |||
+ | === 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), | ||
+ | |||
+ | <code bash> | ||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | 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**: | ||
+ | |||
+ | <code bash> | ||
+ | sudo mkdir -p / | ||
+ | </ | ||
+ | |||
+ | 2️⃣ **Nastav maximální povolený swap na 500 MB**: | ||
+ | |||
+ | <code bash> | ||
+ | echo 500M | sudo tee / | ||
+ | </ | ||
+ | |||
+ | 3️⃣ **Přidej běžící proces do této cgroup**: | ||
+ | |||
+ | <code bash> | ||
+ | echo $$ | sudo tee / | ||
+ | </ | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | </ | ||
+ | |||
+ | Pokud se ve výstupu zobrazí správná hodnota (např. **500 MB**), konfigurace funguje. | ||
+ | |||
+ | Pokud chceš zjistit, které procesy v cgroup běží: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | </ | ||
+ | |||
+ | 📌 **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`**: | ||
+ | |||
+ | <code bash> | ||
+ | echo zswap.enabled=1 | sudo tee -a / | ||
+ | sudo update-grub | ||
+ | sudo reboot | ||
+ | </ | ||
+ | |||
+ | Po restartu ověř, zda je `zswap` aktivní: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | </ | ||
+ | |||
+ | 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.** | ||