Steal: ποιος κλέβει χρόνο CPU από εικονικές μηχανές

Steal: ποιος κλέβει χρόνο CPU από εικονικές μηχανές

Γειά σου! Θέλω να σας πω με απλά λόγια για τη μηχανική της κλοπής μέσα σε εικονικές μηχανές και για ορισμένα μη προφανή τεχνουργήματα που καταφέραμε να ανακαλύψουμε κατά τη διάρκεια της έρευνάς της, την οποία έπρεπε να βουτήξω ως τεχνικός διευθυντής μιας πλατφόρμας cloud Mail.ru Cloud Solutions. Η πλατφόρμα λειτουργεί σε KVM.

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

1. Τι είναι κλοπή

Έτσι, η κλοπή είναι μια μέτρηση που υποδεικνύει έλλειψη χρόνου επεξεργαστή για διεργασίες μέσα σε μια εικονική μηχανή. Οπως περιγραφεται στην ενημερωμένη έκδοση κώδικα του πυρήνα KVMStealth είναι ο χρόνος κατά τον οποίο ο hypervisor εκτελεί άλλες διεργασίες στο κεντρικό λειτουργικό σύστημα, παρόλο που έχει θέσει σε ουρά τη διαδικασία της εικονικής μηχανής για εκτέλεση. Δηλαδή, η κλοπή υπολογίζεται ως η διαφορά μεταξύ του χρόνου που η διεργασία είναι έτοιμη να εκτελεστεί και της ώρας κατά την οποία η διεργασία εκχωρείται χρόνος στον επεξεργαστή.

Ο πυρήνας της εικονικής μηχανής λαμβάνει τη μέτρηση κλοπής από τον hypervisor. Ταυτόχρονα, ο hypervisor δεν προσδιορίζει ακριβώς ποιες άλλες διεργασίες εκτελεί, λέει απλώς "ενώ είμαι απασχολημένος, δεν μπορώ να σας δώσω χρόνο". Στο KVM, έχει προστεθεί υποστήριξη για υπολογισμό κλοπής μπαλώματα. Υπάρχουν δύο βασικά σημεία εδώ:

  • Η εικονική μηχανή μαθαίνει για την κλοπή από τον hypervisor. Δηλαδή, από την άποψη των απωλειών, για διεργασίες στην ίδια την εικονική μηχανή αυτή είναι μια έμμεση μέτρηση που μπορεί να υπόκειται σε διάφορες παραμορφώσεις.
  • Ο hypervisor δεν μοιράζεται πληροφορίες με την εικονική μηχανή σχετικά με το τι άλλο κάνει - το κύριο πράγμα είναι ότι δεν αφιερώνει χρόνο σε αυτό. Εξαιτίας αυτού, η ίδια η εικονική μηχανή δεν μπορεί να ανιχνεύσει παραμορφώσεις στον δείκτη κλοπής, οι οποίες θα μπορούσαν να εκτιμηθούν από τη φύση των ανταγωνιστικών διαδικασιών.

2. Τι επηρεάζει την κλοπή

2.1. Υπολογισμός κλοπής

