Τι είναι το cpusets στο Linux και πώς να το χρησιμοποιήσετε με cgroups

Τελευταία ενημέρωση: 17/12/2025
Συγγραφέας: Ισαάκ
  • Τα Cpusets είναι ένα υποσύστημα cgroups που περιορίζει σε ποιες CPU και κόμβους μνήμης οι διεργασίες μπορούν να εκτελούνται και να δεσμεύουν μνήμη.
  • Η διαμόρφωση γίνεται μέσω του συστήματος αρχείων cgroup, δημιουργώντας ιεραρχίες καταλόγων και προσαρμόζοντας αρχεία όπως cpuset.cpus και cpuset.mems.
  • Πρόσθετοι ελεγκτές όπως η CPU, η μνήμη ή το blkio επιτρέπουν τον περιορισμό και τη λήψη υπόψη της CPU, της RAM και των εισόδων/εξόδων, ενσωματώνοντας σύνολα CPU σε μια παγκόσμια στρατηγική διαχείρισης πόρων.
  • Στο cgroup v2, ελεγκτές όπως η CPU και η CPUSet συνδυάζονται σε ένα ενιαίο δέντρο, επιτρέποντας ακριβή όρια CPU μέσω αρχείων όπως το cpu.max.

cpusets σε Linux

Εάν εργάζεστε με διακομιστές Linux Γεμάτο με υπηρεσίες, πιθανότατα έχετε αναρωτηθεί πώς διανείμετε καλά το CPU και μνήμη μεταξύ των διαδικασιών χωρίς η μία να υπερισχύει της άλλης. Προτεραιότητες με nice Και τα κλασικά όρια βοηθούν, αλλά όταν όλοι θέλουν όλους τους πόρους, το σύστημα μετατρέπεται σε ζούγκλα.

Εδώ είναι που παίζουν ρόλο δύο βασικά μέρη του πυρήνα: cgroups και το υποσύστημα cpusetΧάρη σε αυτά, μπορείτε να αποφασίσετε με ακρίβεια ποιες διεργασίες χρησιμοποιούν ποιες CPU και ποιοι κόμβοι μνήμης, να παρακολουθείτε την κατανάλωσή τους, να περιορίζετε το εύρος ζώνης της CPU ή του δίσκου τους, ακόμη και να τις ομαδοποιείτε για να δημιουργείτε "soft partitions" μέσα στον ίδιο διακομιστή.

Τι είναι οι cgroups και γιατί είναι σημαντικές;

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

Σε σύγκριση με τα παραδοσιακά εργαλεία, όπως nice, ionice o limits.confΟι cgroups σας επιτρέπουν να ορίσετε ιεραρχίες ομάδων στην οποία κάθε σύνολο διεργασιών λαμβάνει ένα προκαθορισμένο μέρος πόρων, ανεξάρτητα από το πόσες διεργασίες υπάρχουν σε κάθε ομάδα.

Στους σύγχρονους πυρήνες, οι ομάδες c εκτίθενται μέσω ενός εικονικό σύστημα αρχείων (cgroup v1 ή cgroup v2) που συνήθως τοποθετείται σε /sys/fs/cgroupΚάθε υποκατάλογος αντιπροσωπεύει μια ομάδα και τα αρχεία που περιέχει σάς επιτρέπουν να δείτε και να αλλάξετε τη διαμόρφωσή της.

cpusets: το υποσύστημα για τη σύνδεση διεργασιών σε CPU και κόμβους μνήμης

Εντός των cgroups, Σύνολο CPU είναι ο ελεγκτής (υποσύστημα) υπεύθυνος για περιορισμός σε ποιες CPU και ποιους κόμβους μνήμης Μπορεί να εκτελέσει και να διαθέσει μνήμη για ένα σύνολο εργασιών. Αυτό είναι ιδιαίτερα χρήσιμο σε μεγάλα μηχανήματα με πολλούς πυρήνες και τοπολογία NUMA, αλλά έχει νόημα και σε πιο μέτριους διακομιστές όταν θέλετε να απομονώσετε φόρτους εργασίας.

