Τα cgroups για σκληρά παιδιά

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

Καλό είναι πριν προχωρήσεις να έχεις ρίξει μια ματιά στα

https://linux-user.gr/t/gia-ta-cgroups-kai-to-systemd-mia-eikonografhmenh-istoria/2238

https://linux-user.gr/t/mia-prwth-matia-sta-cgroups/2669

Τα cgroup με τον δύσκολο δρόμο

Δεν θέλεις πραγματικά τίποτα για να χρησιμοποιήσεις τα cgroups. Για να το αποδείξω θα φτιάξω ένα δικό μου σημείο ελέγχου όπου θα κάνω έλεγχο στις βασικές πηγές του υπολογιστή: μνήμη και υπολογιστική ισχύ.

sudo mkdir -p /cgrptest/{memory,cpusets,cpu}
sudo mount -t cgroup -o memory none /cgrptest/memory
sudo mount -t cgroup -o cpu,cpuacct none /cgrptest/cpu
sudo mount -t cgroup -o cpuset none /cgrptest/cpusets

Έχουμε την βασική δομή έτοιμη να δεχτεί την συνταγή μας για την κατανομή των πόρων.

Θεωρούμε πως έχουμε την πρώτη έκδοση των cgroups. Αν έχετε την δευτερη, όπως πχ το τελευταίο Fedora δεν θα λειτουργήσουν οι εντολές.

Αν κοιτάς τις εντολές με μισό μάτι, απλά φτιάξαμε 3 καταλόγους και τους συνδέσαμε σαν σημεία ελέγχου για τα cgroups. Έχετε ακούσει για την φιλοσοφία του UNIX ότι τα πάντα είναι αρχεία; Ρίξτε μια ματιά εκεί μέσα και δείτε πόσα αρχεία υπάρχουν μέσα στους καταλόγους που φτιάξαμε!

Υπάρχουν αυτά τα αρχεία στον δίσκο;
Πάνω που έκανα αυτή την ερώτηση είχα μια διακοπή ρεύματος. Ε λοιπόν μετά που ξεκίνησα τον υπολογιστή αυτά τα αρχεία δεν υπήρχαν! Αυτό δεν είναι καθόλου παράξενο, πολλά πράγματα που εμείς τα βλέπουμε σαν αρχεία δεν είναι.

Τώρα που έχουμε την δομή ας φτιάξουμε τα πρώτα cgroups.

sudo mkdir -p /cgrptest/cpu/group{1,2,3}

Θα φτιάξουμε μερικές διεργασίες που να δημιουργούν φόρτο στο σύστημα. Η εντολή

cat /dev/urandom /dev/null &

επαναλαμβανόμενη τρεις φορές θα δημιουργήσει ένα τεχνικό φορτίο στο σύστημα, όπως βλέπουμε στην εικόνα. Ο υπολογιστής μου έχει 8 πυρήνες και τρέχει και ένα γραφικό περιβάλλον και σηκώνει το φορτίο άνετα, με κάθε τέτοια διεργασία να απασχολεί περίπου το 33%.

image

Ας δούμε την τιμή που έχει το αρχείο /cgrptest/cpu/group1/cpu.shares. Είναι 1024 και την ίδια τιμή θα έχει και στις άλλες ομάδες. Αυτή είναι το σχετικό βάρος που έχει κάθε cgroup στο μοίρασμα της CPU.

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

Στην μηχανή αυτή έδωσα μόνο 1 CPU κάτι που κάνει τους υπολογισμούς εύκολους και ορατούς. Το λειτουργικό της μηχανής είναι το Ubuntu 20.04.

Ας δούμε πως μπορούμε να βάλουμε αυτά τα cgroups σε μια χρήση. Πρώτα θα αλλάξω τα σχετικά βάρη. Δεν θέλω καμία ειδική εντολή, μόνο απλό καλό Bash.

sudo sh -c 'echo 2048 > /cgrptest/cpu/group1/cpu.shares'
sudo sh -c 'echo 768 > /cgrptest/cpu/group2/cpu.shares'
sudo sh -c 'echo 512 > /cgrptest/cpu/group3/cpu.shares'

Θα βόλευε να είχα γίνει χρήστης root και να έτρεχα εκεί τις εντολές. Έτσι θα είχα αποφύγει αυτή την άβολη σύνταξη. Αλλά αυτό σπάνια είναι μια καλή ιδέα.

Με τις εντολές αυτές άλλαξα τα σχετικά βάρη στα cgroups που έχω φτιάξει. Αλλά δεν άλλαξε τίποτα.

Θα πρέπει να συνδέσω τις διεργασίες με κάποιο cgroups για να τα δω στην πράξη. Θα πάρω τους αριθμούς των διεργασιών από την εντολή htop (και οι οποίες θα διαφέρουν από υπολογιστή σε υπολογιστή) και θα τις προσθέσω σαν task στα διάφορα cgroups.

sudo sh -c 'echo 2980 > /cgrptest/cpu/group1/tasks' 
sudo sh -c 'echo 2981 > /cgrptest/cpu/group2/tasks'
sudo sh -c 'echo 2982 > /cgrptest/cpu/group3/tasks'

Και ιδού το αποτέλεσμα

image

Τι θα συμβεί άραγε αν τερματίσουμε την διεργασία που παίρνει το μεγάλο ποσοστό της CPU; Θα καταλάβουν οι λοιπές διεργασίες την υπολογιστική ισχύ, ή θα υπολειτουργεί ο υπολογιστής; Ας το διαπιστώσουμε :

image

Άρα τα όρια που θέτουν τα cgroup ενεργοποιούνται μόνο σε καταστάσεις σπανής των πόρων.

Συμπεράσματα

Όταν η φιλοσοφία του UNIX λέει πως τα πάντα είναι ένα αρχείο το εννοεί. Σε κάποιο άλλο λειτουργικό θα θέλαμε ειδικά εργαλεία για να δούμε τα cgroups ή να τα χρησιμοποιήσουμε. Αλλά το μόνο που θέλουμε είναι εντολές σαν την mkdir, 'ls ή cat (ή τις γνωστές κλήσεις συστήματος πίσω από αυτές αν γράφουμε πρόγραμμα).
Η φιλοσοφία αυτή, σαν κάθε φιλοσοφία αν γίνετε κανόνας, χάνει το νόημα της και κάποιες φορές κάνει τα πράγματα πολύ ποιο πολύπλοκα και δύσκολα από όσο πρέπει. Αλλά όχι εδώ. Εδώ η φιλοσοφία βρήκε την μηχανική σε ένα τέλειο πάντρεμα.

Εδώ πρέπει να γίνει μια διευκρίνιση. Για να χρησιμοποιήσεις τα cgroups δεν πρέπει να κάνεις τα παρακάτω, αλλά να χρησιμοποιήσεις τις δυνατότητες του systemd ή κάποιου άλλου εργαλείου. Παρόλα αυτά το να φτιάχνεις μόνος σου με το χέρι έχει την δική του εκπαιδευτική αξία. Έτσι μπορείς να καταλάβεις και να χρησιμοποιήσεις τα εργαλεία καλύτερα.

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