Ουσιαστικά, το steal υπολογίζεται περίπου το ίδιο με τον κανονικό χρόνο χρήσης της CPU. Δεν υπάρχουν πολλές πληροφορίες σχετικά με το πώς θεωρείται η ανακύκλωση. Πιθανώς επειδή οι περισσότεροι άνθρωποι θεωρούν αυτό το ερώτημα προφανές. Υπάρχουν όμως και παγίδες εδώ. Για να εξοικειωθείτε με αυτή τη διαδικασία, μπορείτε να διαβάσετε άρθρο του Brendan Gregg: θα μάθετε για πολλές αποχρώσεις κατά τον υπολογισμό της χρήσης και για καταστάσεις όπου αυτός ο υπολογισμός θα είναι λανθασμένος για τους ακόλουθους λόγους:

  • Ο επεξεργαστής υπερθερμαίνεται, προκαλώντας παράλειψη κύκλων.
  • Ενεργοποίηση/απενεργοποίηση turbo boost, η οποία αλλάζει την ταχύτητα του ρολογιού του επεξεργαστή.
  • Μια αλλαγή στη διάρκεια του χρονικού διαστήματος που συμβαίνει κατά τη χρήση τεχνολογιών εξοικονόμησης ενέργειας επεξεργαστή όπως το SpeedStep.
  • Το πρόβλημα με τον υπολογισμό του μέσου όρου: η εκτίμηση της χρήσης ενός λεπτού στο 80% μπορεί να κρύψει μια βραχυπρόθεσμη έκρηξη 100%.
  • Ένα κλείδωμα περιστροφής προκαλεί την ανάκτηση του επεξεργαστή, αλλά η διαδικασία χρήστη δεν βλέπει καμία πρόοδο στην εκτέλεσή της. Ως αποτέλεσμα, η υπολογισμένη χρήση του επεξεργαστή από τη διαδικασία θα είναι εκατό τοις εκατό, αν και η διαδικασία δεν θα καταναλώσει φυσικά χρόνο του επεξεργαστή.

Δεν έχω βρει ένα άρθρο που να περιγράφει παρόμοιο υπολογισμό για κλοπή (αν γνωρίζετε, μοιραστείτε το στα σχόλια). Όμως, αν κρίνουμε από τον πηγαίο κώδικα, ο μηχανισμός υπολογισμού είναι ο ίδιος με αυτόν της ανακύκλωσης. Απλώς, ένας άλλος μετρητής προστίθεται στον πυρήνα, απευθείας για τη διαδικασία KVM (διαδικασία εικονικής μηχανής), ο οποίος μετράει τη διάρκεια της διαδικασίας KVM σε αναμονή για το χρόνο της CPU. Ο μετρητής λαμβάνει πληροφορίες για τον επεξεργαστή από τις προδιαγραφές του και ελέγχει εάν όλα τα τικ του χρησιμοποιούνται από τη διαδικασία της εικονικής μηχανής. Αν αυτό είναι όλο, τότε υποθέτουμε ότι ο επεξεργαστής ασχολήθηκε μόνο με τη διαδικασία της εικονικής μηχανής. Διαφορετικά, ενημερώνουμε ότι ο επεξεργαστής έκανε κάτι άλλο, εμφανίστηκε το steal.

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

2.2. Τύποι εικονικοποίησης σε KVM

Σε γενικές γραμμές, υπάρχουν τρεις τύποι εικονικοποίησης, οι οποίοι υποστηρίζονται όλοι από την KVM. Ο μηχανισμός εμφάνισης κλοπής μπορεί να εξαρτάται από τον τύπο της εικονικοποίησης.

Εκπομπή. Σε αυτήν την περίπτωση, η λειτουργία του λειτουργικού συστήματος εικονικής μηχανής με φυσικές συσκευές υπερεπόπτη συμβαίνει κάπως έτσι:

  1. Το λειτουργικό σύστημα επισκέπτη στέλνει μια εντολή στη συσκευή φιλοξενουμένων του.
  2. Το πρόγραμμα οδήγησης συσκευής επισκέπτη λαμβάνει την εντολή, δημιουργεί ένα αίτημα για το BIOS της συσκευής και το στέλνει στον υπερεπόπτη.
  3. Η διαδικασία hypervisor μεταφράζει εντολή σε εντολή για τη φυσική συσκευή, καθιστώντας την, μεταξύ άλλων, πιο ασφαλή.
  4. Το πρόγραμμα οδήγησης φυσικής συσκευής αποδέχεται την τροποποιημένη εντολή και τη στέλνει στην ίδια τη φυσική συσκευή.
  5. Τα αποτελέσματα της εκτέλεσης εντολών επιστρέφουν στην ίδια διαδρομή.

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

