Λειτουργίες IT — αξιοπιστία υπηρεσιών Ζωντανό μοντέλο

Είστε εφημερεύων για μια υπηρεσία ιστού: έναν load balancer μπροστά από έναν στόλο στιγμιοτύπων, μια cache μπροστά από μια βάση δεδομένων, και στόχο διαθεσιμότητας 99,9 %. Κάθε λεπτό το μοντέλο υπολογίζει καθυστέρηση ουράς, timeouts, cache hits και φορτίο βάσης δεδομένων από τύπους εγχειριδίου — και το κόστος των αποφάσεών σας.

Τι θα μάθετε

Προσομοιωτής

Χρόνος 0 min
Αιτήματα 1125 · Ποσοστό σφαλμάτων 0,00% · Καθυστέρηση p99 342 ms · Στιγμιότυπα που εξυπηρετούν 10 (+0) · Ποσοστό cache hit 77% · Χρήση βάσης δεδομένων 19% · Προϋπολογισμός σφαλμάτων που απομένει (30 ημέρες) 50,0%⇉1125 req/s▶▶▶▶▶▶▶▶▶▶······························▶ 10 · ⚙ 0 · 52% · p99 342 msΧρήση στόλου 52%Ποσοστό cache hit 77%Χρήση βάσης δεδομένων 19%⚠ 0,00% · 🔥 0,0×50%$ 4,00/h · Σ $0,00
  • Στιγμιότυπο εξυπηρετεί
  • Στιγμιότυπο εκκινεί
  • Στιγμιότυπο στην κακή έκδοση
  • Ελεύθερη θέση
  • Εισερχόμενα αιτήματα

Χειριστήρια

Κατώτατο όριο για τον στόλο. Η αύξησή του ξεκινά αμέσως στιγμιότυπα — χρειάζονται όμως ακόμη την καθυστέρηση εκκίνησης πριν εξυπηρετήσουν.

Παρακολούθηση στόχου στη χρήση· καμία νέα κλιμάκωση προς τα πάνω όσο ακόμη εκκινούν στιγμιότυπα. Off = ακριβώς το ελάχιστο.

Χαμηλότερο = περισσότερο περιθώριο και περισσότερο κόστος. Η μετρούμενη χρήση δεν μπορεί να ξεπεράσει το 100 %, οπότε ένας κορεσμένος στόλος μεγαλώνει μόνο βήμα βήμα.

Μεγαλύτερο TTL = περισσότερα hits, αλλά οι απαντήσεις μπορεί να είναι παλαιότερες (μέση ηλικία ≈ TTL/2).

Φορτώνει δημοφιλή κλειδιά για 6 λεπτά (+12 % της cache ανά λεπτό) με κόστος 600 επιπλέον ερωτήματα βάσης δεδομένων/s.

Ποσοστό του 30 % χαμηλής προτεραιότητας (prefetch, batch, crawlers) που απορρίπτεται στον load balancer με «δοκιμάστε ξανά αργότερα».

Η βαριά λειτουργία προσθέτει 20 ms CPU και ένα ερώτημα βάσης δεδομένων ανά αίτημα. Off = ελεγχόμενη υποβάθμιση.

Αναπτύσσει ξανά την τελευταία καλή έκδοση σε νέο στόλο (5 min, χρεώνεται δύο φορές) και μετά αλλάζει την κίνηση. Αν πατήσετε ξανά, η προετοιμασία ξαναρχίζει· χωρίς κακή έκδοση σε λειτουργία, απλώς κοστίζει χρήματα.

Δείκτες

Ποσοστό σφαλμάτων
0,00%
κανονικό
Καθυστέρηση p99
342ms
κανονικό
Προϋπολογισμός σφαλμάτων που απομένει (30 ημέρες)
50,0%
κανονικό
Χρήση στόλου
52%
κανονικό
Ρυθμός κατανάλωσης (1 h)0,0 ×
Αιτήματα1125 req/s
Στιγμιότυπα που εξυπηρετούν10
Στιγμιότυπα που εκκινούν0
Ποσοστό cache hit77 %
Χρήση βάσης δεδομένων19 %
Κίνηση που αποβλήθηκε0 %
Κόστος στόλου4,00 $/h
Κόστος μέχρι τώρα0,00 $
Μέση ηλικία των απαντήσεων στη cache30 s
Κίνηση στην κακή έκδοση0 %
Προτάσεις διαθέσιμες100 %

Τάση

Ποσοστό σφαλμάτων: — %20,000,00

Σενάρια κρίσεων

Επίπεδο 1 · Κακή έκδοση

