Tworzenie i konfiguracja pliku swap w Linuksie

A high-angle, cinematic 3D visualization of computer memory management and data flow. In a dark, sophisticated digital environment, glowing pulses of electric blue light represent active RAM, transitioning smoothly into a dedicated, translucent architectural block on a sleek, metallic storage drive. Luminous data particles and fiber-optic lines connect the two components, symbolizing the seamless expansion of system memory into a swap file. The aesthetic is futuristic and technical, featuring soft bokeh, neon accents, and a shallow depth of field that emphasizes the high-speed transfer of information in a server-like atmosphere.

Tworzenie pliku swap w systemie Linux jest elastyczną alternatywą dla tradycyjnych partycji wymiany. Proces obejmuje wygenerowanie pliku o określonej wielkości, nadanie mu odpowiednich uprawnień oraz konfigurację automatycznego montowania w systemie. Rozwiązanie to pozwala na łatwe zarządzanie przestrzenią wymiany bez konieczności repartycjonowania dysku.

Ważnym elementem optymalizacji jest parametr swappiness, który określa intensywność korzystania z pamięci wymiany przez jądro systemu. Dostosowanie tej wartości pozwala na zwiększenie wydajności serwerów i baz danych. Użytkownik może wprowadzać zmiany tymczasowe lub trwałe, dopasowując działanie systemu do dostępnej pamięci RAM i specyfiki obciążeń.

Postanowiłem nie rozpoczynać bloga wpisem z powitaniem – zamiast tego od razu przejdźmy do konkretów. Dzisiejszym tematem będzie ściągawka do tworzenia i konfiguracji pliku swap w Linuksie.

1. Wstęp

Dotychczas zasadą było tworzenie osobnej partycji swap – według utartych starych zasad mającą pojemność dwukrotnie większą od zainstalowanej pamięci RAM. Już od kilku dobrych lat odchodzi się od tworzenia takich partycji, a zamiast tego stosuje się plik swap – często dynamiczny lub w ogóle go się nie stosuje.

Ma to swoje uzasadnienie w coraz większych wielkościach pamięci RAM – przez co w mniejszym stopniu wykorzystywany jest swap, oraz szybszych dyskach SSD / NVMe, przez co nie ma potrzeby tworzenia osobnej partycji do zwiększenia wydajności. Czasem jednak zachodzi potrzeba dodania takiej przestrzeni wymiany, albo dołożenia drugiej do obecnej – jeżeli jest zbyt mała partycja i nie chcemy bawić się w repartycjonowanie dysku na serwerze produkcyjnym.

2. Utworzenie pliku swap

Poniżej szybka ścieżka utworzenia i zarządzania plikiem swap.

Zalecaną i najszybszą metodą jest polecenie fallocate:

sudo fallocate -l 512M /swapfile1

Sposób ten może nie zadziałać w starszych Linuksach, lub np. na systemach plików XFS. W takim przypadku zastosujmy pewniejszy, chociaż nieco wolniejsze polecenie dd.

Na początku musimy określić wielkość pliku, załóżmy że będzie to 512MB. Musimy przemnożyć tę wartość przez 1024, co daje nam 524288. Dlaczego tak? 1024 to wartość w bajtach (czyli 1KB), a wynik to ilość bloków potrzebnych aby uzyskać 512MB przestrzeni.

sudo dd if=/dev/zero of=/swapfile1 bs=1024 count=524288

Możemy w poleceniu wskazać inną ścieżkę dla pliku, oraz również inną nazwę.

Plik swap przechowuje zawartość pamięci RAM, mogą tam być wrażliwe dane. Musimy więc zabezpieczyć dostęp do pliku odpowiednimi uprawnieniami – dostęp tylko dla roota:

sudo chown root:root /swapfile1
sudo chmod 0600 /swapfile1

Teraz mówimy systemowi, że ten plik nie jest zwykłym dokumentem tekstowym, ale systemową przestrzenią wymiany:

sudo mkswap /swapfile1

Uruchamiamy nową przestrzeń swap w systemie:

sudo swapon /swapfile1

3. Zapisanie konfiguracji

Żeby swap działał również po ponownym uruchomieniu komputera, musimy dodać wpis do pliku /etc/fstab. Otwieramy go swoim ulubionym edytorem, np. nano lub vi:

sudo nano /etc/fstab

Schodzimy na sam dół i dopisujemy poniższą linijkę:

/swapfile1 none swap sw 0 0

Od teraz po restarcie swap będzie automatycznie włączony.

Dodatkowym parametrem w kolumnie z opcjami może być priorytet – stosowany w przypadku obecności kilku przestrzeni swap. Przykładowo wskazujemy pierwszy mniejszy, ale na szybkim dysku SSD, a drugi większy na zwykłym HDD w sytuacji awaryjnej kiedy system musi zrzucić dużą ilość pamięci. W takiej sytuacji plik konfiguracyjny będzie wyglądał jak poniżej:

/swapfile1 none swap sw,pri=10 0 0
/swapfile2 none swap sw,pri=5 0 0

Swap znajdujący się w pliku swapfile1 będzie miał tutaj wyższy priorytet i będzie używany w pierwszej kolejności.

Dla testu możemy sprawdzić czy nasz obszar wymiany działa:

swapon --show

Powinniśmy zobaczyć coś podobnego:

NAME              TYPE SIZE USED  PRIO
/var/lib/swapfile file 512M 93,8M -2

4. Dostrajanie, czyli swappiness

Przy okazji warto omówić swappiness, czyli parametr jądra Linuksa, który decyduje o tym, jak agresywnie system ma przenosić dane z pamięci RAM do przestrzeni swap. Ma to wpływ na wydajność systemu – przerzucanie danych i korzystanie ze swapu może drastycznie spowolnić działanie usług przetwarzających dane w pamięci RAM np. bazy danych.

Większość dystrybucji ma domyślnie ustawiony parametr swapiness na poziomie 60 – przy czym przyjmuje on wartości od 0 do 200 (starsze wersje jądra do 100). Działanie jest proste – im niższa wartość tym mniej system korzysta ze swapu.

Sprawdzić aktualną wartość można poniższym poleceniem:

cat /proc/sys/vm/swappiness

Jaka wartość będzie najbardziej optymalna? To zależy od naszego systemu i sposobu w jaki z niego korzystamy.

Dla komputerów PC / laptopów ta wartość w granicach 10 – 30 powinna być wystarczająca

Serwery produkcyjne powinny mieć wartość od 10 do 60 – im więcej pamięci RAM tym możemy dać niższą wartość. Pamiętajmy, że serwery często mogą mieć chwilowe przeciążenia związane z różnymi atakami – wysycenie pamięci RAM i niedostateczna przestrzeń wymiany mogą spowodować zawieszenie działania serwera.

Systemy bazodanowe (MySQL / PostgreSQL) powinny mieć ustawioną wartość jak najniższą: od 1 do 10. Systemy bazodanowe powinny za wszelką cenę operować w pamięci RAM. Zrzucenie bazy do SWAP drastycznie obniża jej wydajność.

Jak zmienić wartość swappiness?

Aby zmienić ustawienia tymczasowo, do kolejnego restartu, należy wydać polecenie:

sudo sysctl vm.swappiness=20

lub poniższe:

sudo echo 20 > /proc/sys/vm/swappiness

Gdy znajdziemy optymalną wartość i chcemy ją zachować po restarcie, musimy zapisać to w pliku konfiguracyjnym:

sudo nano /etc/sysctl.conf

Schodzimy na sam dół pliku i dopisujemy wpis:

vm.swappiness=20

Po zapisaniu, przeładowujemy ustawienia zapisane w pliku poleceniem:

sudo sysctl -p

Od tej pory nowe ustawienia będą na stałe ładowały się przy starcie systemu, aby je zmienić wystarczy dokonać zmian w pliku konfiguracyjnym i przeładować konfigurację.


Jeżeli masz jakieś uwagi lub pytania to zapraszam do kontaktu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *