Τα πάντα για το swap

Τι είναι το swap

Για να τρέξει ένα πρόγραμμα θα πρέπει να έρθει από τον δίσκο στην κεντρική μνήμη RAM. Και κάθε πρόγραμμα θα δεσμεύσει ένα ποσοστό της μνήμης. Αν το πρόγραμμα επεξεργάζεται δεδομένα αυτά θα δεσμεύσουν επίσης ένα τμήμα της μνήμης. Και κάποια στιγμή αυτή θα τελειώσει. Εδώ έρχεται το swap να σώσει την κατάσταση. Αυτό είναι μια περιοχή στον σκληρό δίσκο όπου αποθηκεύονται τμήματα της μνήμης που δεν χρησιμοποιούνται. Αν χρειαστούν θα ανακτηθούν πίσω και κάτι άλλο θα πάρει την θέση τους. Οπότε είναι σαν μια φτηνή αναβάθμιση της μνήμης. Αλλά ο δίσκος είναι αργός και το swap δεν είναι πάντα λύση. Αν για παράδειγμα έχουμε τον Firefox ανοικτό και το blender θέλει μνήμη, τότε το Firefox θα πάει στην μνήμη και θα έχουμε μια καθυστέρηση. Αλλά αν το blender θέλει παραπάνω μνήμη από την RAM που έχουμε, τότε μόνος δρόμος είναι η αναβάθμιση της RAM γιατί τα πάντα θα πηγαίνουν με ταχύτητες χελώνας.

Ένα συχνό λάθος που κάνουν οι νέοι χρήστες είναι να κοιτάζουν την RAM με την εντολή free και να την βλέπουν γεμάτη. Και τότε υποθέτουν πως ο υπολογιστής θέλει μνήμη, ή ότι το Linux χρησιμοποιεί πολύ μνήμη. Αυτό είναι λάθος. Αν ξεκινήσεις ένα πρόγραμμα και το σταματήσεις αυτό θα μείνει στην μνήμη μήπως το χρειαστείς ξανά. Και αν διαβάσεις κάτι από τι δίσκο θα μείνει εκεί να μην το ξαναδιαβάζεις. Γιατί στην τελική τόσα χρήματα δώσαμε να την αγοράσουμε και θέλουμε να είναι πάντα γεμάτη για να πιάνουν τα λεφτά μας κόπο.

Υπάρχει και μια άλλη χρήση του swap όταν κάνουμε αναστολή λειτουργίας στο laptop μας. Όλη η μνήμη θα αδειάσει και θα πάει εκεί. Όταν ανοίξουμε τον υπολογιστή θα διαβάσει από εκεί και θα είναι σαν να μην τον κλείσαμε. Ο υπολογιστής δεν θα πρέπει να έχει ενεργοποιημένο το Secure Boot.

Τα είδη του swap

Συνήθως κατά την εγκατάσταση θα δημιουργηθεί αυτόματα μια ειδική κατάτμηση με το σωστό μέγεθος για χρήση σαν swap. Σε κάποιες τελευταίες διανομές αυτή μπορεί να μην υπάρχει αλλά να υπάρχει ένα swap file. Και μπορούμε να έχουμε και τους δυο τύπους ταυτόχρονα.

Αν χρησιμοποιείτε σύστημα αρχείων btrfs αποφύγετε την χρήση swap file σε αυτό. Αν έχετε μηχανικό δίσκο και SSD προτιμήστε τον μηχανικό και ανεχτείτε τις μειωμένες επιδόσεις. Στις μέρες μας αυτό δεν είναι τόσο πρόβλημα εκτός από παλιούς η φτηνούς δίσκους και αγνοήστε με ελεύθερα.

Δημιουργία ενός swap file

Θα φτιάξουμε ένα swap file με μέγεθος 1G στην θέση swapfile. Σε ένα τερματικό δίνουμε τις εντολές

# Δημιούργησε το αρχείο
sudo fallocate -l 1G /swapfile

# Γέμισε τις "τρύπες"
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576