Εικονικοποίηση υλικού. Σε αυτήν την περίπτωση, η συσκευή σε επίπεδο υλικού κατανοεί εντολές από το λειτουργικό σύστημα. Αυτός είναι ο πιο γρήγορος και καλύτερος τρόπος. Όμως, δυστυχώς, δεν υποστηρίζεται από όλες τις φυσικές συσκευές, τους hypervisors και τα guest λειτουργικά συστήματα. Επί του παρόντος, οι κύριες συσκευές που υποστηρίζουν εικονικοποίηση υλικού είναι οι επεξεργαστές.

Παραεικονικότητα. Η πιο κοινή επιλογή για εικονικοποίηση συσκευών στο KVM και γενικά η πιο κοινή λειτουργία εικονικοποίησης για επισκέπτη λειτουργικά συστήματα. Η ιδιαιτερότητά του είναι ότι η εργασία με ορισμένα υποσυστήματα hypervisor (για παράδειγμα, με το δίκτυο ή τη στοίβα δίσκου) ή η εκχώρηση σελίδων μνήμης πραγματοποιείται χρησιμοποιώντας το API του hypervisor, χωρίς να μεταφράζονται εντολές χαμηλού επιπέδου. Το μειονέκτημα αυτής της μεθόδου εικονικοποίησης είναι ότι ο πυρήνας του επισκέπτη του λειτουργικού συστήματος πρέπει να τροποποιηθεί έτσι ώστε να μπορεί να επικοινωνεί με τον hypervisor χρησιμοποιώντας αυτό το API. Αλλά αυτό συνήθως λύνεται με την εγκατάσταση ειδικών προγραμμάτων οδήγησης στο λειτουργικό σύστημα επισκέπτη. Στο KVM αυτό το API ονομάζεται virtio API.

Με την παραεικονικότητα, σε σύγκριση με τη μετάδοση, η διαδρομή προς τη φυσική συσκευή μειώνεται σημαντικά με την αποστολή εντολών απευθείας από την εικονική μηχανή στη διαδικασία hypervisor στον κεντρικό υπολογιστή. Αυτό σας επιτρέπει να επιταχύνετε την εκτέλεση όλων των εντολών μέσα στην εικονική μηχανή. Στο KVM, αυτό γίνεται από το virtio API, το οποίο λειτουργεί μόνο για ορισμένες συσκευές, όπως έναν προσαρμογέα δικτύου ή δίσκου. Αυτός είναι ο λόγος για τον οποίο τα προγράμματα οδήγησης virtio εγκαθίστανται μέσα σε εικονικές μηχανές.

Το μειονέκτημα αυτής της επιτάχυνσης είναι ότι δεν παραμένουν όλες οι διεργασίες που εκτελούνται μέσα στην εικονική μηχανή. Αυτό δημιουργεί ορισμένα ειδικά εφέ που μπορούν να οδηγήσουν σε ωοτοκία στο steal. Συνιστώ να ξεκινήσετε μια λεπτομερή μελέτη αυτού του ζητήματος με Ένα API για εικονικό I/O: virtio.

2.3. «Δίκαιος» προγραμματισμός

Μια εικονική μηχανή σε έναν hypervisor είναι, στην πραγματικότητα, μια συνηθισμένη διαδικασία που υπακούει στους νόμους του χρονοπρογραμματισμού (κατανομή πόρων μεταξύ διεργασιών) στον πυρήνα του Linux, οπότε ας ρίξουμε μια πιο προσεκτική ματιά σε αυτήν.