Κάθε σύνολο CPU ορίζει δύο βασικά σύνολα:

  • cpuset.cpus: λίστα CPU στις οποίες μπορούν να εκτελεστούν οι εργασίες της ομάδας.
  • cpuset.mems: λίστα κόμβων μνήμης στους οποίους αυτές οι εργασίες μπορούν να δεσμεύσουν μνήμη.

Όταν μια διεργασία καλεί sched_setaffinity(), mbind() o set_mempolicy()ο πυρήνας φιλτράρετε αυτά τα αιτήματα έτσι ώστε να μπορούν να χρησιμοποιούν μόνο CPU και κόμβους που περιλαμβάνονται στο τρέχον σύνολο CPU τους. Επιπλέον, ο χρονοπρογραμματιστής δεν θα προγραμματίσει ποτέ αυτήν την εργασία σε μια CPU που δεν βρίσκεται στην επιτρεπόμενη μάσκα της και ο εκχωρητής σελίδων δεν θα δεσμεύσει μνήμη σε κόμβους εκτός αυτής. mems.

Γιατί τα σετ CPU είναι τόσο χρήσιμα σε μεγάλα συστήματα

Σε διακομιστές με πολλές CPU και μνήμη κατανεμημένη σε πολλαπλούς κόμβους, το διεργασία και τοποθέτηση μνήμης Έχει τεράστιο αντίκτυπο στην απόδοση. Η πρόσβαση στην «απομακρυσμένη» μνήμη σε ένα μηχάνημα NUMA μπορεί να είναι πολύ πιο αργή από την πρόσβαση στην τοπική μνήμη του κόμβου όπου εκτελείται η CPU.

Με τα σύνολα CPU μπορείτε να δημιουργήσετε υποσύνολα μηχανών (soft partitions) και να αναθέσετε ολόκληρες εργασίες σε αυτά τα υποσύνολα: για παράδειγμα, μια ομάδα πυρήνων και κόμβων μνήμης για μια βάση δεδομένων, μια άλλη για το web front end και μια άλλη για φόρτους εργασίας που απαιτούν μεγάλη υπολογιστική ισχύ. Αυτές οι ομάδες μπορούν να είναι προσαρμόστε δυναμικά ανάλογα με το φόρτο του συστήματος, χωρίς να παρεμβαίνει σε εργασίες που εκτελούνται ήδη σε άλλα διαμερίσματα.

Είναι μια πολύ συνηθισμένη στρατηγική σε:

  • Διακομιστές Web που εκτελούν πολλαπλές παρουσίες της ίδιας υπηρεσίας.
  • Μικτές μηχανές με κοινή χρήση ιστού, βάσεων δεδομένων και άλλων δαιμόνων υλικού.
  • Συστάδες NUMA και HPC που εκτελούν επιστημονικές εφαρμογές ευαίσθητες στην καθυστέρηση μνήμης.

Πρακτικό παράδειγμα: τιθασεύοντας έναν άπληστο Apache με cgroups και cpuset

Φανταστείτε έναν διακομιστή με δύο πυρήνες και έναν διακομιστή Apache που εκκινεί δυναμικά τις θυγατρικές διεργασίες. Παρόλο που όλες έχουν το ίδιο niceΣτην πράξη, η CPU που είναι διαθέσιμη για τις υπόλοιπες υπηρεσίες θα εξαρτηθεί από τον αριθμό των ενεργών διεργασιών Apache σε οποιαδήποτε δεδομένη στιγμή.

Με κανονικές προτεραιότητες Συμβαίνουν τέτοια πράγματα:

  • Apache με 9 διεργασίες και μια άλλη υπηρεσία με 1: η δεύτερη λαμβάνει ένα 10% CPU.
  • Apache με 99 διεργασίες και η άλλη με 1: η δεύτερη πέφτει σε ένα 1% CPU.

Η προτεραιότητα δεν αλλάζει, αλλά ο αριθμός των διαδικασιών ναιΚαι αυτό καταστρέφει την αμεροληψία. Με τα cgroups και cpuset μπορείτε να δημιουργήσετε δύο ομάδες: μία για τον Apache και μία για όλα τα άλλα, και να πείτε στον πυρήνα ότι κάθε ομάδα έχει αντιστοιχιστεί, για παράδειγμα, 50% της CPU, ανεξάρτητα από τον αριθμό των διεργασιών που έχουν εγκαταστήσει μέσα σε αυτές.

  Τι είναι το επίπεδο συμβατότητας Lepton της Valve και σε τι χρησιμεύει;

