Raspberry PI OS - plik wymiany (dphys-swapfile)

Spis treści

RPi - dphys-swapfile

Jednym z zagadnień, któremu podczas korzystania z Malinki z Raspbianem OS (32b) początkowo poświęciłem mniej uwagi była domyślna konfiguracja OS'a. Dotyczy to m.in. pliku wymiany (inne nazwy to: swapfile, swap, itp.).

Dla uproszczenia dalej będę używał określenia: swap. Tak jest krócej.

Użytkownicy wszelkiej "maści" Linuksów znają to pojęcie. Czy Raspbian korzysta ze swap'a? Tak. I tu jedna z różnic: nie jest to odrębna partycja, a fizyczny plik. Zarządzający: dphys-swapfile.

Tym co jednak zaskoczy użytkowników Raspbiana (32b) jest jednak (domyślna) wielkość swap'a: 100MB. :/ Inne OS'y (również te oparte na Linuksie) używane na RPi często stosują inną wielkość i organizację swap'a. 

Malinka (np. 4B) miewa "na pokładzie"  nawet 8GB. Toteż swap o rozmiarze 100MB zaskakuje. U wielu - budzi zdziwienie.

Czy w tym Raspbianie swap nadal jest potrzebny? IMO: tak, ale...

Trochę teorii

Na wstępie trzeba przypomnieć (w uproszczeniu) podstawowe kwestie:

  • swap (swapfile) było lub jest to miejsce (w formie np. fizycznego pliku na dysku), w którym OS "składa" dane "chwilowo" nieużywanych procesów. Ważne: nie zawsze dotyczy to użytkowanych przez użytkownika aplikacji. To przeniesienie następuje w chwilach, gdy dostępny RAM (wg. kryteriów systemu) jest zbyt mały. Przeniesienie to ma zapobiec wystąpieniu błędu systemowego tzw. OOM (Out Of Memory).
  • Czytając opisy konfiguracji swapu różnych systemów Linux spotkamy się z informacją, że optymalną  wielkością jest podwojona wielkość dostępnej pamięci RAM.

Stąd pytanie: co z tym swapem pod Raspbianem?

RPI swap - mało używany!

Ogólnie rzecz biorąc nie jest źle, bo OS dość długo zwleka z sięgnięciem po swap'a. :o

Można uruchomić (u mnie na RPi 4B/8GB) wiele procesów (kilka sesji przegladarki, vlc, vnc client'a, kopiowanie plików, itp.), testów (np. stress-ng, itp.) - temperatura struktury (sensownie) rośnie, 4 Cortex'y dzielą się wątkami, wykorzystanie powoli rośnie, a zarządzany (od lat) przez dphys-sawapfile swap... leniuchuje! :D

Moim zdaniem zderzyły się tu historia z terażniejszością:

  • Raspbian i Malinka pierwotnie dysponowały niewielką ilością pamięci RAM. Rolę pamięci masowej spełniały głównie karty SD.
  • Ich cechą charakterystyczną było to, że: prędkość odczytów i (zwłaszcza) zapisów była zdecydowanie mniejsza niż prędkość tych procesów w odniesieniu do RAM.
  • Częstość operacji zapisu na kartę SD w znaczący sposób wpływała na jej trwałość, w tym na (deklarowany przez producenta) limit dostępnych operacji zapisów. Pierwotnie nie zakładano wykorzystania Raspberry Pi jako "konia pociągowego" :D systemów IT. Czas i umiejętności wsparte oczekiwaniami oraz potrzebami użytkowników pokazały jednak, że RPi wiele potrafi. Jeszcze więcej "zniesie" ;)

    Kolejne wersje wyposażano w silniejszy procesor, zwiększano rozmiar RAM. A swap'a pozostawiono jako... alternatywę dla "poważniejszych" zastosowań.
  • Obecnie jedną z najczęściej wprowadzanych zmian "eksploatacyjnych" RPi jest instalacja, uruchamianie i używanie Raspbian OS'a z... szybkich dysków SSD. Nie tylko ich prędkość, ale i ich trwałość jest zdecydowanie większa niż stosowanych dawniej kart SD.
  • Relacja pojemności dysków SSD do ich ceny powoduje, że nie jest rzadkością używanie Malinki z dyskami >128GB i przeznaczanie 1-2GB na swap. Co nie powinno nadwyrężyć naszych zasobów..
  • Założono, że użytkownikowi (zwłaszcza temu mniej doświadczonemu) prościej będzie zmienić (za pomocą edytora tekstowego) rozmiar swap'a poprzez edycję pliku konfiguracyjnego. Maniputacje ze zmianą wielkości ewentualnej partycji swap'a - jak sądzę - pozostawiono tym bardziej: doświadczonym, ambitnym czy... potrzebującym.