Μια νέα έκδοση βγαίνει στις 09:10. Ο μήνας ήταν ήδη δύσκολος: απομένει μόνο το 20 % του προϋπολογισμού σφαλμάτων. Λεπτά μετά την ανάπτυξη χτυπά η ειδοποίηση ρυθμού κατανάλωσης. Προστατέψτε τον προϋπολογισμό.

  • Προϋπολογισμός σφαλμάτων που απομένει στο τέλος ≥ 18,5 %
  • Μέσο ποσοστό σφαλμάτων ≤ 0,65 % μετά την ανάπτυξη
  • Κόστος στόλου ≤ 9,50 $

Επίπεδο 2 · Ξαφνικό πλήθος επισκεπτών

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

  • Μέσο ποσοστό σφαλμάτων ≤ 0,2 %
  • Μέση καθυστέρηση p99 ≤ 400 ms
  • Μέση κίνηση που αποβλήθηκε ≤ 5 %
  • Συνολικό κόστος ≤ 21 $
  • Προτάσεις διαθέσιμες ≥ 85 % του χρόνου

Επίπεδο 3 · Κρύα cache

Στη μεσημεριανή αιχμή ένα script συντήρησης αδειάζει ολόκληρη την cache. Κάθε αίτημα πηγαίνει τώρα στη βάση δεδομένων, που είχε διαστασιολογηθεί για το συνηθισμένο ποσοστό hit 85 %. Επαναφέρετε την υπηρεσία χωρίς να υπερφορτώσετε τη βάση δεδομένων.

  • Μέσο ποσοστό σφαλμάτων ≤ 1,5 %
  • Χρήση βάσης δεδομένων ποτέ πάνω από 90 % μετά το πρώτο λεπτό
  • Μέση ηλικία των απαντήσεων στη cache ≤ 90 s κατά μέσο όρο
  • Συνολικό κόστος ≤ 9 $
  • Προτάσεις διαθέσιμες ≥ 80 % του χρόνου
  • Μέση κίνηση που αποβλήθηκε ≤ 5 %

Βάση — το μοντέλο πίσω από τους αριθμούς

Κάθε σχέση που χρησιμοποιεί ο προσομοιωτής, με την πηγή της. Οι σταθερές που σημειώνονται ως παραδοχές είναι ενδεικτικές βαθμονομήσεις.