Προσάρτηση του συστήματος αρχείων cpuset (cgroup v1)

Σε πολλές τρέχουσες διανομές (Fedora, σύγχρονο RHEL, systemdΤα cgroups μοντάρονται από προεπιλογή και το systemd ομαδοποιεί αυτόματα τις υπηρεσίες. Σε παλαιότερα συστήματα (για παράδειγμα, Ubuntu 12.04/14.04 με κλασική διαμόρφωση), μπορείτε να μοντάρετε χειροκίνητα το υποσύστημα cpuset ως εξής:

mount -t tmpfs -o size=5M cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/cpuset
mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset

Με αυτό δημιουργήσατε ένα μικρό tmpfs Για να στεγάσει τις ιεραρχίες, ένας κατάλογος cpuset το οποίο θα λειτουργήσει ως σημείο προσάρτησης και, τέλος, έχετε προσαρτήσει το σύστημα αρχείων cgroup περιορίζεται στον ελεγκτή Σύνολο CPU.

Αν επιθεωρήσετε /sys/fs/cgroup/cpuset Θα δείτε αρχεία όπως:

  • tasks y cgroup.procs: λίστες εργασιών και αναγνωριστικά ομάδων νημάτων που ανήκουν στην ομάδα.
  • cpuset.cpusΕπιτρεπόμενες CPU για αυτήν την ομάδα.
  • cpuset.mems: επιτρεπόμενοι κόμβοι μνήμης.
  • Αρκετές επιπλέον σημαίες: cpuset.cpu_exclusive, cpuset.mem_exclusive, cpuset.memory_migrateΚ.λπ.

Δημιουργία υποομάδων και κατανομή CPU/μνήμης

Κάθε υποκατάλογος στον οποίο δημιουργείτε /sys/fs/cgroup/cpuset είναι ένα νέο θυγατρικό σύνολο CPUΗ αφαίρεσή του (εάν είναι άδειο από εργασίες) γίνεται με rmdirΓια παράδειγμα, για να διαιρέσετε το σύστημα σε δύο ομάδες, μία ανά πυρήνα:

cd /sys/fs/cgroup/cpuset
mkdir grupo-A grupo-B

echo 0 > grupo-A/cpuset.cpus
echo 1 > grupo-B/cpuset.cpus

echo 0 > grupo-A/cpuset.mems
echo 0 > grupo-B/cpuset.mems

Έχετε δημιουργήσει δύο σύνολα CPU, ομάδα-Α y ομάδα-ΒΤο πρώτο χρησιμοποιεί μόνο την CPU 0 και το δεύτερο την CPU 1. Και τα δύο μοιράζονται τον μοναδικό κόμβο μνήμης 0 του μηχανήματος.

Συσχέτιση διεργασιών με ένα σύνολο CPU

Για να τοποθετήσετε εργασίες σε ένα σύνολο CPU, απλώς γράψτε το PID σας στο αρχείο tasks αυτής της ομάδας. Μια διεργασία μπορεί να ανήκει μόνο σε μία ομάδα εντός μιας συγκεκριμένης ιεραρχίας. Όταν τη μετακινείτε, εξαφανίζεται από τη λίστα της γονικής διεργασίας.

Ας υποθέσουμε ότι ανοίγετε δύο νέα κελύφη, με PID 3435 και 3492. Αρχικά θα βρίσκονται στο ριζικό σύνολο της CPU.Μπορείτε να τα στείλετε στις υποομάδες ως εξής:

echo 3435 > grupo-A/tasks
echo 3492 > grupo-B/tasks

Από εκείνη τη στιγμή, Όλα όσα ξεκινούν από αυτά τα bash shells θα κληρονομήσουν το σύνολο CPU τους.Αν εκτελέσετε τέσσερις διεργασίες από το κέλυφος 3435 consume_cpu (ένα δυαδικό αρχείο που απλώς καίει την CPU σε έναν βρόχο), θα δείτε τα PID του μέσα grupo-A/tasks και πυρήνας 0 σε πλήρη λειτουργία ενώ ο πυρήνας 1 παραμένει σχεδόν αδρανής.

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

echo 3621 > /sys/fs/cgroup/cpuset/grupo-B/tasks

Όταν παρατηρούμε με topΘα δεις πώς Και οι δύο CPU αρχίζουν να λειτουργούν, και η μετακινημένη διεργασία καταλαμβάνει το μεγαλύτερο μέρος της CPU 1, ενώ οι άλλες τρεις καταναλώνουν την CPU 0.

Άλλοι διαθέσιμοι ελεγκτές cgroup

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

  • cpuΑυτό ελέγχει την αναλογία του χρόνου CPU που διατίθεται σε κάθε ομάδα. Για παράδειγμα, επιτρέπει σε μια ομάδα να έχει το 80% της CPU, σε μια άλλη το 15% και σε μια άλλη το 5%.
  • cpuacctΔεν περιορίζει, απλώς μετράει El tiempo CPU που καταναλώνεται από τις εργασίες της ομάδας και τους απογόνους τους.
  • blkio: ρυθμίζει το εύρος ζώνης εισόδου/εξόδου σε συσκευές μπλοκ, με αναλογικά όρια ή αυστηρά όρια.
  • memory: επιβάλλει όρια στη μνήμη RAM και την εναλλαγή μνήμης και αναφέρει τη χρήση μνήμης ανά ομάδα.
  • devices: επιτρέπει ή απαγορεύει την πρόσβαση σε συγκεκριμένες συσκευές (για παράδειγμα, κλείδωμα μιας συσκευής μπλοκ σε ένα κοντέινερ).
  • freezer: παύση ή συνέχιση όλες τις εργασίες μιας ομάδας.
  • net_cls y net_prioΕτικετοποιούν την κυκλοφορία δικτύου ή προσαρμόζουν τις προτεραιότητες ανά διεπαφή για ενσωμάτωση με tc.
  • ns: ομαδοποιεί τις διεργασίες σε διαφορετικούς χώρους ονομάτων, χρήσιμο για ελαφριά εικονικοποίηση σε συνδυασμό με χώρους ονομάτων.
  • perf_event: επιτρέπει την παρακολούθηση εργασιών cgroup με το εργαλείο perf.

Εσωτερικές λεπτομέρειες των cpusets στον πυρήνα

Σε επίπεδο πυρήνα, κάθε εργασία διατηρεί έναν δείκτη προς τη δομή cgroup στην οποία ανήκει. Τα cpusets ορίζουν Μάσκες κόμβων CPU και μνήμης που τέμνονται με τις μάσκες συσχέτισης και τις πολιτικές NUMA που ζητούνται από την εργασία.

Μερικά βασικά σημεία της υλοποίησης:

  • El ριζικό σύνολο CPU Περιέχει όλους τους πυρήνες και τους κόμβους μνήμης του συστήματος.
  • Κάθε θυγατρικό cpuset πρέπει να είναι ένα αυστηρό υποσύνολο από τους πόρους του πατέρα.
  • Ένα σύνολο CPU μπορεί να επισημανθεί ως exclusivo για CPU (cpuset.cpu_exclusive) ή μνήμη (cpuset.mem_exclusive): σε αυτήν την περίπτωση, οι πόροι τους δεν μπορούν να επικαλύπτονται με εκείνους των hermanos (ναι, με προγόνους ή απογόνους).
  • Δεν προστίθενται νέες κλήσεις συστήματος: όλα διεκπεραιώνονται μέσω σύστημα αρχείων cgroup και εικονικά αρχεία όπως cpuset.cpus, tasksΚ.λπ.
  Εναλλακτικές λύσεις ζωγραφικής για Linux και macOS που αξίζουν τον κόπο

Ο πυρήνας συνδέει cpusets σε αρκετά μη κρίσιμα σημεία για την απόδοση:

  • Init: αρχικοποιεί το root cpuset κατά την εκκίνηση.
  • διακλάδωση/έξοδος: για να κληρονομήσετε και να απελευθερώσετε την ιδιότητα μέλους σε cpusets.
  • sched_setaffinity(): καλύπτει τη συγγένεια με τη μάσκα που επιτρέπεται από το cpuset.
  • Κατανεμητής μνήμης: περιορίζει τις σελίδες σε επιτρεπόμενους κόμβους.
  • Ανάκτηση μνήμης και μετεγκατάσταση εργασιών: οι περιορισμοί του cpuset τηρούνται όσο το δυνατόν περισσότερο.

Σημαντικές σημαίες και αρχεία του cpuset

Κάθε σετ CPU έχει, εκτός από cpuset.cpus y cpuset.mems, Ένα σειρά αρχείων διαμόρφωσης που ελέγχουν προηγμένες συμπεριφορές:

  • cpuset.memory_migrateΕάν έχει οριστεί σε 1, κατά την αλλαγή του συνόλου CPU ή την τροποποίηση memsΟι υπάρχουσες σελίδες είναι αποδημώ στους νέους κόμβους, σεβόμενοι τη σχετική θέση όσο το δυνατόν περισσότερο.
  • cpuset.mem_hardwall y cpuset.mem_exclusiveΌταν ενεργοποιούνται, σκληραίνουν το φράγμα μνήμης και περιορίζουν ακόμη και ορισμένα κοινόχρηστα αποθέματα πυρήνα.
  • cpuset.memory_pressure y cpuset.memory_pressure_enabledΕκθέτουν ένα μέτρο πίεσης μνήμης (άμεσες ανακτήσεις ανά δευτερόλεπτο) με έναν κινητό μέσο όρο, χρήσιμο για τους ενορχηστρωτές και τους προγραμματιστές παρτίδων.
  • cpuset.memory_spread_page y cpuset.memory_spread_slabΕάν είναι ενεργοποιημένο, ο πυρήνας διανέμει σελίδες προσωρινής μνήμης αρχείων και ορισμένα slab. σε λειτουργία κυκλικής διαδοχής από τους επιτρεπόμενους κόμβους, αντί να ευνοείται πάντα ο τοπικός κόμβος.
  • cpuset.sched_load_balance: ελέγχει εάν ο χρονοπρογραμματιστής επιχειρεί να εξισορροπήσει το φόρτο μεταξύ των CPU στο σύνολο CPU.
  • cpuset.sched_relax_domain_level: προσαρμόζει το εύρος (socket, node, ολόκληρο το σύστημα) ορισμένων λειτουργιών μετεγκατάστασης εργασιών εντός των τομέων σχεδιασμού.

Επιπλέον, στο ριζικό σύνολο CPU θα βρείτε cpuset.effective_cpus y cpuset.effective_memsπου αντικατοπτρίζουν τους πραγματικά χρησιμοποιήσιμους πόρους, λαμβάνοντας υπόψη τα συμβάντα άμεσης σύνδεσης CPU/μνήμης. Σε ειδική λειτουργία cpuset_v2_modeΑυτά τα αρχεία ενδέχεται να διαφέρουν από cpuset.cpus y cpuset.mems για να διατηρηθεί μια συμπεριφορά πιο παρόμοια με αυτή του cgroup v2.

Αλληλεπίδραση με τον χρονοπρογραμματιστή: sched_load_balance και sched_relax_domain_level

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

Η σημαία cpuset.sched_load_balance Αυτή η ρύθμιση υποδεικνύει εάν οι CPU σε αυτό το σύνολο CPU πρέπει να βρίσκονται στον ίδιο τομέα για να επιτρέπεται στον προγραμματιστή να μετακινεί εργασίες ελεύθερα μέσα σε αυτό. Η απενεργοποίηση αυτής της ρύθμισης στο ριζικό σύνολο CPU και η ενεργοποίησή της μόνο σε ορισμένα θυγατρικά σύνολα CPU μπορεί να αποτρέψει την περιττή εξισορρόπηση φόρτου των CPU που έχουν δεσμευτεί για φόρτους εργασίας σε πραγματικό χρόνο ή πολύ συγκεκριμένα.

Το αρχείο cpuset.sched_relax_domain_level σας επιτρέπει να ρυθμίσετε την απόσταση που μπορεί να βλέπει ο χρονοπρογραμματιστής όταν:

  • Μια εργασία αφυπνίζεται και γίνεται προσπάθεια να τοποθετηθεί σε έναν κοντινό ελεύθερο πυρήνα.
  • Μία CPU μένει χωρίς εργασία και αναλαμβάνει εργασίες από πιο φορτωμένες CPU.

Οι τυπικές τιμές (ανάλογα με την αρχιτεκτονική) κυμαίνονται από 0 (μην ψάχνετε) μέχρι 5 (αναζήτηση σε επίπεδο πλήρους συστήματος σε συστήματα NUMA), με ενδιάμεσα επίπεδα για αδελφά HT, πυρήνες του ίδιου socket, κόμβους, κ.λπ. Είναι ένα λεπτομερές εργαλείο που θα πρέπει να χρησιμοποιείται μόνο εάν είστε πολύ σαφείς σχετικά με τον αντίκτυπο στις καθυστερήσεις και τις προσωρινές μνήμες.

Πώς να χρησιμοποιήσετε cpusets στην πράξη: τυπική ροή

Η ροή εργασίας Για να περιληφθεί μια "εργασία" ή μια υπηρεσία μέσα σε ένα συγκεκριμένο σύνολο CPU, συνήθως είναι:

  1. Βεβαιωθείτε ότι έχετε προσαρτήσει το σύστημα αρχείων cgroup/cpuset (v1 ή v2).
  2. Δημιουργήστε το σύνολο CPU με mkdir στην αντίστοιχη ιεραρχία.
  3. Ρύθμιση cpuset.cpus y cpuset.mems πριν από την προσθήκη εργασιών.
  4. Προαιρετικά, ενεργοποιήστε σημαίες όπως memory_migrate o cpu_exclusive.
  5. Έναρξη μιας "γονικής" διεργασίας για φόρτωση και μετακινήστε το PID του στο σύνολο της CPU γράφοντάς το μέσα tasks o cgroup.procs.
  6. Εκκίνηση (ή επιτροπή εκκίνησης) θυγατρικών διεργασιών από αυτόν τον γονέα. Θα κληρονομήσουν την ιδιότητα μέλους τους στο cpuset.

Εάν χρησιμοποιείτε εργαλεία χώρου χρήστη ως cgroup-bin / libcgroup (σε Debian/Ubuntu) ή ισοδύναμα σε άλλες διανομές, μπορείτε να το χειριστείτε αυτό πιο εύκολα με εντολές τύπος cgcreate, cgexec y cgclassifyή ακόμα και με αρχεία διαμόρφωσης όπως /etc/cgconfig.conf y /etc/cgrules.conf για να αντιστοιχίσετε ομάδες με βάση τον χρήστη ή την εντολή.

cgroups v1 vs cgroups v2: Οδηγοί CPU και cpuset σε RHEL 8 και παρόμοια συστήματα

Σε σύγχρονες διατάξεις όπως π.χ. RHEL 8ο πυρήνας υποστηρίζει ταυτόχρονα cgroups v1 και v2Από προεπιλογή, στο RHEL 8 η έκδοση 1 είναι τοποθετημένη στο εκκίνησηΩστόσο, μπορείτε να επιβάλετε τη χρήση της ενοποιημένης λειτουργίας (v2) με παραμέτρους πυρήνα:

  • cgroup_no_v1=all: απενεργοποιεί όλους τους ελεγκτές v1 κατά την εκκίνηση.
  • systemd.unified_cgroup_hierarchy=1: λέει στο systemd να χρησιμοποιήσει την cgroup v2 ως κύρια ιεραρχία.

Μετά την αλλαγή και την επανεκκίνηση, μπορείτε να ελέγξετε με mount o findmnt ότι δεν υπάρχουν πλέον κανένα είδος συνελεύσεων cgroup κλασικά (εκτός από τα εσωτερικά του συστήματος) και Συναρμολογήστε ένα δέντρο με το χέρι v2, για παράδειγμα στο /cgroups-v2:

mount -t cgroup2 none /cgroups-v2

Σε αυτόν τον ριζικό κατάλογο (ομάδα ελέγχου ρίζας) θα δείτε γενικά αρχεία που ξεκινούν με cgroup.* και άλλοι συγκεκριμένοι ελεγκτές που είναι ενεργοί εκεί, όπως cpuset.cpus.effective o cpu.max.

Περιορισμός CPU με cgroup v2: Πρόγραμμα οδήγησης CPU και cpuset μαζί

Στην έκδοση 2 εργαζόμαστε με ένα μοναδικό δέντρο και οι ελεγκτές ενεργοποιούνται από το υποδέντρο χρησιμοποιώντας το αρχείο cgroup.subtree_controlΜια τυπική ροή εργασίας για τον περιορισμό της χρήσης της CPU σε μερικές διεργασίες θα ήταν:

  1. Ενεργοποιήστε τα προγράμματα οδήγησης cpu y cpuset για τα άμεσα παιδιά του ρίζα γράφοντας /cgroups-v2/cgroup.subtree_control Κάτι όπως +cpu +cpuset.
  2. Δημιουργήστε μια υποομάδα, για παράδειγμα /cgroups-v2/Example/, Με mkdir.
  3. Επαληθεύστε ότι αρχεία όπως cpu.max y cpuset.cpus.
  4. Προσαρμόζω cpuset.cpus y cpuset.mems για να διασφαλιστεί ότι οι διεργασίες θα ανταγωνίζονται στις ίδιες CPU/κόμβους (τον ελεγκτή) cpu Αυτό ισχύει μόνο εάν υπάρχουν τουλάχιστον δύο διεργασίες που ανταγωνίζονται στην ίδια CPU.
  5. Ρύθμιση cpu.max με χρέωση και περίοδο, για παράδειγμα:
echo "200000 1000000" > /cgroups-v2/Example/cpu.max

Σε αυτήν την περίπτωση, όλες οι διαδικασίες της ομάδας Θα μπορούν να καταναλώνουν συνολικά μόνο 0,2 δευτερόλεπτα χρόνου CPU ανά δευτερόλεπτο. φυσικό. Τον υπόλοιπο χρόνο θα στραγγαλίζονται μέχρι την επόμενη περίοδο.

  WinBoat: Τι είναι και πώς να εκτελείτε εφαρμογές των Windows σε Linux

Τότε υπάρχει μόνο προσθέστε τα PID των επιθυμητών αιτήσεων στην ομάδα γράφοντάς τες /cgroups-v2/Example/cgroup.procsΕάν, για παράδειγμα, υπάρχουν δύο εντατικές διεργασίες (PID 5439 και 5473) σε αυτήν την ομάδα, η καθεμία θα καταλήξει γύρω από το 10% CPUεπειδή μοιράζονται το όριο του 20% που έχετε ορίσει.

Άλλα εργαλεία για την κατανόηση της CPU, της συγγένειας και του υλικού στο Linux

Για να εργαστείτε με CPUs, είναι πολύ χρήσιμο να έχετε καλή κατανόηση του Τοπολογία CPU και την κατάσταση της CPU στο σύστημά σας. Το Linux προσφέρει πολλές εντολές, ψευδο-αρχεία και εργαλεία όπως CPU-X για Linux που παρέχουν λεπτομερείς πληροφορίες:

  • lscpuΕμφανίζει με πολύ ευανάγνωστο τρόπο την αρχιτεκτονική, τον αριθμό των λογικών και φυσικών CPU, τα sockets, το hyper-threading, τις cache, την υποστήριξη εικονικοποίησης κ.λπ.
  • /proc/cpuinfo: εκθέτει λεπτομερείς πληροφορίες ανά λογική CPU: μοντέλο, οικογένεια, βήματα, μικροκώδικας, σημαίες χαρακτηριστικών (SSE, AVX, VT-x, AMD-V, NX, κ.λπ.).
  • /sys/devices/system/cpu/: πολύ πλούσια δομή καταλόγων με έναν υποκατάλογο ανά CPU (cpu0, cpu1, …) και άλλοι για cpufreq, cpuidle, μικροκώδικας, τοπολογίαΚ.λπ.

Μέσα /sys/devices/system/cpu/cpu0/cpufreq/ Μπορείτε να δείτε, για παράδειγμα: (και για περισσότερες λεπτομέρειες, Πώς να μάθετε τη συχνότητα της CPU).

  • cpuinfo_cur_freq: συχνότητα ρεύματος.
  • scaling_max_freq y scaling_min_freq: όρια εντός των οποίων το cpufreq μπορεί να κλιμακωθεί.
  • scaling_governor: ενεργή πολιτική (απόδοση, εξοικονόμηση ενέργειας, κατα παραγγελια, Κ.λπ.).
  • scaling_available_governors y scaling_driver: λειτουργίες και οδηγός σε χρήση (για παράδειγμα, intel_pstate).

En /sys/devices/system/cpu/cpu0/cpuidle/ Θα δείτε καταστάσεις ηρεμίας (state0, state1, …) με καθυστερήσεις και κατανάλωση, που διαχειρίζεται το υποσύστημα cpuidleΑυτό, μαζί με cpufreq Και ο χρονοπρογραμματιστής αποφασίζει πότε να απενεργοποιήσει τους πυρήνες ή να μειώσει τις συχνότητες για εξοικονόμηση ενέργειας με βάση το φορτίο.

En κινητός αρχίζει να χρησιμοποιείται Ενεργειακά Ενήμερος Προγραμματισμός (EAS), το οποίο ενοποιεί με πιο έξυπνο τρόπο τις αποφάσεις από το cpuidle, το cpufreq και τον χρονοπρογραμματιστή για να αποφευχθούν ασυνέπειες όπως η αφύπνιση πυρήνων που είναι απενεργοποιημένοι όταν υπάρχουν διαθέσιμοι άλλοι ενεργοί πυρήνες.

Μέτρηση και παρακολούθηση της χρήσης της CPU ανά διεργασία και ανά ομάδα

Όταν εργάζεστε με σύνολα CPU και προγράμματα οδήγησης CPU, χρειάζεστε εργαλεία για να δείτε αν αυτό που έχετε ρυθμίσει έχει κάποιο αποτέλεσμαΓια παράδειγμα, αν μια εικονική μηχανή όπως Το VirtualBox χρησιμοποιεί πάρα πολύ CPUΜερικές πολύ συνηθισμένες επιλογές είναι:

  • topΔυναμική προβολή συστήματος με συνολική χρήση CPU, ανά CPU και ανά διεργασία. Το πεδίο %ΕΠΕΞΕΡΓΑΣΤΗΣ Σας επιτρέπει να δείτε ποιες εργασίες υπερφορτώνουν το σύστημα.
  • mpstat (από τη συσκευασία) sysstat): Στατιστικά στοιχεία CPU και συγκεντρωτικά στατιστικά, χρήσιμα για την προβολή της κατανομής φορτίου και των χρόνων αδράνειας (idle, iowait, steal, κ.λπ.).
  • psσε συνδυασμό με sortΜπορείτε να απαριθμήσετε τις διεργασίες που καταναλώνουν την περισσότερη CPU, για παράδειγμα:
ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10