Το Linux χρησιμοποιεί το λεγόμενο CFS, Completely Fair Scheduler, το οποίο έχει γίνει ο προεπιλεγμένος προγραμματιστής από τον πυρήνα 2.6.23. Για να κατανοήσετε αυτόν τον αλγόριθμο, μπορείτε να διαβάσετε το Linux Kernel Architecture ή τον πηγαίο κώδικα. Η ουσία του CFS είναι να κατανέμει το χρόνο του επεξεργαστή μεταξύ των διεργασιών ανάλογα με τη διάρκεια της εκτέλεσής τους. Όσο περισσότερο χρόνο CPU απαιτεί μια διεργασία, τόσο λιγότερο χρόνο CPU λαμβάνει. Αυτό διασφαλίζει ότι όλες οι διεργασίες εκτελούνται "δίκαια" - έτσι ώστε μια διεργασία να μην καταλαμβάνει συνεχώς όλους τους επεξεργαστές και άλλες διεργασίες μπορούν επίσης να εκτελεστούν.

Μερικές φορές αυτό το παράδειγμα οδηγεί σε ενδιαφέροντα αντικείμενα. Οι μακροχρόνιοι χρήστες Linux πιθανότατα θυμούνται το πάγωμα ενός κανονικού επεξεργαστή κειμένου σε έναν επιτραπέζιο υπολογιστή κατά την εκτέλεση εφαρμογών έντασης πόρων, όπως ο μεταγλωττιστής. Αυτό συνέβη επειδή οι εργασίες που δεν απαιτούσαν πόρους σε εφαρμογές επιτραπέζιου υπολογιστή ανταγωνίζονταν τις εργασίες έντασης πόρων, όπως ο μεταγλωττιστής. Το CFS πιστεύει ότι αυτό είναι άδικο, επομένως σταματά περιοδικά το πρόγραμμα επεξεργασίας κειμένου και αφήνει τον επεξεργαστή να χειρίζεται τις εργασίες του μεταγλωττιστή. Αυτό διορθώθηκε χρησιμοποιώντας έναν μηχανισμό sched_autogroup, αλλά παρέμειναν πολλά άλλα χαρακτηριστικά της κατανομής του χρόνου του επεξεργαστή μεταξύ των εργασιών. Στην πραγματικότητα, αυτή δεν είναι μια ιστορία για το πόσο άσχημα είναι όλα στο CFS, αλλά μια προσπάθεια να επιστήσουμε την προσοχή στο γεγονός ότι η "δίκαιη" κατανομή του χρόνου του επεξεργαστή δεν είναι η πιο ασήμαντη εργασία.

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

Χρειάζεται μια τόσο μεγάλη ιστορία για να εξηγηθεί ένα γεγονός: όσο περισσότερους πόρους επεξεργαστή προσπαθεί να καταναλώσει μια διεργασία σε έναν ειλικρινή προγραμματιστή Linux, τόσο πιο γρήγορα θα σταματήσει, ώστε να μπορούν να λειτουργήσουν και άλλες διεργασίες. Το αν αυτό είναι σωστό ή όχι είναι μια περίπλοκη ερώτηση που μπορεί να λυθεί διαφορετικά κάτω από διαφορετικά φορτία. Στα Windows, μέχρι πρόσφατα, ο χρονοπρογραμματιστής επικεντρωνόταν στην επεξεργασία κατά προτεραιότητα εφαρμογών επιφάνειας εργασίας, κάτι που θα μπορούσε να προκαλέσει πάγωμα των διεργασιών στο παρασκήνιο. Ο Sun Solaris είχε πέντε διαφορετικές κατηγορίες προγραμματιστών. Όταν ξεκινήσαμε το virtualization, προσθέσαμε ένα έκτο, Προγραμματιστής δίκαιου μεριδίου, επειδή τα προηγούμενα πέντε δεν λειτουργούσαν επαρκώς με την εικονικοποίηση Solaris Zones. Συνιστώ να ξεκινήσετε μια λεπτομερή μελέτη αυτού του ζητήματος με βιβλία όπως Solaris Internals: Solaris 10 και OpenSolaris Kernel Architecture ή Κατανόηση του πυρήνα του Linux.

2.4. Πώς να παρακολουθείτε την κλοπή;

