Μια πρώτη ματιά στα cgroups

Στο άρθρο θα συνεχίσουμε από εκεί που είχαμε αφήσει την ιστορία μας στο

Αλλά αυτή την φορά με μια λίγο ποιο “επιστημονική” και πρακτική προσέγγιση. Αλλά κανένας φόβος, δεν θέλει να ξέρεις πολλά πράγματα και θα μπορέσεις να την παρακολουθήσεις ανεξάρτητα από τις γνώσεις σου. Η τουλάχιστον έτσι ελπίζω, όπως ελπίζω πως θα γλυτώσω και το ξύλο :wink: :kissing_smiling_eyes:. Ακόμα και αν δεν καταλάβεις τα πάντα δεν πειράζει, αρκεί να πάρεις μια ιδέα για το τι συμβαίνει κάτω από το καπάκι :grin:.

Με μια ματιά


Τι είναι τα cgroup

Τα cgroup είναι ένας μηχανισμός του πυρήνα για λεπτομερή έλεγχο των πόρων που χρησιμοποιούν οι διεργασίες του υπολογιστή. Αν και μπήκαν στον πυρήνα το έτος 2007, η χρήση τους είναι αρκετά περιορισμένη και πολλοί διαχειρηστές συστημάτων ακόμα και σήμερα αγνοούν την χρήση τους. Υπάρχουν δυο εκδόσεις τους με τα cgroup2 να μην χρησιμοποιούνται σήμερα σχεδόν καθόλου.

Τι είναι μια διεργασία; Και γιατί ρε μπαγλαμά δεν την λες πρόγραμμα να καταλάβουμε τι λες;
Αχεμ παρακαλώ όχι χαρακτηρισμοί! Μια διεργασία είναι ένα πρόγραμμα που τρέχει. Η να το πω αλλιώς το πρόγραμμα υπάρχει στον δίσκο (μια φορά) ενώ μια διεργασία υπάρχει στην μνήμη (συχνά πολλές φορές).

Σχεδόν τα πάντα όπως το docker, το OpenShift, το Kubernetes χρησιμοποιούν ακόμα την πρώτη έκδοση των cgroup και θα περιορίσουμε την συζήτηση σε αυτήν την έκδοση.

Οι κυριότερες χρήσεις των cgroup

1. Περιορισμός χρήσης των πόρων του υπολογιστή

Μια κύρια χρήση τους είναι να κρατάνε τις διεργασίες (δηλαδή τα προγράμματα) που τρέχουν στον υπολογιστή από το να εξαντλούν τους πόρους του. Αυτά δεν περιορίζονται σε CPU, μνήμη και δίκτυο, αλλά με την βοήθεια των device groups μπορούν να περιορίσουν την πρόσβαση και σε συσκευές, τόσο σε επίπεδο πρόσβασης, όσο και σε επίπεδο mknod. Αυτό σε συνδυασμό με το udev είναι ένα ισχυρό χαρακτηριστικό ασφάλειας. Θα μπορούσες για παράδειγμα να περιορίσεις έτσι την πρόσβαση των προγραμμάτων στην κάμερα του υπολογιστή. Δυστυχώς λίγοι προγραμματιστές τα γνωρίζουν και είναι σε θέση να τους κάνουν χρήση.

2. Παροχή προτεραιότητας

Αν και μοιάζει με το προηγούμενο δεν είναι το ίδιο. Θέλουμε να βεβαιωθούμε ότι μια διεργασία η μια ομάδα διεργασιών θα παίρνει πάντα περισσότερους πόρους από μια άλλη ομάδα.

3. Παρακολούθηση και καταγραφή

Η παρακολούθηση και καταγραφή (accounting) είναι απενεργοποιημένη, γιατί δεσμεύει πόρους, αλλά μπορεί να ενεργοποιηθεί ανά πάσα στιγμή για κάποια ομάδα διεργασιών. Έτσι θα πάρουμε αναλυτικές πληροφορίες για την χρήση των πόρων και από που, κάτι πολύ χρήσιμο σε διαχειρηστές συστημάτων και προγραμματιστές.

4. Έλεγχος διεργασιών

Πέραν από το μάντρωμα που κάνουν, με αποτέλεσμα να μην μπορεί να βγει μια διεργασία έξω απο το κλουβί της και να ελέγχετε έτσι, υπάρχει ένα προχωρημένο χαρακτηριστικό το freezer που σταματά μια ομάδα διεργασιών προσωρινά και με ασφάλεια.

Δηλαδή με την χρήση των cgroup έχουμε ένα ελεγχόμενο και ασφαλέστερο σύστημα, που μπορούμε να το αξιοποιήσουμε στο μέγιστο, ακριβώς προσαρμοσμένο στον συγκεκριμένο φόρτο εργασίας για το οποίο προορίζετε.