Επιπλέον, λογιστικά αρχεία όπως cpuacct.usage y cpuacct.usage_percpu (στην έκδοση 1) ή οι ενσωματωμένοι μετρητές στο cgroup v2 σάς ενημερώνουν για την ποσότητα CPU που έχει καταναλώσει μια συγκεκριμένη ομάδα από τότε που δημιουργήθηκε, κάτι που είναι ιδανικό για εσωτερική χρέωση ή σύγκριση της επίδρασης διαφορετικών εφαρμογών.

Τελικά, τα cpusets και τα cgroups σας δίνουν τη δυνατότητα να μοντελοποιήστε το μηχάνημά σας ως ένα σύνολο "νησιών" πόρωνανάθεση εργασιών και άμεση προσαρμογή του τρόπου κατανομής της CPU, της μνήμης και των εισόδων/εξόδων. Πλήρης κατανόηση των αρχείων του /sys/fs/cgroup και /sys/devices/system/cpu, μαζί με τα εργαλεία παρακολούθησης, σας επιτρέπει να μεταβείτε από το "απλώς να βλέπετε πώς τα πάει ο διακομιστής" στο να έχετε πολύ καλό έλεγχο του τι εκτελείται πού, πόσο καταναλώνει και πώς μπορείτε να βελτιώσετε τη συμπεριφορά του όταν το φόρτο γίνεται μεγάλο.

cpu-x για Linux
σχετικό άρθρο:
CPU-X για Linux: Η δωρεάν εναλλακτική λύση του CPU-Z με έναν πλήρη οδηγό