Ένας κατάλογος από διεργασίες.
Τι είναι αυτή ή διεργασία; Μια διεργασία είναι ένα πρόγραμμα, αλλά ένα πρόγραμμα που τρέχει. Ένα πρόγραμμα στο δίσκο είναι μέσα σε ένα κατάλογο που είναι μέσα σε έναν άλλον μέχρι να φτάσουμε σε κάποιο ριζικό κατάλογο. Κάτι ανάλογο συμβαίνει και με τις διεργασίες. Κάθε μια έχει κάποιον γονέα ενώ μπορεί να έχει κάποιες άλλες που να είναι αυτή πατέρας τους. Σχηματίζετε έτσι μια δομή ίδια με αυτή ενός καταλόγου και κάποια διεργασία θα είναι στην κορυφή. Την διεργασία αυτή την λέμε init
.
Ψέματα και απλοποιήσεις
Αν κάποιος έχει CSD, ναι το ξέρω πως αυτό είναι μια φτωχή περιγραφή, αλλά ας κρατήσουμε το επίπεδο χαλαρό. Αν το πάμε λίγο ποιο πέρα μια διεργασία περιέχει κάποια μνήμη που είναι δική της, ένα η περισσότερα νήματα εκτέλεσης και πόρους όπως ανοικτά αρχεία, παράθυρα και γραμματοσειρές.
Δεν είμαι κάποιος ειδικός, και πιθανά να έχω λάθη και παρανοήσεις. Κάθε διόρθωση είναι καλοδεχούμενη στα σχόλια.
Μπορούμε να δούμε αυτόν τον κατάλογο με την εντολή pstree -G
:
και ας εστιάσουμε στις πρώτες γραμμές
να το λοιπόν το διαβόητο και φοβερό systemd
.
Κάθε διεργασία έχει ένα όνομα, και επειδή μπορεί να τρέχει πολλές φορές δεν μπορεί να είναι το όνομα του προγράμματος. Παίρνει λοιπόν σαν όνομα στον δυαδικό κόσμο που ζει ένα αριθμό που τον λέμε PID
και είναι αυτός που βλέπουμε πρώτο σε εντολές όπως η top
. Η υπηρεσία init
έχει τον αριθμό 1 ξεκινάει από τον πυρήνα και είναι ο πατέρας όλων των διεργασιών.
Η σεξουαλική ζωή των διεργασιών: Ξέρω η παράγραφος προδιαθέτει σε κάτι συνταρακτικό, αλλά οι καημένες είναι σαν τις αμοιβάδες. Απλά χωρίζονται στα δυο με μια διαδικασία που την λέμε forking
. Η διεργασία παιδί μπορεί να ακολουθήσει τον δικό της δρόμο. Αν ο πατέρας είναι ένα βαρετό bash
το παιδί μπορεί να γίνει ότι θέλει, ακόμα και ένα λαμπερό vlc
.
[center]'Όλα τα σκίτσα της ιστορίας είναι είναι από το http://turnoff.us/[/center]
Ο θάνατος: Κάθε τι χαρούμενο κάπου τελειώνει ακόμα και για το vlc
, ήρθε η ώρα να πάμε για ύπνο και να κλείσουμε τον υπολογιστή. Αλλά αντίθετα με την ζωή αν κάποια διεργασία τερματιστεί δεν υπάρχουν δικαστήρια για τα κληρονομικά. Τα παιδιά σαν τις χήρες στην Ινδία, θα πεθάνουν και αυτά. Αλλά πριν συνεχίσουμε με αυτή την λυπηρή ιστορία ένα κοινωνικό μήνυμα:
Τι μπορεί να κάνει μια διεργασία να ξεφύγει από την σκληρή της μοίρα; Ευτυχώς υπάρχει τρόπος να ξεφύγει από τα πατρικά δεσμά. Ο τρόπος αυτός λέγετε double forking
και τον χρησιμοποιούσαν οι διεργασίες πριν το systemd
για να γίνουν “δαίμονες” ή ποιο κολακευτικά “υπηρεσίες συστήματος”. Για την ίδια την διεργασία δεν υπάρχει σωτηρία, αλλά το εγγόνι της μπορεί να ξεφύγει από τα πατρικά δεσμά. Αλλά υπάρχει ένα πρόβλημα, πως θα το βρούμε αν θέλουμε να τερματίσουμε την διεργασία; Ευτυχώς μια υπηρεσία είναι ευγενική και βάζει το όνομα της σε ένα αρχείο .pid
που περιέχει, τι άλλο; τον αριθμό της. Πρέπει να είμαστε πολύ προσεκτικοί με αυτό τον αριθμό και το αρχείο που το περιέχει, η πληροφορία που περιέχει μπορεί να είναι λάθος, μετά από μια επανεκκίνηση για παράδειγμα.
Ο νηπιαγωγός: Αυτές οι άτακτες διεργασίες σαν τα μικρά παιδιά μπορεί να πέσουν και να χτυπήσουν. Αλλά τότε θα χάσουμε την υπηρεσία που παρέχουν (στον σκληρό δυαδικό κόσμο υπάρχει παιδική εργασία, δυστυχώς υπάρχει ακόμα και σε εμάς). Ο νηπιαγωγός είναι εξίσου σκληρός αν δει μια διεργασία να έχει χτυπήσει θα πρέπει να την σκοτώσει και να φτιάξει μια καινούργια. Και κάποια στιγμή θα κλείσουμε τον υπολογιστή, οπότε πάλι θα πρέπει να τις σκοτώσει. Τον νηπιαγωγό τον λέμε supervisor
ή με κάποιο άλλο κολακευτικότερο όνομα. Το πρόβλημα είναι πως με τον παλιό τρόπο η δουλεία του δεν είναι καθόλου απλή. Ευτυχώς υπάρχουν τα cgroups
.
Τι είναι τα cgroups
Τα cgroups
είναι ένας διαφορετικός τρόπος οργάνωσης των διεργασιών σε μια δεντρική δομή. Η παραδοσιακή δομή υπάρχει, αλλά παράλληλα έχουμε και μια δεύτερη δομή. Δεν θα τα βρούμε σε άλλα λειτουργικά συστήματα τύπου UNIX
αλλά μόνο στο Linux . Την πρώτη φορά δεν τα φτιάξαμε τόσο καλά, οπότε έχουμε αυτή την εποχή μια μετάβαση στην δεύτερη έκδοση τους. Μοιάζουν με τον φράκτη, συγνώμη την αυλή ήθελα να πω, ενός νηπιαγωγείου. Από την στιγμή που ο υπεύθυνος (που τον λέμε arbitrator
βάλει μέσα στην αυλή μια διεργασία, δεν θα μπορέσει πότε να ξεφύγει (το μαλακισμένο). Στην δεύτερη έκδοση τους μόνο μια διεργασία μπορεί να το κάνει αυτό.
Τα croups
είναι μια από τις βασικές τεχνολογίες πάνω στην οποία πατάνε πολλές τεχνολογίες, από το docker
μέχρι το flatpack
. Η αρχική ιδέα ήταν να χρησιμοποιηθούν για να περιορίσεις τους πόρους που μπορεί να χρησιμοποιήσει μια διεργασία. Και όπου πόρους λέμε το δίκτυο, τον επεξεργαστή, την επικοινωνία με τον δίσκο, την μνήμη… Για μια διεργασία μπορούμε να κάνουμε κάτι τέτοιο με εντολές όπως nice
, ionice
, ulimit
κλπ αλλά είδαμε πόσο εύκολα μπορούν αυτά να παρακάμπτουν. Ε λοιπόν ποτέ ξανά!
Το systemd
σκέφτηκε να τις χρησιμοποιήσει και με ένα νέο τρόπο. Όσο και αν ακούγετε απίστευτο πριν από αυτό ήταν δύσκολο και μπελάς να βρεις αν μια υπηρεσία συστήματος τρέχει, ή να την τερματίσεις σωστά. Μια υπηρεσία όπως το apache
μπορεί να καλέσει κάποιο shell script
που να κάνει τρελά πράγματα ακόμα και double forking
. Να τις βρεις και να τις σκοτώσεις τερματίσεις δεν είναι καθόλου εύκολο. Να τις περιορίσεις και να μην ας πούμε κάνουν bitcoin minning και κλέψουν όλη την CPU εξίσου δύσκολο. Αλλά αν τις έχεις περιορισμένες σε μια αυλή είναι εύκολο, όπως επίσης εύκολο είναι να δεις αν υπάρχει κάποιο πρόβλημα.
Τα cgroups
στην πράξη
Τους φακέλους των cgroups
θα τους βρούμε σαν “κανονικούς φακέλους” στο ψευτοφάκελο /sys/fs/cgroup/
με την δομή να είναι διαφορετική ανάλογα με το αν χρησιμοποιούμε την πρώτη ή την δεύτερη έκδοση. Αλλά δεν είναι ανάγκη μιας και το systemd
παρέχει μερικά ωραία εργαλεία.
Η πρώτη εντολή systemd-cgls
μας δείχνει τους φράκτες και τα παιδιά που παίζουν μέσα σε κάθε φράκτη.
Στην εικόνα βλέπουμε πως υπάρχει μια σειρά από φράκτες μέσα σε άλλους φράκτες (στην ορολογία του systemd
τους λέμε slice
). Μέσα σε κάθε slice θα βρούμε service
και scopes
. Τα δεύτερα είναι για ποιο δυναμικά πράγματα όπως για παράδειγμα μια συνεδρία σε ένα γραφικό περιβάλλον. Γιατί όπως βολεύουν οι φράκτες το systemd
έτσι βολεύουν και ένα γραφικό περιβάλλον να κρατήσεις και να περιορίσει την συνεδρία ενός χρήστη. Οπότε είναι πειρασμός να το χρησιμοποιήσει μέσω του λεγόμενου logind
, όπως για παράδειγμα κάνει ήδη το Gnome
.
Λίγο παρακάτω θα βρούμε και τις διεργασίες που τρέχουν στο γραφικό περιβάλλον μέσα σε ένα scope
. Είναι πολλές πανάθεμα τις:
Μια άλλη εικόνα μας δίνει η εντολή systemd-cgtop
όπου βλέπουμε τους πόρους που χρησιμοποιεί κάθε φράκτης.
Ένας άλλος τρόπος είναι να έχουμε το παρακάτω alias
alias psc='ps xawf -eo pid,user,cgroup,args'
Υπάρχουν τρεις μεγάλοι φράκτες. Το system.slice
για υπηρεσίες συστήματος, το user.slice
για εμάς και το machine.slice
για τις εικονικές μηχανές και τα system containers.
Η κοινωνική ζωή
Σε ένα άλλο άρθρο θα δούμε πως, όπως τα παιδιά σε μια αυλή νηπιαγωγείου, εκτός από κάποια ντροπαλά παιδάκια, δεν σταματάνε να μιλάνε και να κάνουν θόρυβο και να λένε πράγματα όπως “σου πήρα την μπάλα”. Την επικοινωνία αυτή την κάνουν μέσα από το dbus
και είναι πραγματικά πολύ θορυβώδης. Διαβάστε περισσότερα εδώ.
Αλλά οι σοβαρές διεργασίες που παρέχουν υπηρεσίες συστήματος θέλουν να μιλάνε και με τον έξω κόσμο και όπως αν πας σε μια δημόσια υπηρεσία θα πρέπει να πας στο κατάλληλο γκισέ (αν είσαι τυχερός και ξέρεις το σωστό) έτσι και σε αυτές. Τα γκισέ τα λέμε ports
αλλά μέσα στον υπολογιστή τα λέμε sockets
.
Κάποιες υπηρεσίες θέλουν πρώτα να ξεκινήσουν άλλες υπηρεσίες που χρησιμοποιήσουν. Οπότε πρέπει να περιμένουν αυτές να ετοιμαστούν πριν μπορέσουν να ξεκινήσουν. Για παράδειγμα πρώτα πρέπει να ξεκινήσει το dbus
, μια ή περισσότερες βάσεις δεδομένων, μια υπηρεσία καταγραφής, πριν μπορέσει να ξεκινήσει ένα web service
. Η διαδικασία είναι αργή μιας και πρέπει να ξεκινήσει η υπηρεσία, να φτιαχτεί το γκισέ και να ανοίξει. Τα πράγματα είναι χειρότερα αν για κάποιο λόγο πρέπει να κατέβουν τα ρολά στον γκισέ, όπως όταν γίνει μια αναβάθμιση. Όλοι περιμένουν και χάνουν τον χρόνο τους στην καλλίτερη περίπτωση. Διαφορετικά πρέπει να πεθάνουν. Και οι πελάτες ενός site δεν θα το βρουν εκεί για κάποιο χρονικό διάστημα και ίσως πάνε σε άλλο μαγαζί.
Το systemd
κάνει κάτι έξυπνο. Ανοίγει αυτό το γκισέ! Και ξεκινάει όλα τα παραπάνω παράλληλα. Αντί να περιμένει στην σειρά να ανοίξει κάθε υπηρεσία καταθέτει την αίτηση της και την κρατάει στην άκρη το systemd
. Μόλις η υπηρεσία ξεκινήσει, θα αναλάβει το γκισέ, γεμάτο με αιτήσεις και θα πιάσει αμέσως δουλειά (είναι σκληρή η ζωή στον διάδικο κόσμο). Αν θέλει να πάει προς νερού της ή να βάλει καινούργια ρούχα σε μια αναβάθμιση, το systemd
θα αναλάβει πάλι το γκισέ και τίποτα δεν θα χαθεί ούτε θα πρέπει να σκοτώσουμε τους πελάτες που περιμένουν (επιτέλους και ένα καλό νέο για της καημένες τις διεργασίες).
Το κόλπο αυτό το λέμε socket activation
. Ένα άλλο πλεονέκτημα αυτής της προσέγγισης είναι πως μια υπηρεσία συστήματος μπορεί να ρυθμιστεί ώστε να μην ξεκινάει αν δεν χρειάζεται. Κλασσικό παράδειγμα είναι μια υπηρεσία όπως το ssh
. Συνήθως θα συνδεθεί κάποιος με ssh
σε μια μηχανή μια φορά στο τόσο. Γιατί να τρέχει και να δαπανά πόρους; Τον τρόπο αυτό τον χρησιμοποιεί το launchd
της Apple εδώ και πολλά χρόνια. Υποστηρίζετε και ένας καλύτερος τρόπος για τοπικές υπηρεσίες. Η ενεργοποίηση όταν χρειαστούν μέσα από το dbus
Για την διεργασία 1
Είναι ωραίο να είσαι ο πρώτος και όλοι τσακώνονται για αυτή την θέση και ποιος τον έχει πιο μικρό (τον κώδικα). Με το systemd
το σύστημα μας έχει γίνει και πιο γρήγορο και πιο διαχειρίσιμο. Αυτό είναι ένα γεγονός. Αποτελεί το systemd
την τελική λύση;
Ελάτε τώρα. Στον μεταβαλλόμενο κόσμο των υπολογιστών ζούμε. Ποτέ δεν έρχεται το τέλος του κόσμου, αν και ποτέ δεν μπορείς να ξέρεις .
Εναλλακτικές λύσεις υπάρχουν, αλλά αυτές δεν περιλαμβάνουν επιστροφή σε ένα κόσμο του παρελθόντος τα παλιά init
μας αποχαιρέτησαν όπως και το DOS. Ο χώρος εδώ είναι ανοικτός για να παρουσιαστούν και να μας πουν όσοι τα συμπαθούν που είναι καλύτερα. Μόνο να μην διαβάσουμε “απόψεις” σαν αυτές . Υπάρχουν σοβαρότεροι λόγοι:
Και επειδή μπορεί να μας διαβάζουν και μικρά παιδιά και για να κλείσουμε με μια ευχάριστη σκέψη:
Για μια τεχνική ανάλυση διαβάστε: Rethinking PID 1
Για την ιστορία του πως φτάσαμε στο systemd
: systemd, 10 years later: a historical and technical retrospective
Για την σειρά των άρθρων
Εδώ και λίγες μέρες έβαλα στόχο να δω γιατί το systemd
έχει προκαλέσει τόσο θόρυβο και αν είναι τόσο κακό όσο λένε. Σε άρθρα εδώ παρουσιάζω ότι καλό ή κακό βρίσκω χωρίς φανατισμούς και ιδεοληψίες. Δείτε τα άρθρα για το systemd
, καθώς και άλλες γνώμες (αν υπάρξουν), ακολουθώντας το tag: Νήματα με ετικέτες systemd.
Οι εικόνες είναι πνευματική ιδιοκτησία του Daniel Stori.
http://turnoff.us/