100MB to trochę mało...Jakkolwiek dyskusja na temat swapa w Raspbianie nie jest "tematem dnia" to jednak użytkownicy, którzy "dotknęli" zagadnienia prezentują następujące opinie:

  • "bez potrzeby nie ma co ruszać" - to rozwiązanie wydaje się szczególnie dedykowane początkującym użytkownikom RPi z Raspbianem (32b).
    Z moich doświadczeń i testów wynika, że rzeczywiście nawet w domyślnej konfiguracji RPi 4B/8GB trudno zmęczyć czy położyć.

    Dwa kolejne rozwiązania wykluczają się choć sprowadzają się do tezy: "ze swapem trzeba coś zrobić, tzn. ...":
  • "...powiększyć np. do 1-2GB" - zwolennicy tego rozwiązania wskazują, że w konkretnych przypadkach swap może odegrać decydującą rolę. Głównie "ostatniej deski ratunku" w sytuacjach, gdy nawet OOM killer nie dał sobie rady! Nie mam podstaw do podważania cudzych doświadczeń. Mogę jedynie przytaknąć, że IMO 100MB swap (przy dostępnym RAM'ie RPi 2-8GB) niewiele pomoże. Można jednak mieć nadzieję, że ten o wymiarze 1-2GB "na coś się przyda".
  • "...usunąć!" - zwolennicy tego rozwiązania również powołują się na własne doświadczenia. Wskazują, że w konkretnych sytuacjach zanim zadziałał mechanizm swap'a (nawet powiększonego) system już się wyłożył :/ I nic się nie dało zrobić. Poza wyłączeniem i ponownym uruchomieniem RPi.

Zwolennicy ostatnich dwóch rozwiązań w jednym są zgodni: zastosowane w Rapbianie rozwiązanie (dphys-swapfile) jest rzeczywiście dość proste "w obsłudze"Czym zatem jest dphys-swapfile?


dphys-swapfile - zarządzanie swapem

dphys-swapfile - Zarządzanie swapem...Poniższy opis jest niemal dosłownym tłumaczenie pliku pomocy dla procedury dphys-swapfile.

Jakkolwiek niektóre jego fragmenty (tworzono go go przed; a aktualizowano w: 2010) zdają się być nieaktualne to uważam, że generalnie treść opisu funkcji procedury wyjaśnia jej podstawowe założenia.

Autorzy rozwiązania (np. opisując ten pakiet w dystrybucji Debiana) podkreślają, że ich celem było stworzenie narzędzia umożliwiającego (bez potrzeby posiadania partycji wymiany o stałym rozmiarze) "wygenerowanie i uruchomienie pliku swap. Jego rozmiar jest obliczany automatycznie, aby dopasować go do aktualnego rozmiaru pamięci RAM".

Procedura dphys-swapfile - realizuje utworzenie, montowanie i odmontowanie oraz usunięcie pliku wymiany (swapfile)

Składnia: dphys-swapfile setup|install|swapon|swapoff|uninstall
(Wymaga uprawnień supeusera, czyli winna być poprzedzona komendą: sudo - przyp. mój)

Opis: Procedura dphys-swapfile oblicza optymalny rozmiar pliku wymiany (a w razie potrzeby dokonuje zmiany rozmiaru istniejącego pliku), montuje go lub odmontowuje. Usuwa plik swap, gdy nie jest już potrzebny.

Opcje: Tylko jeden ze wskazanych poniżej parametrów może być argumentem komendy dphys-swapfile:

  • setup lub install - oba parametry uruchamiają obliczenie przez dphys-swapfile optymalnego rozmiaru pliku wymiany i ( ew. ponownie) wygenerowanie dopasowanego pliku wymiany. Domyślny rozmiar to 2-krotność rozmiaru pamięci RAM. Procedurę można wywołać podczas rozruchu systemu, więc plik zawsze zachowuje odpowiedni rozmiar z uwzględnieniem wielkości pamięci RAM lub jest uruchamiany ręcznie, gdy zmieni się rozmiar pamięci RAM.
    (Dla systemu Raspbian 32b rozmiar okreslony jest na 100MB przez wpisanie "na sztywno" w pliku konfiguracyjnym (/etc/dphys-swapfile) rozmiaru swap'a. - mój. przyp.)
  • swapon lub swapoff - to komendy uruchamiające lub wyłączające używanie swap'a. Zwróć uwagę, że bezpośrednia aktywacja lub dezaktywacja pliku wymiany za pomocą wpisu w /etc/fstab nie jest możliwa, jak to ma miejsce np. w Debianie. Tu aktywacja/deaktywacja swapu następuje podczas wykonywania tego samego skryptu, który wskazuje na lokalizację pliku wymiany (domyślnie: /var). Procedury te pomijają wpisy w /etc/fstab.
  • uninstall - usuwa z dysku zbędny (niechciany) plik swap, automatycznie zwalniając na dysku zajmowane przez niego miejsce.

Konfiguracja: Plik konfiguracyjny /etc/dphys-swapfile pozwala użytkownikowi na konfigurację środowiska uruchomienia usługi dphys-swapfile. To skrypt powłoki, zawierający szereg przypisań (nadawania wartości określonym zmiennym). Składnia jest zgodna z zasadani tworzenia skrytptów powłoki (sh).

Przypisania dotyczą:
CONF_SWAPFILE - określa, gdzie plik wymiany ma być umieszczony. Domyślnie to katalog /var/swap. Jest mało prawdopodobne byś chciał to zmieniać. Chyba, że chciałbyś wykorzystać standardową partycję wymiany.
 
CONF_SWAPSIZE - określa rozmiar swap'a, wyrażony w MB. Pozostawiając tę wartość pustą (ustawienie domyślne, ale nie w Raspbianie - przyp. mój) wymusza zastosowanie wartości wyliczonej. Wykorzystanie tej wartości jest mało prawdopodobne, chyba że w jakiś mało przewidywalnych sytuacjach na dysku. Należy zwrócić uwagę że wskazanie wartości mniejszej niż rozmiar RAM'u w przypadku maszyn wirtualnych (VM) dla niektórych kerneli\systemów może generować problemy.
(Dla systemu Raspbian 32b rozmiar ustawiony jest na 100MB. - mój. przyp.)

CONF_SWAPFACTOR - ustawia rozmiar pliku wymiany zgodnie z wyliczeniem w oparciu w wskaźnik wielokrotności wielkości dostępnego RAMu. Używa tej wartości (podczas obliczeń) do pomnożenia rozpoznanego rozmiaru pamięci RAM. Pozwala to na dynamiczne dostosowanie się do RAM, zapewniając wystarczającą wielkość pliku wymiany w systemach o dużej pamięci RAM, bez nadmiernego uszczuplania miejsca na dysku w systemach o małym RAM (oraz dyskach?). Domyślnie ustawiona na 2, co daje rozmiar pliku wymiany = 2*RAM.
(Ten parametr jest w Rasbian domyślnie wyłączony - przyp. mój).

CONF_MAXDISK_PCT - ustawia maksymalny (procentowy) udział miejsca na dysku, wykorzystywany przez swap. Procedura uwzględnia potencjalnie już istniejące pliki wymiany dphys-swapfile, tj. odejmuje ich rozmiar przed obliczeniem ostatecznej wartości (procentowej) od dostępnego miejsca na dysku. Domyślnie to 50%. Ustawiając pustą wartość zmiennej kontrola zostaje wyłączona.

CONF_MAXSWAP Ustawienie ograniczenia rozmiaru maksymalnej obliczonej wielkości swap'a, wyrażonej w MB. Domyślnie jest to 2048GB, który był wcześniej limitem wynikającym z 32-bitowej architektury kernela (i CPU). Obecnie jest limitem zapobiegającym tworzenie bezsensownie dużych plików wymiany w systemach wyposażonych w dużą ilość pamięci RAM.

Pliki: /etc/dphys-swapfile to plik konfiguracyjny umożliwiający administratorowi konfigurowanie swap'a.

Przykłady: procedura dphys-swapfile jest uruchamiana podczas startu lub zamykania systemu poprzez skrypt zawarty w /etc/init.d (tak jest w RASPbian OS - przyp. mój lub w /etc/rc.d):

#!/bin/sh
# /etc/init.d/dphys-swapfile - uruchamia automatycznie plik wymiany
# Author franklin, ostatnia modyfikacja 2004.06.04
# This script is copyright ETH Zuerich Physics Departement,
# use under either modified/non-advertising BSD or GPL license
case "$1" in
start)
  /sbin/dphys-swapfile setup
  /sbin/dphys-swapfile swapon
  ;;

stop)
  /sbin/dphys-swapfile swapoff
  ;;

