Αναφορά περιστατικού: Προβλήματα σε Ευρώπη-Βραζιλία

Τα τεχνικά θέματα που προκάλεσαν τις πρόσφατες διακοπές λειτουργίας του Clash σε Ευρώπη και Βραζιλία.

Γεια σας, είμαι ο Brian «Penrif» Bossé από το τμήμα Τεχνολογίας του League of Legends και θα μοιραστώ μαζί σας κάποιες λεπτομέρειες σχετικά με τα τεχνικά θέματα που προκάλεσαν τις πρόσφατες διακοπές της υπηρεσίας στους σέρβερ Δυτικής Ευρώπης, Βόρειας και Ανατολικής Ευρώπης και Βραζιλίας προς τα τέλη Φεβρουαρίου. Θα χρησιμοποιήσω αρκετά τεχνική ορολογία για τους «καμένους», αλλά αν θέλετε να μάθετε περισσότερα σχετικά με αυτές τις διακοπές και τι κάναμε για να τις φτιάξουμε, ακολουθήστε με σε ένα ταξίδι στον κόσμο των υπολογιστών και των γραφημάτων!



Πώς φτάσαμε εδώ

Το πρώτο σύμπτωμα που εντόπισε το άγρυπνο Κέντρο Επιχειρήσεων Δικτύου μας ήταν ότι ο αριθμός των παιχνιδιών στο League είχε αρχίσει να μειώνεται δραστικά.



incidentreportoutages_1.png

Ασυνήθιστο φαινόμενο

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

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

incidentreportoutages_2.png

Η κόκκινη οριζόντια γραμμή στο κάτω μέρος δείχνει πότε χτυπάει ο συναγερμός

Αυτό που βλέπουμε εδώ είναι ο αριθμός εισερχόμενων συνδέσεων σε έναν από τους κεντρικούς υπολογιστές container. Πρόκειται για πολύ ισχυρούς ενιαίους υπολογιστές που εκτελούν μια σειρά από μικρότερες εφαρμογές —container, όπως είναι η τεχνική ορολογία— οι οποίες αποτελούν το ευρύτερο σύστημα που ορίζει τη λειτουργία του League. Δύο από αυτούς τους κεντρικούς υπολογιστές δέχονται φοβερά περισσότερες συνδέσεις από όσο θα ήταν λογικό. Για να καταλάβουμε γιατί συμβαίνει αυτό, πρέπει να εξηγήσουμε τη λειτουργία ενός συγκεκριμένου είδους container, που εκτελεί λειτουργίες «edge».


Φιλτράρισμα

Οι διεργασίες edge αναλαμβάνουν να υποδεχτούν τα δεδομένα που έρχονται μέσω internet, να τα φιλτράρουν και να τα μεταφέρουν στην κατάλληλη υπηρεσία υποδομής. Ουσιαστικά μαζεύουν όλα τα σκουπίδια που έρχονται από το δημόσιο internet και αφήνουν μόνο μια ωραία, καθαρή ροή byte που μπορούν να επεξεργαστούν άνετα οι υπόλοιπες διεργασίες. Όπως καταλαβαίνετε οι διεργασίες edge φιλτράρουν μεγάλους όγκους δεδομένων, αλλά απότομες αυξήσεις, όπως αυτές που είδαμε σε αυτά τα συμβάντα, δεν είναι συχνές. Υπάρχουν τρεις παράγοντες που συνδυάστηκαν μεταξύ τους για να δημιουργηθεί αυτή η κατάσταση. Θα σας εξηγήσω τον καθέναν στη δική του ενότητα και μετά θα τα συνδυάσω όλα μαζί.



Όλα ξεκινούν από εδώ

incidentreportoutages_3.png

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



Παιδιά, έχουμε διαρροή