Η παρακολούθηση κλοπής μέσα σε μια εικονική μηχανή, όπως κάθε άλλη μέτρηση επεξεργαστή, είναι απλή: μπορείτε να χρησιμοποιήσετε οποιοδήποτε εργαλείο μετρήσεων επεξεργαστή. Το κύριο πράγμα είναι ότι η εικονική μηχανή είναι σε Linux. Για κάποιο λόγο τα Windows δεν παρέχουν αυτές τις πληροφορίες στους χρήστες τους. 🙁

Steal: ποιος κλέβει χρόνο CPU από εικονικές μηχανές
Έξοδος της επάνω εντολής: λεπτομέρειες του φορτίου του επεξεργαστή, στην πιο δεξιά στήλη - κλοπή

Η δυσκολία προκύπτει όταν προσπαθείτε να λάβετε αυτές τις πληροφορίες από τον hypervisor. Μπορείτε να δοκιμάσετε να προβλέψετε την κλοπή στον κεντρικό υπολογιστή, για παράδειγμα, χρησιμοποιώντας την παράμετρο Load Average (LA) - τη μέση τιμή του αριθμού των διεργασιών που αναμένουν στην ουρά εκτέλεσης. Η μέθοδος για τον υπολογισμό αυτής της παραμέτρου δεν είναι απλή, αλλά γενικά, εάν το LA που κανονικοποιείται από τον αριθμό των νημάτων του επεξεργαστή είναι περισσότερο από 1, αυτό σημαίνει ότι ο διακομιστής Linux είναι υπερφορτωμένος με κάτι.

Τι περιμένουν όλες αυτές οι διαδικασίες; Η προφανής απάντηση είναι ο επεξεργαστής. Αλλά η απάντηση δεν είναι εντελώς σωστή, γιατί μερικές φορές ο επεξεργαστής είναι ελεύθερος, αλλά το LA ξεφεύγει από την κλίμακα. Θυμάμαι πώς πέφτει το NFS και πώς μεγαλώνει το LA. Το ίδιο μπορεί να συμβεί με έναν δίσκο και άλλες συσκευές εισόδου/εξόδου. Αλλά στην πραγματικότητα, οι διεργασίες μπορούν να περιμένουν το τέλος οποιουδήποτε κλειδώματος, είτε φυσικού, που σχετίζεται με μια συσκευή I/O, είτε λογικό, όπως ένα mutex. Αυτό περιλαμβάνει επίσης το κλείδωμα στο επίπεδο του υλικού (η ίδια απόκριση από το δίσκο) ή τη λογική (τα λεγόμενα locking primitives, τα οποία περιλαμβάνουν ένα σωρό οντότητες, mutex adaptive και spin, σηματοφόρους, μεταβλητές κατάστασης, κλειδώματα rw, ipc locks ...).

Ένα άλλο χαρακτηριστικό του LA είναι ότι θεωρείται ως μέσος όρος του λειτουργικού συστήματος. Για παράδειγμα, 100 διεργασίες ανταγωνίζονται για ένα αρχείο και μετά LA=50. Μια τόσο μεγάλη τιμή φαίνεται να δείχνει ότι το λειτουργικό σύστημα είναι κακό. Αλλά για άλλους λανθασμένα γραμμένους κώδικα, αυτή μπορεί να είναι μια κανονική κατάσταση, παρά το γεγονός ότι μόνο αυτός είναι κακός και άλλες διεργασίες στο λειτουργικό σύστημα δεν υποφέρουν.