esac
exit 0

Jeśli administrator chce umieścić plik swap w innej lokalizacji, np. /var/tmp/swap może tego dokonać nadając zmiennej CONF-SWAPFILE w pliku /etc/dphys-swapfile wartość: /var/tmp/swap.

Należy zwrócić uwagę, że dla prawidłowego przebiegu procedury inicjacji swap'a za pomocą dphys-swapfile koniecznym jest by w trakcie jej wywołania katalog wskazanej lokalizacji był już dostępny (zamontowany)!


Zwiększanie rozmiaru swap'a

dphys-swapfile - Zwiększanie rozmiaru swap'aJak już wspomniałem ustawiony domyślnie w systemie Raspbian 32b rozmiar swap'a (100MB) trudno uznać za wystarczający. Dlatego też postanowiłem zwiększyć jego rozmiar do 1GB.

Wykonanie tej modyfikacji nie jest szczególnie skomplikowana.

By uniknąć rozczarowań przed modyfikacją pliku /etc/dphys-swapfile należy wyłączyć swap'a. Następnie przystępujemy do edycji (tu: wykorzystując edytor nano) pliku konfiguracyjnego.

Do ich wykonania tych czynności potrzebujesz uprawnień superusera, czyli odpowiednie komendy trzeba poprzedzić komendą: sudo!

