it:server:pamet-ram-swap

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

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 Nosekit: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
 </code> </code>
  
Řá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`**, 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:
 +
 +<code bash>
 +sudo sysctl -w vm.swappiness=10
 +</code>
 +
 +Pro trvalou změnu jsem upravil konfigurační soubor:
 +
 +<code bash>
 +echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
 +sudo sysctl -p
 +</code>
 +
 +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:
 +
 +<code bash>
 +sudo apt install swapspace
 +</code>
 +
 +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
 +</code>
 +
 +A odstranil/překomentoval řádek obsahující `swap`. Poté jsem deaktivoval stávající swap:
 +
 +<code bash>
 +sudo swapoff -a
 +sudo rm -f /swapfile
 +</code>
 +
 +----
 +
 +=== 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:
 +
 +<code bash>
 +sudo nano /etc/swapspace.conf
 +</code>
 +
 +A upravil jsem následující parametry:
 +
 +<code ini>
 +lower_freelimit=15
 +upper_freelimit=20
 +freetarget=18
 +</code>
 +
 +=== 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:
 +
 +<code bash>
 +sudo systemctl restart swapspace
 +</code>
 +
 +Ověření správné funkčnosti proběhlo příkazem:
 +
 +<code bash>
 +free -h
 +</code>
 +
 +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>
 +
 +<code bash>
 +# Sleduje logy swapspace a zobrazí posledních 50 záznamů
 +journalctl -u swapspace --no-pager | tail -n 50
 +</code>
 +
 +<code bash>
 +# Zkontroluje stav swapspace služby
 +systemctl status swapspace
 +</code>
 +
 +<code bash>
 +# Ověří, zda je nějaký swap aktivní
 +swapon --summary
 +</code>
 +
 +<code bash>
 +# Sleduje dynamické vytváření a odstraňování swapu v reálném čase
 +sudo tail -f /var/log/syslog | grep swapspace
 +</code>
 +
 +<code bash>
 +# Zobrazí detailní informace o aktuálně aktivních swapových zařízeních/souborech
 +cat /proc/swaps
 +</code>
 +
 +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
 +</code>
 +
 +Po dokončení testu ověř, zda se swap aktivoval:
 +
 +<code bash>
 +# Zkontroluje aktuální využití RAM a swapu
 +free -h
 +</code>
 +
 +<code bash>
 +# Ověří, zda swapspace vytvořil nový swapovací soubor
 +swapon --summary
 +</code>
 +
 +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
 +</code>
 +
 +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 /proc/sys/vm/drop_caches
 +</code>
 +
 +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:
 +
 +<code bash>
 +free -h
 +</code>
 +
 +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:
 +
 +<code bash>
 +echo "GRUB_CMDLINE_LINUX_DEFAULT=\"$GRUB_CMDLINE_LINUX_DEFAULT swapaccount=1\"" | sudo tee -a /etc/default/grub
 +sudo update-grub
 +sudo reboot
 +</code>
 +
 +Po restartu ověř, zda je swapový limit aktivní:
 +
 +<code bash>
 +cat /proc/cmdline | grep swapaccount=1
 +</code>
 +
 +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:
 +
 +<code bash>
 +sudo systemctl set-property user-$(id -u).slice MemorySwapMax=0
 +</code>
 +
 +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
 +</code>
 +
 +=== 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 /sys/fs/cgroup/memory/limited_swap
 +</code>
 +
 +2️⃣ **Nastav maximální povolený swap na 500 MB**:
 +
 +<code bash>
 +echo 500M | sudo tee /sys/fs/cgroup/memory/limited_swap/memory.memsw.limit_in_bytes
 +</code>
 +
 +3️⃣ **Přidej běžící proces do této cgroup**:
 +
 +<code bash>
 +echo $$ | sudo tee /sys/fs/cgroup/memory/limited_swap/cgroup.procs
 +</code>
 +
 +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 /sys/fs/cgroup/memory/limited_swap/memory.memsw.limit_in_bytes
 +</code>
 +
 +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 /sys/fs/cgroup/memory/limited_swap/cgroup.procs
 +</code>
 +
 +📌 **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 /etc/default/grub.d/99-zswap.cfg
 +sudo update-grub
 +sudo reboot
 +</code>
 +
 +Po restartu ověř, zda je `zswap` aktivní:
 +
 +<code bash>
 +cat /sys/module/zswap/parameters/enabled
 +</code>
 +
 +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.**
  
  • it/server/pamet-ram-swap.1736725219.txt.gz
  • Poslední úprava: 2025/01/12 23:40
  • autor: Petr Nosek