Τα αιτήματα ακολουθούν ημερήσια καμπύλη συν διαταραχές· ο αριθμός ανά λεπτό είναι τυχαίος (Poisson, κανονική προσέγγιση) με λίγη εκρηκτικότητα.
λ(t) = base × (1 + 0.25·sin(2π(t + clock − 6 h)/24 h)) × surge(t), clock = time of day at the start (peak at 12:00); count/min ≈ N(60λ, √(60λ)) × (1 + N(0, 0.02))[6]Παραδοχή: αριθμοί workers, χρόνοι εξυπηρέτησης, χωρητικότητα βάσης δεδομένων, μέγεθος cache, ταχύτητα αναπλήρωσης, τιμές και το ποσοστό σφαλμάτων της κακής έκδοσης είναι ενδεικτικές τιμές για μια υπηρεσία ιστού μεσαίου μεγέθους.
Erlang C: η πιθανότητα ένα αίτημα να πρέπει να περιμένει έναν ελεύθερο worker σε σύστημα M/M/N.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Ουρά χρόνου αναμονής: η πιθανότητα αναμονής περισσότερο από t πέφτει εκθετικά· τα αιτήματα που ακόμη περιμένουν στο timeout των 2 s αποτυγχάνουν. Πέρα από τη χωρητικότητα, το πλεόνασμα αποτυγχάνει.
P(W > t) = C·e^(−(N/S − λ)·t); timeouts = P(W > 2 s); a ≥ N ⇒ failed share = 1 − N/a[3]
Καθυστέρηση p99 από τα ποσοστιαία σημεία του χρόνου εξυπηρέτησης και του χρόνου αναμονής.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Προσέγγιση: η πρόσθεση των ποσοστημορίων εξυπηρέτησης και αναμονής δεν είναι το ακριβές p99 του αθροίσματός τους (μπορεί να είναι λίγο υψηλό ή χαμηλό)· η ουρά αντιμετωπίζεται ως μόνιμη εντός κάθε λεπτού επειδή τα αιτήματα διαρκούν χιλιοστά του δευτερολέπτου.
Νόμος του Little: απασχολημένοι workers = ρυθμός άφιξης × χρόνος εξυπηρέτησης.
busy workers L = λ·S ⇒ utilization = λ·S / N[4]
Cache TTL: με τυχαία αιτήματα, κάθε miss ξεκινά μια περίοδο TTL κατά την οποία τα αιτήματα πετυχαίνουν.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Τα cache misses φορτώνουν τη βάση δεδομένων· η καθυστέρηση ουράς της επιβραδύνει κάθε αίτημα που την αγγίζει, κάτι που γεμίζει και τους workers της εφαρμογής.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Παραδοχή: αριθμοί workers, χρόνοι εξυπηρέτησης, χωρητικότητα βάσης δεδομένων, μέγεθος cache, ταχύτητα αναπλήρωσης, τιμές και το ποσοστό σφαλμάτων της κακής έκδοσης είναι ενδεικτικές τιμές για μια υπηρεσία ιστού μεσαίου μεγέθους.
SLO και προϋπολογισμός σφαλμάτων: ο ρυθμός κατανάλωσης λέει πόσες φορές γρηγορότερα από το επιτρεπτό ξοδεύεται ο προϋπολογισμός.
budget = 1 − SLO = 0.1 %; burn = error rate / 0.1 %; Δbudget per min = burn / 43,200; burn (1 h) = mean error rate over the last 60 min / 0.1 % (window pre-filled with the opening minute)[1][2]
Autoscaler παρακολούθησης στόχου με καθυστέρηση εκκίνησης και περίοδο ψύξης.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Παραδοχή: αριθμοί workers, χρόνοι εξυπηρέτησης, χωρητικότητα βάσης δεδομένων, μέγεθος cache, ταχύτητα αναπλήρωσης, τιμές και το ποσοστό σφαλμάτων της κακής έκδοσης είναι ενδεικτικές τιμές για μια υπηρεσία ιστού μεσαίου μεγέθους.
Άλλες σταθερές λειτουργίας που χρησιμοποιεί το μοντέλο.
16 workers/instance · app time 50 ms (+20 ms and +1 query with the feature on) · 2 queries/request · DB 4,000 queries/s · 20,000 hot objects · cache refill τ = 30 min (slower while the DB is saturated) · warm-up job +12 %/min for 6 min, +600 queries/s · timeout 2 s · 30 % low-priority traffic · bad build +5 % errors, ×1.25 CPU · rollback 5 min · $0.40 per instance-hour · scale-in by ≤ 20 % of the fleet after 10 quiet minutes · up to 40 instancesΠαραδοχή: αριθμοί workers, χρόνοι εξυπηρέτησης, χωρητικότητα βάσης δεδομένων, μέγεθος cache, ταχύτητα αναπλήρωσης, τιμές και το ποσοστό σφαλμάτων της κακής έκδοσης είναι ενδεικτικές τιμές για μια υπηρεσία ιστού μεσαίου μεγέθους.

Τυχαιότητα: γεννήτρια mulberry32 με seed· κατανομές που χρησιμοποιούνται — ομοιόμορφη, εκθετική (αντίστροφη CDF), κανονική (Box–Muller), Poisson (Knuth). Το seed εμφανίζεται και μπορεί να κοινοποιηθεί.

Πηγές

  1. Site Reliability Engineering — Ch. 3 Embracing Risk (error budgets), Ch. 4 Service Level Objectives — Beyer, Jones, Petoff, Murphy (eds.), O'Reilly, 2016
  2. The Site Reliability Workbook — Ch. 5 Alerting on SLOs (burn rate; 14.4× over 1 h = 2 % of a 30-day budget) — Beyer, Murphy, Rensin, Kawahara, Thorne (eds.), O'Reilly, 2018
  3. Teletraffic Engineering Handbook — Erlang C formula; waiting-time distribution for M/M/n, FCFS — ITU-D Study Group 2 Question 16/2 (V. B. Iversen), 2005
  4. J. D. C. Little — A Proof for the Queuing Formula: L = λW — Operations Research 9(3):383–387, 1961
  5. J. Jung, A. W. Berger, H. Balakrishnan — Modeling TTL-based Internet Caches — IEEE INFOCOM 2003, 2003
  6. M. Harchol-Balter — Performance Modeling and Design of Computer Systems: Queueing Theory in Action (M/M/k, server farms, capacity provisioning) — Cambridge University Press, 2013

Ποιοι το κάνουν επαγγελματικά

Εκπαιδευτικό μοντέλο — όχι για επιχειρησιακές αποφάσεις. Οι πραγματικές εγκαταστάσεις βαθμονομούν κάθε σταθερά με βάση τον δικό τους εξοπλισμό και δεδομένα.