Λόγω αυτού του μέσου όρου (και σε όχι λιγότερο από ένα λεπτό), ο προσδιορισμός οτιδήποτε από τον δείκτη LA δεν είναι η πιο ικανοποιητική εργασία, με πολύ αβέβαια αποτελέσματα σε συγκεκριμένες περιπτώσεις. Αν προσπαθήσετε να το καταλάβετε, θα διαπιστώσετε ότι τα άρθρα στη Wikipedia και σε άλλους διαθέσιμους πόρους περιγράφουν μόνο τις απλούστερες περιπτώσεις, χωρίς μια βαθιά εξήγηση της διαδικασίας. Στέλνω ξανά σε όλους όσους ενδιαφέρονται, εδώ στον Μπρένταν Γκρεγκ  - ακολουθήστε τους παρακάτω συνδέσμους. Ποιος είναι πολύ τεμπέλης για να μιλήσει αγγλικά - μετάφραση του δημοφιλούς άρθρου του για το LA.

3. Ειδικά εφέ

Ας δούμε τώρα τις κύριες περιπτώσεις κλοπής που συναντήσαμε. Θα σας πω πώς προκύπτουν από όλα τα παραπάνω και πώς σχετίζονται με τους δείκτες στον hypervisor.

Ανακύκλωση. Το απλούστερο και πιο συνηθισμένο: ο hypervisor έχει επαναχρησιμοποιηθεί. Πράγματι, υπάρχουν πολλές εικονικές μηχανές που λειτουργούν, υψηλή κατανάλωση επεξεργαστή μέσα τους, μεγάλος ανταγωνισμός, η χρήση του LA είναι μεγαλύτερη από 1 (κανονικοποιημένη από τα νήματα του επεξεργαστή). Τα πάντα μέσα σε όλες τις εικονικές μηχανές επιβραδύνονται. Η κλοπή που μεταδίδεται από τον hypervisor αυξάνεται επίσης, είναι απαραίτητο να ανακατανεμηθεί το φορτίο ή να απενεργοποιηθεί κάποιος. Γενικά, όλα είναι λογικά και κατανοητά.

Paravirtualization έναντι μεμονωμένων περιπτώσεων. Υπάρχει μόνο μία εικονική μηχανή στον hypervisor· καταναλώνει ένα μικρό μέρος της, αλλά παράγει μεγάλο φορτίο I/O, για παράδειγμα στο δίσκο. Και από κάπου εμφανίζεται ένα μικρό κλέψιμο, έως και 10% (όπως φαίνεται από αρκετά πειράματα).

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

Αυτό συμβαίνει τη στιγμή που αποστέλλεται το buffer, μπαίνει στο χώρο του πυρήνα του hypervisor και αρχίζουμε να το περιμένουμε. Αν και, από την πλευρά της εικονικής μηχανής, θα πρέπει να επιστρέψει αμέσως. Επομένως, σύμφωνα με τον αλγόριθμο υπολογισμού κλοπής, αυτός ο χρόνος θεωρείται κλεμμένος. Πιθανότατα, σε αυτήν την κατάσταση μπορεί να υπάρχουν άλλοι μηχανισμοί (για παράδειγμα, επεξεργασία κάποιων άλλων κλήσεων sys), αλλά δεν θα πρέπει να είναι πολύ διαφορετικοί.

Χρονοδιάγραμμα έναντι εικονικών μηχανών με υψηλή φόρτωση. Όταν μια εικονική μηχανή υποφέρει από κλοπή περισσότερο από άλλες, αυτό οφείλεται στον προγραμματιστή. Όσο περισσότερο μια διεργασία φορτώνει τον επεξεργαστή, τόσο πιο γρήγορα ο προγραμματιστής θα τον αποκλείσει ώστε να μπορούν να λειτουργήσουν και οι άλλοι. Εάν η εικονική μηχανή καταναλώνει ελάχιστα, δύσκολα θα δει να κλέβει: η διαδικασία της ειλικρινά καθόταν και περίμενε, πρέπει να της δώσουμε περισσότερο χρόνο. Εάν μια εικονική μηχανή παράγει το μέγιστο φορτίο σε όλους τους πυρήνες της, συχνά αποβάλλεται από τον επεξεργαστή και προσπαθούν να μην της δώσουν πολύ χρόνο.

