Die SWAP - Datei

  • Raspi 4/5 kommen schon mit relativ viel Speicher daher, daher verlagert sich das Aufgabengebiet von der Serveranwendung in Richtung Clientanwendung. 2 Bildschirme, ein Officepaket eine Datenbank, Firefox mit 20 Tabs und und und..... irgendwann werden dann die 8GB Speicher knapp und das System kommt in pagein/out und in swap-in/out.

    Eine Standard Raspian-OS installation kommt mit einer 200MB Swap-Datei daher. M. M. lächerlich klein.


    Was ist jetzt swapin/out bzw pagein/out überhaupt.



    Bis in die 80er Jahre hat ein System nur swapin/out gekannt. Dabei wurde immer ein kompletter Prozess in einem Bereich der Festplatte geschrieben (swap) und der Speicher war für eine andere Task frei und konnte verwendet werden. Bei HD-Zugriffszeiten um 8ms war das für den Benutzer ein gemütliches Unterfangen. Ich glaube AT&T hatte die Idee das Ganze nicht mehr mit Prozessen zu machen sondern mit Speicherseiten (Pages). Dadurch ist es möglich nur mehr mit kleinen Datenmengen zu operieren und prophylaktisch schon ein pageout zu starten auch wenn es noch gar nicht notwendig ist.

    Der eine oder andere wird sich vielleicht wundern, dass seine Top-anzeige so aussieht.

    Code
    top - 10:27:40 up 22 min,  3 users,  load average: 0,17, 0,07, 0,09
    Tasks: 182 total,   2 running, 180 sleeping,   0 stopped,   0 zombie
    %CPU(s):  2,6 us,  1,2 sy,  0,0 ni, 95,8 id,  0,4 wa,  0,0 hi,  0,1 si
    MiB Spch:    416,9 total,    131,9 free,    251,8 used,     99,1 buff/
    MiB Swap:    200,0 total,      0,1 free,    199,9 used.    165,1 avail

    Und da sieht man das der Swap schon voll ist. Nach 20 Min Laufzeit und der Raspi wurde nur gebootet ;) Ihr seht ein pageout kommt sehr früh zustande.

    Wie groß soll der Swap jetzt sein?

    In Zeiten der TB großen SSD sollte es auf ein paar GB nicht ankommen. Die alte Regel lautete maximal 3 mal des Speichers. Bei einem 8GB Raspi wären das 24GB. Wobei ich mir mit dem Rechnen leichter tue und 16 oder 32GB nehme. Es liegt an euch wie viel Platz ihr auf welchem Medium habt, aber dazu später mehr.


    Wo finde ich jetzt meinen Swap-Bereich?


    Nun das Schöne ist, dass er überall im System sein darf. Als eigene Partition, als eigene Platte und als Datei. Er kann sogar auf einem Netzlaufwerk sein. Aber Achtung: Er sollte im permanenten Zugriff sein .
    Und es dürfen auch beliebig viele existieren. Standard mäßig wird der Swap im Verzeichnis /var mit dem Namen swap angelegt. Also ein

    Code
    sudo ls -lh /var/swap 

    zeigt Dir jetzt eine SWAP-Datei von 200MB. jetzt kann aber so ein Guru den Swap irgendwo anders hingelegt haben und ich habe es vergessen.
    Dann ist es Zeit einen kleinen Befehl am Terminal zu lernen:

    Code
    sudo swapon -s  

    und dir ist klar wo er ist.

    Alle Befehle die jetzt kommen benötigen root-Rechte.
    Entweder ihr schreibt immer sudo vor das Kommando oder ihr wechselt jetzt auf die root-ebene. Ich erspare mir ab jetzt das sudo und wechsle auf root mit einem sudo -s

    Legen wir jetzt eine Swap-Datei mit 1GB an und hängen sie einfach dazu.

    Code
    fallocate -l 1G  /var/swap2

    erstellt eine Datei mit 1GB Größe die als zusätzlicher Swap dienen soll. Dann müssen wir die Berechtigung richtig setzen. Swap ist da ein bisschen empfindlich und meckert, wenn andere Leute da hineinschreiben oder lesen können.

    Code
    chmod 600 /var/swap2
    mkswap /var/swap2

    Ein mkswap als 3. Befehl, baut noch die Filesystemstruktur des Swap auf.

    Was fehlt noch? Natürlich, wir müssen den System noch sagen: verwende diese.

    Code
    swapon /var/swap2

    und schon hat unser Raspi 1GB mehr.

    Das Top liefert jetzt .....

    Code
    top - 11:29:56 up  1:24,  3 users,  load average: 0,03, 0,01, 0,00
    Tasks: 183 total,   2 running, 181 sleeping,   0 stopped,   0 zombie
    %CPU(s):  1,0 us,  0,5 sy,  0,0 ni, 98,5 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st 
    MiB Spch:    416,9 total,    140,4 free,    255,3 used,     86,9 buff/cache     
    MiB Swap:   1224,0 total,   1024,2 free,    199,8 used.    161,6 avail Spch

    Firefox, Thunderbird und Co werden von diesem zusätzlich GB profitieren. Als gebranntes Kind war bei mir die Bildbearbeitung ein kleiner Speicherfresser. Ich habe meinen Raspi kurzfristig 64GB mehr gegeben und das Bild ist fertig. ;)

    Habe ich schon erwähnt, dass dieses vorgehen nur bis zum nächsten reboot gilt. Danach ist das zusätzlich GB vergessen. Ein swapon aktiviert dieses GB allerdings zu jeden Zeitpunkt wieder.

    Wie mache ich den Swap für immer groß?

    dazu gibt es auf allen Debian das Paket dphys-swapfile das mit apt u.U. nachinstalliert werden muss. Raspian-OS hat es schon von Haus aus installiert.
    Dazu gibt es die Datei /etc/dphys-swapfile. Dies ist die Konfiguration für den Swap

    CONF_SWAPSIZE (grün) kann bis auf die Hälfte! der freien Kapazität hochgesetzt werden. Größe Werte werden automatisch auf den maximale "freier Platz/2" zurückgesetzt.

    Wer jetzt glaubt, mit diesen paar Parameter ist man glücklich, der beachte das die restlichen (gelben) auskommentiert sind. Da kommt jetzt ein Script gleichen namens unter /sbin/dphys-swapfile ins Spiel.


    und da sind sie wieder unsere Default-Werte. Achtung: Beim nächsten Update auf das Paket werden diese überschrieben.
    CONF_MAXDISK_PCT ist mehr oder weniger sinnlos. In Zeile 91 dieses Script wird die Berechnung immer auf die Hälfte des verfügbaren Platzes oder weniger zurückgesetzt.

    Beispiel 32GB MSD, 17GB belegt --> maximaler Swap (32-17)/2 = 7,5 GB die Swap wird somit mit dieser Größe angelegt.

    Ich hoffe, dass das hilft die Vorgänge zu verstehen und wünsche Euch gutes gelingen.

    Noch ein paar nützliche Kommandos

    free -h liefert eine Übersicht über die Speichernutzung.

    swapoff /var/swap2 nimmt in unserem Beispiel den zusätzlichen Swap wieder offline.


    Zu guter Letzt oder was man noch wissen sollte.

    - Die Platte(n) auf denen der/die Swaps liegen sollte möglichst schnell sein (SSD).

    - beachtet das bei 32bit System die maximal Speichernutzung 4GB ist. Das System kann nicht mehr adressieren.


    BACKUP vorher nicht vergessen!!

    Meine Antwort ist 21 und nicht 42.

  • Willkommen in den heiligen Hallen der Forumsperlen.

    Jürgen Böhm
    April 4, 2020 at 9:05 AM

    MfG

    Jürgen

  • - beachtet das bei 32bit System die maximal Speichernutzung 4GB ist. Das System kann nicht mehr adressieren.

    Das stimmt so nicht. Der Adressraum eines einzelnen Prozesses ist auf 4GiB beschränkt, das System kann aber mehrere solcher Prozesse laufen lassen. Ein 32-Bit Raspberry Pi OS hat beispielsweise auf einem Raspi 4 mit 8 GiB kein Problem den gesamten Speicher zu nutzen.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

  • - beachtet das bei 32bit System die maximal Speichernutzung 4GB ist. Das System kann nicht mehr adressieren.

    Das stimmt so nicht. Der Adressraum eines einzelnen Prozesses ist auf 4GiB beschränkt, das System kann aber mehrere solcher Prozesse laufen lassen. Ein 32-Bit Raspberry Pi OS hat beispielsweise auf einem Raspi 4 mit 8 GiB kein Problem den gesamten Speicher zu nutzen.

    1. wie groß kann eine einzelne Datei auf einem 32 Bit System werden?
    2. Ein 8GB Raspi und ein 32 Bit-System werden NIE mehr als 4GB nutzen.

    Meine Antwort ist 21 und nicht 42.

  • Was auch schön wäre ist, wenn der Weg zum Konfigurieren von swap via systemd und systemd swap Units beschrieben würde. systemd ist nun mal seit ~10 Jahren auf den allermeisten Linux-Systemen Stand der Dinge.

    Gruß, noisefloor

    Sorry das ist nicht so ganz herausgekommen.
    Aber das systemd-service "dphys-swapfile" ist genau jenes Services das den Swap beim boot anlegt/ in Zugriff nimmt. Zu händeln mit den üblichen Verdächtigen (start/stop/enable/status etc).

    Meine Antwort ist 21 und nicht 42.

  • 1. wie groß kann eine einzelne Datei auf einem 32 Bit System werden?

    Sehr groß! (bis zu 256TiB) Siehe hier: https://www.kernel.org/doc/html/lates…iew.html#blocks

    Datei nicht Filesystem ....
    Im Filesystem würde es noch größer gehen. Bis in den Exabyte-Bereich bei ZFS.
    Hier ist es ganz gut beschrieben https://de.wikipedia.org/wiki/4-GB-Grenze

    Apropo File-System: Im Linux-Source gabt es mal den Kommantar bei der Referenzierung von Superblocks (die sind Verkettet) . das alles ab der 3. Ebene noch nicht getestet ist. Es fehlt die Platte.

    Meine Antwort ist 21 und nicht 42.

  • juhu01 Doch auf einem 32-Bit Linux werden auch 8 GiB RAM genutzt. Wie gesagt, der Adressraum für die einzelnen Prozesse ist jeweils auf 4GiB begrenzt. Insgesamt geht ab ARMv7A 40 Adressbits und Linux kann das auch. Auf Intel-kompatiblen Prozessoren gab es das sogar schon knapp 10 Jahre vorher, das 32-Bit-Systeme mehr als 4 GiB nutzen können.

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.”
    — Nathaniel Borenstein

  • Hallo,

    juhu01: mein Post zielte eher auf systemd swap Units ab.

    Gruß, noisefloor

    Du willst also den Swap in der fstab verwalten? Die wird zum Boot ausgelesen und systemd übergeben.
    Du musst dazu einen Swap anlegen wie beschrieben bzw du resevierst Dir eine Partition und machst dann ein mkswap auf die Partition/File.

    Dann ist in der /etc/fstab einzutragen.

    bei einer Partition

    Quote

    /dev/sd(x)(y) swapblabla swap defaults,noauto 0 0

    oder

    Quote

    UUID= UUID_vom_mkswap swapblabla swap defaults,noauto 0 0

    Bei einer Datei

    Quote

    /path_zur_datei/swapdatei swapblabla1 swap defaults,noauto 0 0

    Aber Achtung:
    Dies wird sehr zeitig im boot ausgeführt. die Devices sollten zu diesem Zeitpunkt schon im Zugriff sein.
    Das Format der fstab ist....
    Devices Mountpoint(wird_nicht_benutzt) Dateisystem-Type Options 0 0

    Bedenke, was passiert, wenn etwas schief geht, u.U. hängt dann das System im bootvorgang.
    Ich würde die options mit "default,noauto" angeben. noauto ignoriert bei einem "mount -a" Befehl die Zeile. Was ganz gut ist ;)

    Der systemd-fstab-generator liest die fstab und macht daraus die mount/swaps. Danach startet dann systemd.swap und systemd.mount

    man fstab und man swapon geben informationen über den Vorgang.

    Nochmals VORSICHT und eine bootfähige Sicherung nicht vergessen.

    Meine Antwort ist 21 und nicht 42.

  • Aber Achtung:
    Dies wird sehr zeitig im boot ausgeführt. die Devices sollten zu diesem Zeitpunkt schon im Zugriff sein.

    BTW: Auch für die swap-Partition kann man nofail (in der fstab) verwenden:

    Quote

    With nofail, the swap unit will be only wanted, not required by swap.target. This means that the boot will continue even if this swap device is not activated successfully.

    Added in version 218.

    Quelle: manpage für systemd.swap

  • Wer jetzt glaubt, mit diesen paar Parameter ist man glücklich, der beachte das die restlichen (gelben) auskommentiert sind. Da kommt jetzt ein Script gleichen namens unter /sbin/dphys-swapfile ins Spiel.


    Code
    ...

    und da sind sie wieder unsere Default-Werte. Achtung: Beim nächsten Update auf das Paket werden diese überschrieben.

    BTW: Warum machst Du die Änderungen im Script "/sbin/dphys-swapfile" und nicht in der user-config-Datei "/etc/dphys-swapfile"? Denn das Script nimmt doch die Werte aus der config-Datei, oder?

    Z. B.:

    Code
    # check user config file, let user override settings
    #   swap file place/filename and size
    if [ -f /etc/"${PNAME}" ] ; then
      . /etc/"${PNAME}"
    fi

    Diese user-config wird beim nächsten Update _nicht_ überschrieben.

    EDIT:

    BTW: Wer genug RAM hat und Anwendungen benutzt die (immer/permanent) wenig und _schnellen_ Swap-Speicher brauchen, kann _zusätzlich_ einen kleinen SWAP-Speicher konfigurieren mit zram-tools und diesen SWAP-Speicher höher priorisieren als den SWAP mit der SWAP-Datei.

    Wi-Fi_Signal_Strength  txpower
    iptables chains order scheme iptables-diagram
    nftables-diagram

    Meine PIs

    PI4B/8GB (border device) FreeBSD 15.1R-p1 (arm64): SSH-Server, WireGuard-Server, ircd-hybrid-Server, Mumble-Server

    PI4B/4GB FreeBSD 14.4R-p7 (arm64): SSH-Serv., WireGuard-Serv., ngircd-Serv., Mumble-Serv., ddclient

    PI4B/8GB Bookworm-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, Mumble-Server, botamusique, ample

    Edited 4 times, last by rpi444 (February 23, 2025 at 9:53 AM).

  • BTW: Warum machst Du die Änderungen im Script "/sbin/dphys-swapfile" und nicht in der user-config-Datei "/etc/dphys-swapfile"? Denn das Script nimmt doch die Werte aus der config-Datei, oder?

    Weil genau in Zeile 91 die Berechnung auf die Hälfte durchgeführt wird.
    HALF_AVAIL_MB=$(echo "${AVAIL_KB} 2048 / p" | dc)

    Und die Berechnung gibt es nur in /sbin/dphys-swapfile . :(

    zu zram
    ich swappe den Speicher, den ich brauche auf eine ramdisk und komprimiere sie dabei auch noch?

    Meine Antwort ist 21 und nicht 42.

  • Und die Berechnung gibt es nur in /sbin/dphys-swapfile . :(

    Die Berechnung soll ja nicht geändert werden bzw. soll ja immer mit bzw. gemäss dem Script gemacht werden. Es geht doch darum, dass die Werte für diese Berechnung, via user-config-Datei dem Script zur Verfügung gestellt werden. Denn die z. Zt. vorhandenen Kommentare bzw. die Anzahl der z. Zt. vorhandenen wirksamen Zeilen in der (default) user-config-Datei, ist ja nicht in Stein gemeisselt.

    zu zram
    ich swappe den Speicher, den ich brauche auf eine ramdisk und komprimiere sie dabei auch noch?

    Das ist von deinen Bedürfnissen abhängig bzw. ob Du verstanden hast, wann und warum man zramswap benutzen kann. Wenn Du das nicht weisst, dann brauchst Du das auch nicht.

  • zu zram
    ich swappe den Speicher, den ich brauche auf eine ramdisk und komprimiere sie dabei auch noch?

    Das ist von deinen Bedürfnissen abhängig bzw. ob Du verstanden hast, wann und warum man zramswap benutzen kann. Wenn Du das nicht weisst, dann brauchst Du das auch nicht.


    Welchen Anwendungsfall hast du, dass du einen Swap im Speicher benötigst?

    Meine Antwort ist 21 und nicht 42.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!