Πως δουλεύουν τα cgroup

Τα cgroup είναι ορατά σαν ένα σύνολο από αρχεία και καταλόγους στο σύστημα των αρχείων. Η εντολή 'mount -t cgroup' θα μου δείξει που είναι προσδεμένα στο σύστημα αρχείων.

mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

Σταματήστε μια στιγμή και διερευνήστε αυτή την δομή των καταλόγων το mc είναι βολικό, αλλά μπορούμε να δούμε γρήγορα την δομή με κάτι σαν.

tree -d /sys/fs/cgroup -L 2

Κάθε τυπος πόρου που μπορεί να ελεγχθει (cpu, memory,blkio) τον λέμε controller και έχει το δικό του κατάλογο. Μέσα σε αυτόν έχουμε καταλόγους και υποκατάλογους. Στον καθένα φάκελο συνδέουμε τις διεργασίες που θέλουμε να ελέγχει. Τις διεργασίες τις συνδέουμε με τον αριθμό pid τους.

Η δομή είναι ιεραρχική και κάθε υποκατάλογος μοιράζει αυτά που παίρνει απο τον πατρικό του κατάλογο. Έτσι στο παρακάτω σχήμα το cgroup με το όνομα ‘Accounting’ θα πάρει το 40% της CPU.

image

Ας δούμε τέλος πως ακριβώς υπολογίζετε αυτό το ποσοστό. Κάθε κατάλογος έχει ένα σχετικό βάρος που η εξορισμού τιμή του είναι ο αριθμός 1024. Μπορούμε να αλλάξουμε αυτόν τον αριθμό. Έτσι για παράδειγμα στο παρακάτω σχήμα, υπολογίστε πόση χρήση της CPU επιτρέπετε στις διεργασίες που ανήκουν στο cgroup με όνομα user1 ;

Για δοκιμάστε να το βρείτε πρώτα. Δεν είναι δύσκολο.

Με απλά μαθηματικά θα πάρει

\frac{768}{768+512+2048} * 100 = 23.1\%

Αλλά αυτό είναι το νούμερο του user.slice που ευκολα βρίσκουμε πως θα πάρει το 33\%. Άρα σε σύνολο θα πάρει το 7.6\% περίπου της CPU.

Κλείνοντας

Τα συγχαρητήρια μου για τον επιτυχή υπολογισμό, καθώς και το ότι άντεξες να φτάσεις μέχρι εδώ :slight_smile:. Υπάρχουν πολλά άλλα που μπορεί να λεχθούν για τα cgroup, αλλά θα σταματήσω την θεωρία εδώ. Ελπίζω να βοήθησα στο να τα ανακαλύψετε και αν θέλετε να βουτήξετε και στα βαθιά. Θα χαρώ στα σχόλια να επισημάνετε λάθη, αβλεψίες καθώς και απορίες. Να προειδοποιήσω όμως πως δεν είμαι κανένας ειδικός.

Τα λέμε στα επόμενα άρθρα της σειράς με ποιο πρακτικά παραδείγματα.

Για περισσότερα

Στο παρακάτω βίντεο θα βρείτε πολλά επιπλέον στοιχεία, αν θέλετε να το σκαλίσετε λίγο περισσότερο. Αλλά μην προχωρήσετε στις τεχνικές του, πριν διαβάσετε και το επόμενα άρθρα της σειράς. Στο επόμενο που θα βγει αύριο, θα δούμε πως μπορούμε να χρησιμοποιήσουμε τα cgroup χωρίς κανένα απολύτως εργαλείο, άλλο από απλές εντολές στο Bash! Και σε επόμενο άρθρο της σειράς θα δούμε την χρήση τους με τα εργαλεία που μας προσφέρει το systemd.

Δείτε

Διαβάστε

Την επίσημη τεκμηρίωση του πυρήνα, που είναι εξαιρετικά καλή, σχεδόν ευκολοδιάβαστη :slight_smile:.
https://www.kernel.org/doc/Documentation/cgroup-v1/

Πηγές

Η σειρά έχει βασιστεί στα άρθρα του Steve Ovens της RedHat.

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

Στο παράδειγμα που θέτεις υπολογίζεις τη χρήση της CPU για τον χρήστη 1(στον αριθμητή έχεις 768), αλλά ρωτάς για τον user2.

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

Ζήτω! Κατάφερε να το διαβάσει κάποιος :joy:

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

Χαχαχαχα.
Παρακάτω ένας από τους developers των cgroups στον Linux kernel και ο χώρος εργασίας του.