Είναι ακόμη χειρότερο όταν οι διαδικασίες μέσα στην εικονική μηχανή προσπαθούν να αποκτήσουν περισσότερο επεξεργαστή επειδή δεν μπορούν να αντιμετωπίσουν την επεξεργασία δεδομένων. Στη συνέχεια, το λειτουργικό σύστημα στον hypervisor, λόγω της ειλικρινούς βελτιστοποίησης, θα παρέχει όλο και λιγότερο χρόνο στον επεξεργαστή. Αυτή η διαδικασία συμβαίνει σαν χιονοστιβάδα και το steal πηδά στους ουρανούς, αν και άλλες εικονικές μηχανές δύσκολα μπορεί να το παρατηρήσουν. Και όσο περισσότεροι πυρήνες, τόσο χειρότερο είναι το μηχάνημα που επηρεάζεται. Εν ολίγοις, οι εικονικές μηχανές με μεγάλο φορτίο με πολλούς πυρήνες υποφέρουν περισσότερο.

Χαμηλό LA, αλλά υπάρχει κλέψιμο. Εάν το LA είναι περίπου 0,7 (δηλαδή, ο hypervisor φαίνεται να είναι υποφορτωμένος), αλλά παρατηρείται κλοπή μέσα σε μεμονωμένες εικονικές μηχανές:

  • Η επιλογή με παραεικονικότητα που περιγράφηκε ήδη παραπάνω. Η εικονική μηχανή μπορεί να λάβει μετρήσεις που υποδεικνύουν κλοπή, αν και ο hypervisor είναι εντάξει. Σύμφωνα με τα αποτελέσματα των πειραμάτων μας, αυτή η επιλογή κλοπής δεν υπερβαίνει το 10% και δεν θα πρέπει να έχει σημαντικό αντίκτυπο στην απόδοση των εφαρμογών μέσα στην εικονική μηχανή.
  • Η παράμετρος LA δεν έχει υπολογιστεί σωστά. Πιο συγκεκριμένα, σε κάθε συγκεκριμένη στιγμή υπολογίζεται σωστά, αλλά όταν υπολογίζεται κατά μέσο όρο πάνω από ένα λεπτό αποδεικνύεται ότι είναι υποτιμημένο. Για παράδειγμα, εάν μια εικονική μηχανή ανά τρίτο του υπερεπόπτη καταναλώνει όλους τους επεξεργαστές της για ακριβώς μισό λεπτό, τότε το LA ανά λεπτό στον υπερεπόπτη θα είναι 0,15. Τέσσερις τέτοιες εικονικές μηχανές που λειτουργούν ταυτόχρονα δίνουν 0,6. Και το γεγονός ότι για μισό λεπτό σε καθένα από αυτά υπήρχε ένα άγριο κλέψιμο στο 25% σύμφωνα με τον δείκτη LA δεν μπορεί πλέον να αποσυρθεί.
  • Και πάλι, λόγω του προγραμματιστή που αποφάσισε ότι κάποιος έτρωγε πάρα πολύ και άφησε αυτόν κάποιον να περιμένει. Εν τω μεταξύ, θα αλλάξω το πλαίσιο, θα χειριστώ τις διακοπές και θα φροντίσω άλλα σημαντικά πράγματα του συστήματος. Ως αποτέλεσμα, ορισμένες εικονικές μηχανές δεν βλέπουν κανένα πρόβλημα, ενώ άλλες αντιμετωπίζουν σοβαρή υποβάθμιση της απόδοσης.

4. Άλλες στρεβλώσεις

Υπάρχουν ένα εκατομμύριο ακόμη λόγοι για την παραμόρφωση της δίκαιης απόδοσης του χρόνου επεξεργαστή σε μια εικονική μηχανή. Για παράδειγμα, το hyperthreading και το NUMA εισάγουν δυσκολίες στους υπολογισμούς. Μπερδεύουν εντελώς την επιλογή του πυρήνα για την εκτέλεση της διαδικασίας, γιατί ο χρονοπρογραμματιστής χρησιμοποιεί συντελεστές - βάρη, που κάνουν τον υπολογισμό ακόμα πιο δύσκολο κατά την εναλλαγή του περιβάλλοντος.

