Τι είναι το 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.
Το επερχόμενο 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 έχει σταματήσει να φτιάχνει swap partition εδώ και καιρό. Πρόσφατα ξεκίνησε και η σχετική συζήτηση στο Fedora με χρήση του του zram-generator. Κάτι μου λέει πως σε λίγα χρόνια όλες οι μεγάλες διανομές θα καταργήσουν την κατάτμηση και θα αφήσουν την διαχείριση του αρχείου swap στο systemd
.
Διαβάστε
Η διαχείριση της μνήμης είναι κάτι πολύπλοκο και δεν μπορεί να λυθεί με απλές συμβουλές ή τσελεμεντέδες. Για ένα απλό χρήστη η διανομή θα κάνει ικανοποιητικές επιλογές, που όμως δεν θα καλύψουν το 99% των χρηστών.
Ελπίζω με τα παραπάνω να πήρατε μια ιδέα για το swap
και την χρήση του. Απλά βεβαιωθείτε πως έχετε ένα κατά την εγκατάσταση, είτε σαν κατάτμηση είτε σαν αρχείο και μην ασχοληθείτε ξανά με αυτό. Αν ο υπολογιστής σου θέλει μνήμη θα το καταλάβεις γιατί θα σέρνετε.
Για το swappiness
και γιατί δεν είναι τόσο απλό όσο νομίζεις:
https://www.howtogeek.com/449691/what-is-swapiness-on-linux-and-how-to-change-it/
Για το πως λειτουργεί η εικονική μνήμη