Επιστροφή στο blog

Διαχείριση πόρων Docker με Cgroups

Διαχείριση πόρων Docker με Cgroups

Τον προηγούμενο μήνα μίλησα στο ApacheCon σχετικά με τα Cgroups. Φαίνεται ότι πολύ λίγοι χρήστες Linux (συμπεριλαμβανομένου και εμού μέχρι πριν από όχι πολύ καιρό) είναι εξοικειωμένοι με τα Cgroups και τη δύναμή τους. Αυτό είναι κρίμα, επειδή τα Cgroups είναι πολύ ισχυρά, και σας επιτρέπουν να κατανέμετε πόρους στους διακομιστές σας με πολύ πιο λεπτομερή τρόπο από οποιοδήποτε άλλο εργαλείο διαθέσιμο στην εργαλειοθήκη του Linux. Επιπλέον, είναι ενσωματωμένα απευθείας στον πυρήνα και παρέχονται έτοιμα προς χρήση με τις περισσότερες διανομές Linux.

Σε αυτό το άρθρο θα καλύψω πώς να χρησιμοποιήσετε τα Cgroups με το Docker, ως συνέχεια μιας άλλης ομιλίας που έδωσα στο Docker Meetup στο Austin του Texas.

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

Docker και Cgroups

Το Docker συνοδεύεται από δύο διαφορετικούς οδηγούς: τον LXC και τον libcontainer. Ο οδηγός LXC είναι ο παλαιού τύπου οδηγός, και ο libcontainer είναι ο νέος και προεπιλεγμένος οδηγός. Στις περισσότερες περιπτώσεις, ο libcontainer είναι ο προτιμώμενος οδηγός, καθώς εκεί συμβαίνει η καινοτομία (για παράδειγμα το docker exec δεν λειτουργεί με τον οδηγό LXC).

Είναι ωστόσο σημαντικό να σημειωθεί ότι υπάρχουν δύο διαφορετικοί οδηγοί, καθώς δεν έχουν μεταφερθεί ακόμα όλες οι δυνατότητες των Cgroups στο libcontainer (ή τουλάχιστον δεν έχουν εκτεθεί στο Docker). Όταν χρησιμοποιείτε τον οδηγό LXC, απλώς περνάτε απευθείας τα ορίσματα LXC, ενώ με το libcontainer υπάρχουν ρητά ορίσματα πολιτικής Cgroup που εκτίθενται στο Docker. Θα πρέπει να ορίσετε ρητά έναν οδηγό όταν εκκινείτε τον δαίμονα Docker, επομένως δεν μπορείτε να εκτελέσετε τους δύο οδηγούς ταυτόχρονα.

Ορίστε ένα παράδειγμα για το πώς μπορείτε να το ελέγξετε:

[bash light=”true”] # Με τον οδηγό LXC
$ docker run -d –name=’lxc_test’ \
–lxc-conf="lxc.cgroup.cpu.shares=50" \
busybox

# Με τον οδηγό libcontainer
$ docker run -d –name=’libcontainer_test’ \
–cpu-shares=50 \
busybox
[/bash]

Ακολουθεί μια επισκόπηση ορισμένων από τις δυνατότητες των Cgroups και πώς αντιστοιχίζονται μεταξύ των δύο οδηγών:

Δυνατότητα Libcontainer LXC
Σχετικό μερίδιο CPU -c, –cpu-shares –lxc-conf=”lxc.cgroup.cpu.shares”
Κλείδωμα σε έναν πυρήνα CPU –cpuset-cpus –lxc-conf=”lxc.cgroup.cpuset.cpus”
Περιορισμός μνήμης -m, –memory –lxc-conf=”lxc.cgroup.cpuset.mems”

LXC

Αν θέλετε να χρησιμοποιήσετε τον οδηγό LXC για το Docker, θα πρέπει πρώτα να τον ενεργοποιήσετε. Η μέθοδος για να το κάνετε αυτό διαφέρει ανάλογα με τη διανομή Linux που χρησιμοποιείτε, αλλά εδώ είναι οι οδηγίες για το πώς να ενεργοποιήσετε τον οδηγό LXC στο Ubuntu 14.04.

Όπως αναφέρθηκε παραπάνω, παραιτείστε από μια σειρά δυνατοτήτων κάνοντας αυτό. Επομένως, εκτός αν χρειάζεστε πραγματικά μια λειτουργικότητα που δεν έχει εκτεθεί ακόμα στο Docker χρησιμοποιώντας το libcontainer, θα πρέπει πραγματικά να παραμείνετε στον προεπιλεγμένο οδηγό.

Ορισμένες χρήσιμες πολιτικές Cgroup που δεν έχουν εκτεθεί ακόμα στο libcontainer περιλαμβάνουν τον περιορισμό I/O (I/O throttling - καλύπτεται στην παρουσίαση), ο οποίος μπορεί να είναι πολύ χρήσιμος για ορισμένες εφαρμογές.