Υπάρχουν παραμορφώσεις λόγω τεχνολογιών όπως το turbo boost ή, αντίθετα, η λειτουργία εξοικονόμησης ενέργειας, η οποία, κατά τον υπολογισμό της χρήσης, μπορεί να αυξήσει ή να μειώσει τεχνητά τη συχνότητα ή ακόμα και το χρονικό διάστημα στον διακομιστή. Η ενεργοποίηση του turbo boost μειώνει την απόδοση ενός νήματος επεξεργαστή λόγω της αύξησης της απόδοσης ενός άλλου. Αυτή τη στιγμή, πληροφορίες σχετικά με την τρέχουσα συχνότητα του επεξεργαστή δεν μεταδίδονται στην εικονική μηχανή και πιστεύει ότι κάποιος κλέβει το χρόνο της (για παράδειγμα, ζήτησε 2 GHz, αλλά έλαβε τα μισά).

Γενικά, μπορεί να υπάρχουν πολλοί λόγοι για παραμόρφωση. Μπορεί να βρείτε κάτι άλλο σε ένα συγκεκριμένο σύστημα. Είναι καλύτερα να ξεκινήσετε με τα βιβλία στα οποία έδωσα συνδέσμους παραπάνω και με την ανάκτηση στατιστικών στοιχείων από τον hypervisor χρησιμοποιώντας βοηθητικά προγράμματα όπως το perf, το sysdig, το systemtap, εκ των οποίων δεκάδες.

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

  1. Κάποιο ποσό κλοπής μπορεί να συμβεί λόγω παραεικονισμού και μπορεί να θεωρηθεί φυσιολογικό. Γράφουν στο Διαδίκτυο ότι αυτή η τιμή μπορεί να είναι 5-10%. Εξαρτάται από τις εφαρμογές μέσα στην εικονική μηχανή και από το φορτίο που επιβαρύνει τις φυσικές συσκευές της. Εδώ είναι σημαντικό να δώσετε προσοχή στο πώς αισθάνονται οι εφαρμογές μέσα σε εικονικές μηχανές.
  2. Η αναλογία του φορτίου στον hypervisor και της κλοπής μέσα στην εικονική μηχανή δεν είναι πάντα ξεκάθαρα αλληλένδετες· και οι δύο εκτιμήσεις της κλοπής μπορεί να είναι εσφαλμένες σε συγκεκριμένες καταστάσεις κάτω από διαφορετικά φορτία.
  3. Ο προγραμματιστής έχει κακή στάση απέναντι σε διαδικασίες που ζητούν πολλά. Προσπαθεί να δίνει λιγότερα σε αυτούς που ζητούν περισσότερα. Οι μεγάλες εικονικές μηχανές είναι κακές.
  4. Λίγη κλοπή μπορεί να είναι ο κανόνας ακόμη και χωρίς παραεικονικότητα (λαμβάνοντας υπόψη το φορτίο μέσα στην εικονική μηχανή, τα χαρακτηριστικά του φορτίου των γειτόνων, την κατανομή φορτίου στα νήματα και άλλους παράγοντες).
  5. Αν θέλετε να καταλάβετε την κλοπή σε ένα συγκεκριμένο σύστημα, πρέπει να εξερευνήσετε διάφορες επιλογές, να συλλέξετε μετρήσεις, να τις αναλύσετε προσεκτικά και να σκεφτείτε πώς να κατανείμετε ομοιόμορφα το φορτίο. Είναι δυνατές αποκλίσεις από οποιεσδήποτε περιπτώσεις, οι οποίες πρέπει να επιβεβαιωθούν πειραματικά ή να εξεταστούν στο πρόγραμμα εντοπισμού σφαλμάτων του πυρήνα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο