Για τα cgroups και το systemd. Μια εικονογραφημένη ιστορία

Ένας κατάλογος από διεργασίες.

Τι είναι αυτή ή διεργασία; Μια διεργασία είναι ένα πρόγραμμα, αλλά ένα πρόγραμμα που τρέχει. Ένα πρόγραμμα στο δίσκο είναι μέσα σε ένα κατάλογο που είναι μέσα σε έναν άλλον μέχρι να φτάσουμε σε κάποιο ριζικό κατάλογο. Κάτι ανάλογο συμβαίνει και με τις διεργασίες. Κάθε μια έχει κάποιον γονέα ενώ μπορεί να έχει κάποιες άλλες που να είναι αυτή πατέρας τους. Σχηματίζετε έτσι μια δομή ίδια με αυτή ενός καταλόγου και κάποια διεργασία θα είναι στην κορυφή. Την διεργασία αυτή την λέμε init.

Ψέματα και απλοποιήσεις

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

Δεν είμαι κάποιος ειδικός, και πιθανά να έχω λάθη και παρανοήσεις. Κάθε διόρθωση είναι καλοδεχούμενη στα σχόλια.

Μπορούμε να δούμε αυτόν τον κατάλογο με την εντολή pstree -G:

και ας εστιάσουμε στις πρώτες γραμμές

να το λοιπόν το διαβόητο και φοβερό systemd.

Κάθε διεργασία έχει ένα όνομα, και επειδή μπορεί να τρέχει πολλές φορές δεν μπορεί να είναι το όνομα του προγράμματος. Παίρνει λοιπόν σαν όνομα στον δυαδικό κόσμο που ζει ένα αριθμό που τον λέμε PID και είναι αυτός που βλέπουμε πρώτο σε εντολές όπως η top. Η υπηρεσία init έχει τον αριθμό 1 ξεκινάει από τον πυρήνα και είναι ο πατέρας όλων των διεργασιών.

Η σεξουαλική ζωή των διεργασιών: Ξέρω η παράγραφος προδιαθέτει σε κάτι συνταρακτικό, αλλά οι καημένες είναι σαν τις αμοιβάδες. Απλά χωρίζονται στα δυο με μια διαδικασία που την λέμε forking. Η διεργασία παιδί μπορεί να ακολουθήσει τον δικό της δρόμο. Αν ο πατέρας είναι ένα βαρετό bash το παιδί μπορεί να γίνει ότι θέλει, ακόμα και ένα λαμπερό vlc.


'Όλα τα σκίτσα της ιστορίας είναι είναι από το http://turnoff.us/

Ο θάνατος: Κάθε τι χαρούμενο κάπου τελειώνει ακόμα και για το vlc, ήρθε η ώρα να πάμε για ύπνο και να κλείσουμε τον υπολογιστή. Αλλά αντίθετα με την ζωή αν κάποια διεργασία τερματιστεί δεν υπάρχουν δικαστήρια για τα κληρονομικά. Τα παιδιά σαν τις χήρες στην Ινδία, θα πεθάνουν και αυτά. Αλλά πριν συνεχίσουμε με αυτή την λυπηρή ιστορία ένα κοινωνικό μήνυμα:

Τι μπορεί να κάνει μια διεργασία να ξεφύγει από την σκληρή της μοίρα; Ευτυχώς υπάρχει τρόπος να ξεφύγει από τα πατρικά δεσμά. Ο τρόπος αυτός λέγετε double forking και τον χρησιμοποιούσαν οι διεργασίας πριν το systemd για να γίνουν “δαίμονες” ή ποιο κολακευτικά “υπηρεσίες συστήματος”. Για την ίδια την διεργασία δεν υπάρχει σωτηρία, αλλά το εγγόνι της μπορεί να ξεφύγει από τα πατρικά δεσμά. Αλλά υπάρχει ένα πρόβλημα, πως θα το βρούμε αν θέλουμε να τερματίσουμε την διεργασία; Ευτυχώς μια υπηρεσία είναι ευγενική και βάζει το όνομα της σε ένα αρχείο .pid που περιέχει, τι άλλο; τον αριθμό της. Πρέπει να είμαστε πολύ προσεκτικοί με αυτό τον αριθμό και το αρχείο που το περιέχει, η πληροφορία που περιέχει μπορεί να είναι λάθος, μετά από μια επανεκκίνηση για παράδειγμα.