Αν έχετε αποφασίσει να χρησιμοποιήσετε τον οδηγό LXC, η προσθήκη ορισμάτων είναι απλή. Το μόνο που χρειάζεται να κάνετε είναι να προσθέσετε το όρισμα --lxc-conf και να περάσετε την πολιτική Cgroup που θα θέλατε να ορίσετε.

Libcontainer

Όπως μπορείτε να δείτε στον παραπάνω πίνακα, οι βασικές πολιτικές Cgroup είναι ήδη εκτεθειμένες στην τρέχουσα έκδοση του Docker (1.6 κατά τη στιγμή που γράφεται αυτό).

Η χρήση αυτών των πολιτικών είναι πολύ απλή. Αν για παράδειγμα θέλετε να κλειδώσετε ένα κοντέινερ Docker στον πρώτο πυρήνα CPU, θα προσθέτατε το --cpuset-cpus=0 στην εντολή σας docker run.

Μπορείτε επίσης να χρησιμοποιήσετε το όρισμα --cgroup-parent με το libcontainer και να ορίσετε χειροκίνητα πιο λεπτομερείς περιορισμούς πόρων. Στη συνέχεια, θα το αντιστοιχίσετε σε αυτήν την ομάδα χρησιμοποιώντας το όρισμα.

Demo: Docker με Cgroups

Στο παρακάτω screencast, θα χρησιμοποιήσουμε δύο Docker containers (‘low_prio’ και ‘high_prio’). Χρησιμοποιούμε το βασικό container ‘busybox’ και εκτελούμε md5sum /dev/urandom για να προσομοιώσουμε μια διεργασία που καταναλώνει πολύ CPU. Από προεπιλογή, αυτό θα κατανάλωνε όλους τους διαθέσιμους πόρους CPU. Ωστόσο, θα εφαρμόσουμε δύο πολιτικές Cgroup για τη διαχείριση των πόρων. Αρχικά χρησιμοποιούμε το ‘cpuset.cpus’ για να κλειδώσουμε τα containers στον ίδιο πυρήνα CPU (πυρήνας 0).

Στη συνέχεια χρησιμοποιούμε το ‘cpu.shares’ για να εκχωρήσουμε ένα σχετικό μερίδιο CPU. Δίνουμε στο container ‘low_prio’ την τιμή 20 και στο ‘high_prio’ την τιμή 80. Αυτό σημαίνει ότι το 20% της CPU θα εκχωρηθεί στο container ‘low_prio’ και το 80% της CPU θα εκχωρηθεί στο container ‘high_prio’. Παρακαλούμε σημειώστε ωστόσο ότι το σχετικό μερίδιο είναι μια αυθαίρετη κλίμακα (θα μπορούσαμε επίσης να έχουμε χρησιμοποιήσει τις τιμές 2 και 8).

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

Ως αναφορά, ορίστε οι εντολές που χρησιμοποιήθηκαν για την εκκίνηση των containers.

[bash light=”true”] $ docker run -d \
–name=’low_prio’ \
–cpuset-cpus=0 \
–cpu-shares=20 \
busybox md5sum /dev/urandom
$ docker run -d \
–name=’high_prio’ \
–cpuset-cpus=0 \
–cpu-shares=80 \
busybox md5sum /dev/urandom
[/bash]

Σύνοψη

Αν διαχειρίζεστε πολλαπλά Docker containers στον ίδιο κεντρικό υπολογιστή (host), η χρήση των Cgroups για τη διαχείριση των πόρων μεταξύ των containers έχει απόλυτο νόημα. Για παράδειγμα, ίσως έχετε κάποιες εργασίες επεξεργασίας παρασκηνίου (background tasks) που εκτελούνται σε ένα container, και ένα άλλο container που εξυπηρετεί περιεχόμενο χρηστών. Σε αυτή την περίπτωση, μπορείτε να χρησιμοποιήσετε τις νέες σας γνώσεις για να διασφαλίσετε ότι δίνετε προτεραιότητα στα containers που απευθύνονται στους χρήστες έναντι των εργασιών παρασκηνίου.

author

Viktor Petersson

Συγγραφέας · CloudSigma

Ο Preslav Dobrev είναι Δημιουργικός Σχεδιαστής στην CloudSigma, με εστίαση στη συνεπή επιχειρηματική ταυτότητα μέσω παραδοσιακών και καινοτόμων καναλιών μάρκετινγκ. Διαθέτει την ικανότητα να συνδυάζει το καλλιτεχνικό όραμα με το στρατηγικό μάρκετινγκ για τη δημιουργία εντυπωσιακών αφηγήσεων επωνυμίας.

Σχόλια

Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.