~$ sudo dphys-swapfile swapoff; sudo nano /etc/dphys-swapfile

dphys-swapfile - aktywacja po modyfikacjiW pliku /etc/dphys-swapfile wyszukujemy frazę: CONF_SWAPSIZE=100. Wartość zmiennej po znaku równości zmieniamy na 1024, czyli teraz: CONF_SWAPSIZE=1024.

Zapisujemy zmodyfikowaną treść pliku (Ctrl+O), a następnie wychodzimy z trybu edycji (Ctrl+X).

Plik konfiguracyjny został zapisany. Uaktywnienie swapa "w nowym wymiarze" możemy zainicjować wydają cią następujacych komend:

~$ sudo dphys-swapfile setup (ew. sudo dphys-swapfile swapon); sudo reboot

Oczywiście ostatnia z komend ma za zadanie zrestartować nasze RPi.

dphys-swapfile - 1GB swapa! :DPo restarcie nie pozostaje nic innego jak... sprawdzić czy rzeczywiście nasza modyfikacja okazała się skuteczna.

Wystarczy zajrzeć do katalogu: /var. Do tego celu wykorzystuję poczciwego Midnight Commandera. Jak widać na załączonym obrazku teraz swap wygląda już okazalej.

Na marginesie poziom jego wykorzystania nadal nie odbiega od tego, który opisałem na wstępie niniejszego artykułu. Pamiętacie: Ok!!! :D

Całkowite usunięcie swap'a

dphys-swapfile - usunięcie swapa :]W takiej sytuacji nie pozostało mi nic innego jak... spradzić jak moja Malinka z Raspbianem OS (32b) poradzi sobie bez swapa.

W sieci można spotkać się z sugestiami, że wydanie komendy: sudo dphys-swapfile swapoff wystarczy do deaktywacji swapa. Tak, ale do deaktywacji tymczasowej.

Opisując procedurę dphys-swapfile wskazywałem, że po uruchomieniu ponownie zostanie zainicjowane użytkowanie swapa. Wynika to z obecności w katalogu /etc/init.d odpowiedniego skryptu inicjującego.

By na stałe wyłączyć dphys-swapfile  należy wywołać ciąg komend:

~$ sudo systemctl disable dphys-swapfile; sudo dphys-swapfile swapoff; sudo dphys-swapfile uninstall; sudo reboot

Przeprowadzone testy za pomocą stress-ng, jak i praktyczne wykazały dużą odporność M3 (Mojej Malinowej Maszyny) na "przeciążenie i przeładowanie". :)

Początkowo przeprowadziłem nawet deinstalację pakietu zarządzajacego tą usługą (dphys-swapfile), ale potem doinstalowałem ponownie. Nie jest on duży (ok. 29kB). I może się jednak (w przyszłości) przyda.

Zagadnienia opisane w niniejszym artykule są pokłosiem doświadczeń związanych z realizacją projektu "Mikroskop do lutowania (RPi 4B+HQC+M42)".

Jeśli jesteś zainteresowany tym na co "marnotrawię swój czas" zapraszam do Warsztatu krótkofalowca.