# Μόνο το σύστημα μπορεί να το διαβάσει/γράψει.
sudo chmod 600 /swapfile

# Φτιάξε το swap
sudo mkswap /swapfile

# Ενεργοποίησε το
sudo swapon /swapfile

# Πληροφορίες για την χρήση των swap
swapon --show

Ίσως είδατε κάποια καινούργια πράγματα. Με την πρώτη εντολή δεσμεύουμε χώρο στον δίσκο. Είναι ποιο γρήγορο έτσι ώστε αν δεν υπάρχει να το ξέρουμε αμέσως. Αλλά το αρχείο μπορεί να έχει τρύπες. Είναι δυνατόν ένα αρχείο να πιάνει λιγότερο χώρο στον δίσκο από όσο λέει. Όσοι γνωρίζετε τι είναι τα core files μάθετε πως δεν είναι τόσο μεγάλα (όσο το μέγεθος της μνήμης) λένε ότι είναι. Με την δεύτερη εντολή γεμίζουμε τις τρύπες και δεσμεύουμε πραγματικά τον χώρο.

Στην συνέχεια:

  • Αν θέλουμε οι αλλαγές να είναι μόνιμες προσθέτουμε μια γραμμή στο αρχείο /etc/fstab

    /swapfile none swap defaults 0 0
    

    Αν έχουμε πολλά swap μπορούμε να προσθέσουμε προτεραιότητες

    /swapfile none swap  sw,pri=4 0 0
    
  • Αν φτιάξαμε το αρχείο γιατί χρειαστήκαμε χώρο για λίγο τότε

    sudo swapoff /swapfile
    sudo rm /swapfile
    

swap file σε btrfs

Ο πυρήνας από την έκδοση 5.0 και μετά υποστηρίζει swap file αλλά με κάποιους περιορισμούς. Δεν θα πρέπει να είναι σε subvolume που έχει γίνει snapshot ούτε σε κατάτμηση που να πιάνει πολλούς δίσκους (άρα όχι RAID). Θα πρέπει να μπει σε ένα δικό του subvolume και αυτό να βγει εκτός του timeshift. Οι εντολές θα πρέπει να γίνουν [2]

truncate -s 0 /mnt/swapfile
chattr +C /mnt/swapfile
btrfs property set /mnt/swapfile compression none
fallocate -l 1024M /mnt/swapfile
chmod 600 /mnt/swapfile
lsattr /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile

Για υποστήριξη της αναστολής θέλει να κάνεις και κάποια άλλα κόλπα [3]. Η συμβουλή μου; Απλά φτιάξε μια κατάτμηση swap και ξέχνα τα παραπάνω.

Το swappiness

Αυτή είναι μια παράμετρος που επηρεάζει πόσο συχνά θα χρησιμοποιεί το swap ο πυρήνας. Έχει μια τιμή γύρω στο 60 για desktop και κοντά στο 1 σε κάποιους σέρβερς. Κυκλοφορεί πολύ ανοησία εκεί έξω σχετικά με αυτή την τιμή, τι ακριβώς κάνει, καθως και “συμβουλές” να χρησιμοποιήσεις την τιμή 0 ή κάποια άλλη τιμή. Αγνόησε τις. Η διανομή σου έχει βάλει μια τιμή και ξέρει τι κάνει. Πίστεψε την. Εγώ πάντως δεν θα δείξω - συνειδητά - πως να την πειράξεις. Τα ίδια ισχύουν και για την vfs_cache_presure.

OOM killer

Όπου OOM out-of-memory, είναι ένα υποσύστημα του πυρήνα που αναλαμβάνει δράση όταν δεν μπορεί να βρεθεί μνήμη. Τότε θα επιλέξει κάποιο πρόγραμμα με κάποια κριτήρια και θα το τερματίσει. Αλλά δεν είναι καθόλου εύκολο να πάρει την σωστή απόφαση. Φταίει και το γεγονός πως ο πυρήνας λέει ψέματα ότι υπάρχει περισσότερη μνήμη από όση είναι διαθέσιμη (overcommit). Κάποιες φορές σε σέρβερς το σκαλίζουμε, αλλά η καλύτερη ρύθμιση είναι να φροντίσεις να μην σου τύχει.

Μια ιστορία (αγγλικά)

An aircraft company discovered that it was cheaper to fly its planes with less fuel on board. The planes would be lighter and use less fuel and money was saved. On rare occasions however the amount of fuel was insufficient, and the plane would crash. This problem was solved by the engineers of the company by the development of a special OOF (out-of-fuel) mechanism. In emergency cases a passenger was selected and thrown out of the plane. (When necessary, the procedure was repeated.) A large body of theory was developed and many publications were devoted to the problem of properly selecting the victim to be ejected. Should the victim be chosen at random? Or should one choose the heaviest person? Or the oldest? Should passengers pay in order not to be ejected, so that the victim would be the poorest on board? And if for example the heaviest person was chosen, should there be a special exception in case that was the pilot? Should first class passengers be exempted? Now that the OOF mechanism existed, it would be activated every now and then, and eject passengers even when there
was no fuel shortage. The engineers are still studying precisely how this malfunction is caused.

Re: [PATCH] oom_pardon, aka don't kill my xlock [LWN.net]

Το επερχόμενο systemd 246 έρχεται να αλλάξει την κατάσταση [πηγή] μεταφέροντας την απόφαση από τον πυρήνα στο userspace όπου υπάρχει καλύτερος έλεγχος με αξιοποίηση των cgroups ενσωματώνοντας κώδικα που πρόσφερε το Facebook. Δείτε επίσης και το nohang.

Το σωστό μέγεθος για το swap

Αυτό είναι εύκολο! Είναι το διπλάσιο ποσό της μνήμης RAM. Λάθος!

Όταν είχαμε 256MB μνήμη αυτό ήταν μια καλή συμβουλή. Αλλά σήμερα την μνήμη την μετράμε σε GB. Ο παρακάτω πίνακας είναι από το Fedora [1] και είναι ένας καλός μπούσουλας. Αλλά δεν έχουν όλοι οι υπολογιστές την ίδια χρήση και ελεύθερα διαφωνείστε με αυτόν

Μνήμη RAM Συνιστώμενο μέγεθος με αναστολή
< 2GB διπλάσιο μέγεθος τριπλάσιο μέγεθος
2 GB - 8GB όσο η μνήμη διπλάσιο μέγεθος
8GB - 64GB το μισό της μνήμης 1.5 φορές η μνήμη
> 6GB ανάλογα την χρήση μην το κάνεις

Ο υπολογιστής μου έχει πολύ μνήμη. Χρειάζεται να έχω swap;

Μπορείς μια χαρά να μην έχεις καθόλου swap αν έχεις αρκετή μνήμη και δεν χρειάζεται ποτέ να αναλάβει δράση ο OOM-killer. Πολύς κόσμος το έχει έτσι και δεν έχει κανένα πρόβλημα. Αλλά δεν είναι απίθανο κάποιο πρόγραμμα να ξεφύγει. Επίσης αν ή μνήμη δεν είναι πραγματικά άφθονη, θα υπάρξει πίεση στο σύστημα του δίσκου και να πάντα θα πηγαίνουν ποιο αργά.

Αλλά να σου πω κάτι; Εντάξει μια κατάτμηση είναι μπελάς, αλλά ένα αρχείο τσάμπα είναι. Και θα έχεις και ένα υπολογιστή που θα λειτουργεί ποιο ομαλά [3]. Οπότε δεν υπάρχει λόγος.

Επίσης στην αρχική περιγραφή τα εξήγησα απλά, τόσο που καταλήγει να είπα φρικτά ψέματα. Η κύρια χρήση του swap είναι να κάνει προσβάσιμη μνήμη που αλλιώς δεν θα ήταν. Στο τέλος του άρθρου θα βρείτε συνδέσμους για όσους θέλουν να εμβαθύνουν στις φρικτές λεπτομέρειες.

Το swap για προχωρημένους

Σαν ένα unit του systemd

To systemd μπορεί να διαχειριστεί τα swap files, αντί για το /etc/fstab. Αυτό είναι χρήσιμο για αυτοματισμούς μιας και δεν πρέπει να αλλάξεις ένα αρχείο. Θα φτιάξεις ένα αρχείο /etc/systemd/system/vm-swapfile.swap και θα περιέχει τα παρακάτω:

[Unit]
Description=Turn on swap

[Swap]
What=/swapfile

[Install]
WantedBy=multi-user.target

και θα πρέπει να ενεργοποιηθεί με την εντολή

systemctl enable --now var-vm-swapfile1.swap

Για κάθε καταχώρηση στο /etc/fstab θα φτιάξει ένα unit αυτόματα και μπορείς να το χρησιμοποιήσεις σε εξαρτήσεις. Οπότε όπως σε βολεύει.

Για περισσότερα: systemd.swap(5) - Linux manual page

zram, zswap, zcache, systemd-swap

Οι τεχνολογίες αυτές υπόσχονται καλύτερες αποδόσεις. Η συμβουλή μου είναι πως αυτές είναι για έμπειρους χρήστες που ξέρουν πότε τις θέλουν και πότε όχι. Αν θέλετε να μάθετε για αυτές διαβάστε

Ποια προγράμματα χρησιμοποιούν το swap;

Ένα χρήσιμο πρόγραμμα είναι το smem

# Απλή χρήση
smem --autosize
# Βιβλιοθήκες
smem --autosize --mappings
# Σύνολα και ποσοστά
smem --autosize --totals --percent
# Κατανομή σε σύστημα/πυρήνα
smem --system
# Ανά χρήστη
smem --users

Το μέλλον του swap partition

To Ubuntu :ubuntu: έχει σταματήσει να φτιάχνει swap partition εδώ και καιρό. Πρόσφατα ξεκίνησε και η σχετική συζήτηση στο Fedora :fedora: με χρήση του του zram-generator. Κάτι μου λέει πως σε λίγα χρόνια όλες οι μεγάλες διανομές θα καταργήσουν την κατάτμηση και θα αφήσουν την διαχείριση του αρχείου swap στο systemd.

Διαβάστε

Η διαχείριση της μνήμης είναι κάτι πολύπλοκο και δεν μπορεί να λυθεί με απλές συμβουλές ή τσελεμεντέδες. Για ένα απλό χρήστη η διανομή θα κάνει ικανοποιητικές επιλογές, που όμως δεν θα καλύψουν το 99% των χρηστών.

Ελπίζω με τα παραπάνω να πήρατε μια ιδέα για το swap και την χρήση του. Απλά βεβαιωθείτε πως έχετε ένα κατά την εγκατάσταση, είτε σαν κατάτμηση είτε σαν αρχείο και μην ασχοληθείτε ξανά με αυτό. Αν ο υπολογιστής σου θέλει μνήμη θα το καταλάβεις γιατί θα σέρνετε.

Για το swappiness και γιατί δεν είναι τόσο απλό όσο νομίζεις:
https://www.howtogeek.com/449691/what-is-swapiness-on-linux-and-how-to-change-it/

Για το πως λειτουργεί η εικονική μνήμη

Δείτε

18 «Μου αρέσει»

Και ένα update. Το Fedora (από v. 33) πράγματι σταμάτησε τη δημιουργία swap partitions κι αντ´ αυτού χρησιμοποιεί zram[0] με χρήση του zram-generator. Το default ήταν μέγεθος 0.5 με max 4GiB. Το Fedora 34 αύξησε[1] το μέγεθος σε 1.0 και το max σε 8 GiB. Επίσης αυτή η έκδοση ενεργοποίησε το systemd-oomd[2], αντικαθιστώντας το earlyoom που χρησιμοποιούσε από τη v. 32[3].

Πάντως για μένα το earlyoom δουλεύει μια χαρά. Μόνο πρόβλημα είναι πως δεν τα πάει καλά με zram ratio >1.0, αλλά δεν ξέρω κατά πόσο τέτοιο ratio είναι ασφαλές γενικά.

1 «Μου αρέσει»