Ο νηπιαγωγός: Αυτές οι άτακτες διεργασίες σαν τα μικρά παιδιά μπορεί να πέσουν και να χτυπήσουν. Αλλά τότε θα χάσουμε την υπηρεσία που παρέχουν (στον σκληρό δυαδικό κόσμο υπάρχει παιδική εργασία, δυστυχώς υπάρχει ακόμα και σε εμάς). Ο νηπιαγωγός είναι εξίσου σκληρός αν δει μια διεργασία να έχει χτυπήσει θα πρέπει να την σκοτώσει και να φτιάξει μια καινούργια. Και κάποια στιγμή θα κλείσουμε τον υπολογιστή, οπότε πάλι θα πρέπει να τις σκοτώσει. Τον νηπιαγωγό τον λέμε supervisor ή με κάποιο άλλο κολακευτικότερο όνομα. Το πρόβλημα είναι πως με τον παλιό τρόπο η δουλεία του δεν είναι καθόλου απλή. Ευτυχώς υπάρχουν τα cgroups.

Τι είναι τα cgroups

Τα cgroups είναι ένας διαφορετικός τρόπος οργάνωσης των διεργασιών σε μια δεντρική δομή. Η παραδοσιακή δομή υπάρχει, αλλά παράλληλα έχουμε και μια δεύτερη δομή. Δεν θα τα βρούμε σε άλλα λειτουργικά συστήματα τύπου UNIX αλλά μόνο στο Linux :tux:. Την πρώτη φορά δεν τα φτιάξαμε τόσο καλά, οπότε έχουμε αυτή την εποχή μια μετάβαση στην δεύτερη έκδοση τους. Μοιάζουν με τον φράκτη, συγνώμη την αυλή ήθελα να πω, ενός νηπιαγωγείου. Από την στιγμή που ο υπεύθυνος (που τον λέμε 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 εδώ και πολλά χρόνια. Υποστηρίζετε και ένας καλύτερος τρόπος για τοπικές υπηρεσίες. Η ενεργοποίηση όταν χρειαστούν μέσα από το dubs

Για την διεργασία 1

Είναι ωραίο να είσαι ο πρώτος και όλοι τσακώνονται για αυτή την θέση και ποιος τον έχει πιο μικρό (τον κώδικα). Με το systemd το σύστημα μας έχει γίνει και πιο γρήγορο και πιο διαχειρίσιμο. Αυτό είναι ένα γεγονός. Αποτελεί το systemd την τελική λύση;

Ελάτε τώρα. Στον μεταβαλλόμενο κόσμο των υπολογιστών ζούμε. Ποτέ δεν έρχεται το τέλος του κόσμου, αν και ποτέ δεν μπορείς να ξέρεις :stuck_out_tongue:.

Εναλλακτικές λύσεις υπάρχουν, αλλά αυτές δεν περιλαμβάνουν επιστροφή σε ένα κόσμο του παρελθόντος τα παλιά init μας αποχαιρέτησαν όπως και το DOS. Ο χώρος εδώ είναι ανοικτός για να παρουσιαστούν και να μας πουν όσοι τα συμπαθούν που είναι καλύτερα. Μόνο να μην διαβάσουμε “απόψεις” σαν αυτές :crazy_face: . Υπάρχουν σοβαρότεροι λόγοι:

Και επειδή μπορεί να μας διαβάζουν και μικρά παιδιά και για να κλείσουμε με μια ευχάριστη σκέψη:

Για μια τεχνική ανάλυση διαβάστε: http://0pointer.de/blog/projects/systemd.html
Για την ιστορία του πως φτάσαμε στο systemd: https://blog.darknedgy.net/technology/2020/05/02/0/

Για την σειρά των άρθρων

Εδώ και λίγες μέρες έβαλα στόχο να δω γιατί το systemd έχει προκαλέσει τόσο θόρυβο και αν είναι τόσο κακό όσο λένε. Σε άρθρα εδώ παρουσιάζω ότι καλό ή κακό βρίσκω χωρίς φανατισμούς και ιδεοληψίες. Δείτε τα άρθρα για το systemd, καθώς και άλλες γνώμες (αν υπάρξουν), ακολουθώντας το tag: https://linux-user.gr/tag/systemd.

Οι εικόνες είναι πνευματική ιδιοκτησία του Daniel Stori.
http://turnoff.us/

8 Likes

Έχει ξεκινήσει μια διαδικασία για την ενσωμάτωση των cgroups στο desktop, όπου με την προσθήκη των κατάλληλων μεταδεδομένων θα δημιουργηθούν πιο λεπτομερείς οθόνες συστήματος που θα επιτρέπουν την καλύτερη διαχείριση των διεργασιών και θα απλοποιήσουν σημαντικά αυτό το «Να τις βρεις και να τις σκοτώσεις τερματίσεις δεν είναι καθόλου εύκολο».

Αναφέρεται ότι η προσπάθεια θα είναι cross-desktop, αν και δε βρήκα σχετικές αναφορές παρά μόνο για το Plasma.

6 Likes

όχι ότι καταλαβαίνω ή βοηθιέμαι (…αφού [εγώ] δεν καταλαβαίνω), αλλά τα likes για την όρεξη, την υπομονή, την συγγραφική κι επεξηγηματική ικανότητα, μα κυρίως για την γενική διάθεση βοήθειας!! :wink:

3 Likes