תפעול IT — אמינות אתרים מודל חי

אתם בכוננות לשירות אינטרנט: מאזן עומסים לפני צי מופעים, מטמון לפני מסד נתונים, ויעד זמינות של 99.9 %. בכל דקה המודל מחשב השהיית תור, פסקי זמן, פגיעות מטמון ועומס מסד נתונים מנוסחאות ספר לימוד — ומה ההחלטות שלכם עולות.

מה תלמדו

סימולטור

זמן 0 min
בקשות 1125 · שיעור שגיאות 0.00% · השהיית p99 342 ms · מופעים משרתים 10 (+0) · שיעור פגיעות במטמון 77% · ניצולת מסד הנתונים 19% · תקציב שגיאות שנותר (30 יום) 50.0%⇉1125 בקשות/שנ'▶▶▶▶▶▶▶▶▶▶······························▶ 10 · ⚙ 0 · 52% · p99 342 msניצולת הצי 52%שיעור פגיעות במטמון 77%ניצולת מסד הנתונים 19%⚠ 0.00% · 🔥 0.0×50%$ 4.00/h · Σ $0.00
  • מופע משרת
  • מופע בעלייה
  • מופע על הגרסה הפגומה
  • משבצת פנויה
  • בקשות נכנסות

בקרות

רצפה לצי. העלאתה משיקה מופעים מיד — הם עדיין צריכים את השהיית האתחול לפני שמשרתים.

מעקב יעד על ניצולת; אין הרחבה חדשה כל עוד מופעים עדיין עולים. כבוי = בדיוק המינימום.

נמוך = יותר מרווח ויותר עלות. ניצולת נמדדת לא יכולה לעלות על 100 %, ולכן צי רווי גדל רק צעד אחר צעד.

TTL ארוך יותר = יותר פגיעות, אבל התשובות יכולות להיות ישנות יותר (גיל ממוצע ≈ TTL/2).

טוענת מפתחות חמים במשך 6 דקות (+12 % מהמטמון לדקה) במחיר 600 שאילתות מסד נתונים נוספות לשנייה.

החלק מתוך ה-30 % בעדיפות נמוכה (טעינה מראש, אצווה, זחלנים) שנדחה במאזן העומסים עם "נסו שוב מאוחר יותר".

התכונה הכבדה מוסיפה 20 ms של CPU ושאילתת מסד נתונים אחת לבקשה. כבוי = הידרדרות חיננית.

פורס מחדש את הבנייה התקינה האחרונה על צי חדש (5 דקות, מחויב פעמיים), ואז מעביר את התעבורה. לחיצה חוזרת מתחילה את ההכנה מחדש; כשאין בנייה פגומה חיה זה רק עולה כסף.

מחוונים

שיעור שגיאות
0.00%
תקין
השהיית p99
342ms
תקין
תקציב שגיאות שנותר (30 יום)
50.0%
תקין
ניצולת הצי
52%
תקין
קצב שריפה (שעה)0.0 ×
בקשות1125 req/s
מופעים משרתים10
מופעים בעלייה0
שיעור פגיעות במטמון77 %
ניצולת מסד הנתונים19 %
תעבורה שהופלה0 %
עלות הצי4.00 $/h
עלות עד כה0.00 $
גיל ממוצע של תשובות במטמון30 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 · מטמון קר

בשיא הצהריים סקריפט תחזוקה מרוקן את כל המטמון. כל בקשה עכשיו הולכת למסד הנתונים, שגודל לשיעור פגיעות רגיל של 85 %. החזירו את השירות בלי להעמיס יתר על מסד הנתונים.

  • שיעור שגיאות ממוצע ≤ 1.5 %
  • ניצולת מסד הנתונים אף פעם לא מעל 90 % אחרי הדקה הראשונה
  • גיל ממוצע של תשובות במטמון ≤ 90 s בממוצע
  • עלות כוללת ≤ $9
  • המלצות זמינות ≥ 80 % מהזמן
  • תעבורה שהופלה בממוצע ≤ 5 %

בסיס — המודל שמאחורי המספרים

כל יחס שהסימולטור משתמש בו, עם המקור שלו. קבועים המסומנים כהנחות הם כיולים להמחשה.

בקשות עוקבות אחרי עקומה יומית בתוספת הפרעות; הספירה לדקה אקראית (פואסון, קירוב נורמלי) עם מעט התפרצויות.
λ(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, זמני שירות, קיבולת מסד הנתונים, גודל המטמון, מהירות המילוי, מחירים ושיעור השגיאות של הגרסה הפגומה הם ערכים להמחשה לשירות אינטרנט בינוני.
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 יורד אקספוננציאלית; בקשות שעדיין ממתינות בפסק הזמן של 2 שניות נכשלות. מעבר לקיבולת, העודף נכשל.
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 המדויק של סכומם (הוא יכול להיות מעט גבוה או נמוך); התור נחשב יציב בתוך כל דקה כי בקשות נמשכות אלפיות שנייה.
חוק ליטל: workers עסוקים = קצב הגעה × זמן בשירות.
busy workers L = λ·S ⇒ utilization = λ·S / N[4]
מטמון TTL: עם בקשות אקראיות, כל החטאה פותחת תקופת TTL שבמהלכה בקשות פוגעות.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
החטאות מטמון מעמיסות על מסד הנתונים; השהיית התור שלו מאטה כל בקשה שנוגעת בו, וזה גם ממלא את ה-workers של היישום.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]הנחה: מספרי workers, זמני שירות, קיבולת מסד הנתונים, גודל המטמון, מהירות המילוי, מחירים ושיעור השגיאות של הגרסה הפגומה הם ערכים להמחשה לשירות אינטרנט בינוני.
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]
מכוון קנה מידה אוטומטי עם מעקב יעד, השהיית אתחול ותקופת צינון.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]הנחה: מספרי workers, זמני שירות, קיבולת מסד הנתונים, גודל המטמון, מהירות המילוי, מחירים ושיעור השגיאות של הגרסה הפגומה הם ערכים להמחשה לשירות אינטרנט בינוני.
קבועי הפעלה נוספים שבהם המודל משתמש.
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, זמני שירות, קיבולת מסד הנתונים, גודל המטמון, מהירות המילוי, מחירים ושיעור השגיאות של הגרסה הפגומה הם ערכים להמחשה לשירות אינטרנט בינוני.

אקראיות: מחולל mulberry32 עם זרע; ההתפלגויות שבשימוש — אחידה, מעריכית (CDF הפוך), נורמלית (Box–Muller), פואסון (Knuth). הזרע מוצג וניתן לשיתוף.

מקורות

  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

מי עושה את זה למחייתו

מודל חינוכי — לא לקבלת החלטות תפעוליות. אתרים אמיתיים מכיילים כל קבוע לציוד ולנתונים שלהם.