Είχαμε, επίσης, ένα γνωστό θέμα με την αλληλεπίδραση του συστήματος των container με την έκδοση λειτουργικού συστήματος που χρησιμοποιούσαμε. Το πρόβλημα είχε να κάνει με μια διαρροή μνήμης στα σπλάχνα του λειτουργικού συστήματος, η οποία, αν είχε αρκετό χρόνο για να φτάσει σε κρίσιμα επίπεδα, θα μπορούσε να διακόψει τη λειτουργία βασικών λειτουργιών συστήματος. Πριν από αυτό το συμβάν δεν είχε συμβεί ποτέ κάτι τέτοιο, αλλά είχαμε αναβαθμίσει ήδη περίπου το 60% των container της Riot, ούτως ή άλλως. Δυστυχώς, η ενημέρωση των συστοιχιών της Ευρώπης και της Λατινικής Αμερικής δεν είχε ολοκληρωθεί ακόμα.



Άμα δεν σε θέλει...

Τέλος, ήμασταν και άτυχοι. Χρησιμοποιούμε ένα συγκεκριμένο λογισμικό για να οργανώσουμε τα container σε ομάδες που μπορεί να διαχειριστεί ένας κεντρικός υπολογιστής. Το λογισμικό διαθέτει ενσωματωμένους περιορισμούς, οι οποίοι διαχωρίζουν μεταξύ τους τις υπηρεσίες edge, παρόλο που εκτελούνται στο ίδιο σετ container ενός κεντρικού υπολογιστή. Όμως, δεν μπορούσαμε να ελέγξουμε την περίπτωση που υπηρεσίες edge από διαφορετικά σετ θα έφταναν στον ίδιο υπολογιστή, με αποτέλεσμα να έχουμε υπηρεσίες από τη Δυτική Ευρώπη να βρίσκονται στο ίδιο σημείο με υπηρεσίες edge από Βόρεια και Ανατολική Ευρώπη. Αυτό είχε ως αποτέλεσμα να πολλαπλασιαστεί ο φόρτος εργασίας ενός υπολογιστή, κάτι που μεγιστοποίησε τον αντίκτυπο των δύο προηγούμενων ζητημάτων και δημιούργησε σημαντικό πρόβλημα.

Σε όλες τις περιπτώσεις που είχαμε διακοπή υπηρεσίας, τα container που εκτελούσαν λειτουργίες edge από τουλάχιστον τρία σετ βρέθηκαν στον ίδιο υπολογιστή. Τα αιτήματα που δεν ήταν διαμορφωμένα σωστά αυξήθηκαν ξαφνικά, ταυτόχρονα είχαμε πολλά τμήματα αυτού του όγκου δεδομένων να φτάνουν στον ίδιο υπολογιστή, ενώ παράλληλα η διαρροή μνήμης στο λειτουργικό σύστημα έκανε αυτόν τον υπολογιστή να ξεπεράσει τα όριά του και να μην μπορεί να ανταποκριθεί. Το αποτέλεσμα όλων αυτών ήταν να διασπαστεί η ακεραιότητα των δεδομένων και να δημιουργηθούν σημαντικές διακοπές στην υπηρεσία.



Συνέπειες και αντιμετώπιση

Συνήθως χρειάζεται μεγάλη προσπάθεια για να λυθεί ένα πρόβλημα αυτού του μεγέθους και να απομονωθούν οι αιτίες του. Όταν έπρεπε να αποφασίσουμε αν θα προχωρήσουμε με το Clash ενώ είχαμε μια συστοιχία που μπορούσε να παρουσιάσει πιθανή αστάθεια, γνωρίζαμε ότι τα container ήταν ένα σημαντικό μέρος του προβλήματος, αλλά δεν μπορούσαμε να γνωρίζουμε ποιος θα ήταν ο ακριβής όγκος των δεδομένων. Παρ' όλο που γνωρίζαμε ότι η αιτία του προβλήματος δεν ήταν το Clash, πήραμε την απόφαση να καθυστερήσουμε την έναρξη για μια εβδομάδα, ώστε να είμαστε σίγουροι ότι η εμπειρία του Clash δεν θα υποφέρει. Ζητώ ειλικρινά συγγνώμη για την αναστάτωση που προκάλεσαν αυτά τα συμβάντα και θέλω να σας διαβεβαιώσω ότι έχουμε βρει τη λύση για όλα τα τεχνικά θέματα που συνέβαλαν σε αυτήν τη δυσάρεστη εικόνα.

incidentreportoutages_4.png

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

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