ปฏิบัติการไอที — วิศวกรรมความน่าเชื่อถือของไซต์ โมเดลสด

คุณเป็นผู้เฝ้าระบบ (on call) ของเว็บเซอร์วิส: ตัวกระจายโหลดหน้ากลุ่มอินสแตนซ์ แคชหน้าฐานข้อมูล และเป้าหมายความพร้อมใช้งาน 99.9 % ทุกนาทีแบบจำลองคำนวณความหน่วงจากคิว การหมดเวลา แคชฮิต และโหลดฐานข้อมูลจากสูตรในตำรา — และต้นทุนของการตัดสินใจของคุณ

สิ่งที่คุณจะได้เรียนรู้

เครื่องจำลอง

เวลา 0 นาที
คำขอ 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 % ลำดับต่ำ (prefetch, batch, crawler) ที่ถูกปฏิเสธที่ตัวกระจายโหลดด้วย “ลองใหม่ภายหลัง”

ฟีเจอร์หนักเพิ่ม CPU 20 ms และคำสั่งฐานข้อมูลหนึ่งครั้งต่อคำขอ ปิด = ลดระดับบริการอย่างนุ่มนวล

ปรับใช้บิลด์ที่ดีล่าสุดอีกครั้งบนกลุ่มเซิร์ฟเวอร์ใหม่ (5 นาที คิดค่าใช้จ่ายสองเท่า) แล้วจึงสลับทราฟฟิก การกดซ้ำจะเริ่มการเตรียมใหม่ หากไม่มีบิลด์ที่เสียใช้งานอยู่ก็มีแต่เสียเงิน

ตัวชี้วัด

อัตราข้อผิดพลาด
0.00%
ปกติ
ความหน่วง p99
342ms
ปกติ
งบข้อผิดพลาดที่เหลือ (30 วัน)
50.0%
ปกติ
การใช้งานกลุ่มเซิร์ฟเวอร์
52%
ปกติ
อัตราการเผา (1 ชม.)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 %

พื้นฐาน — โมเดลเบื้องหลังตัวเลข

ทุกความสัมพันธ์ที่เครื่องจำลองใช้ พร้อมแหล่งที่มา ค่าคงที่ที่ระบุว่าเป็นสมมติฐานคือการปรับเทียบตัวอย่าง

คำขอเป็นไปตามเส้นโค้งรายวันบวกการรบกวน จำนวนต่อนาทีสุ่ม (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]สมมติฐาน: จำนวนเวิร์กเกอร์ เวลาให้บริการ ความจุฐานข้อมูล ขนาดแคช ความเร็วเติม ราคา และอัตราข้อผิดพลาดของบิลด์เสียเป็นค่าตัวอย่างสำหรับเว็บเซอร์วิสขนาดกลาง
Erlang C: ความน่าจะเป็นที่คำขอต้องรอเวิร์กเกอร์ว่างในระบบ 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 ที่แน่นอนของผลรวม (อาจสูงหรือต่ำไปเล็กน้อย) คิวถูกถือว่าคงที่ในแต่ละนาที เพราะคำขอใช้เวลาระดับมิลลิวินาที
กฎของลิตเติล: เวิร์กเกอร์ที่ไม่ว่าง = อัตราขาเข้า × เวลาในการให้บริการ
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]
แคชพลาดโหลดฐานข้อมูล ความหน่วงจากคิวของมันทำให้ทุกคำขอที่แตะมันช้าลง ซึ่งทำให้เวิร์กเกอร์ของแอปเต็มด้วย
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]สมมติฐาน: จำนวนเวิร์กเกอร์ เวลาให้บริการ ความจุฐานข้อมูล ขนาดแคช ความเร็วเติม ราคา และอัตราข้อผิดพลาดของบิลด์เสียเป็นค่าตัวอย่างสำหรับเว็บเซอร์วิสขนาดกลาง
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]สมมติฐาน: จำนวนเวิร์กเกอร์ เวลาให้บริการ ความจุฐานข้อมูล ขนาดแคช ความเร็วเติม ราคา และอัตราข้อผิดพลาดของบิลด์เสียเป็นค่าตัวอย่างสำหรับเว็บเซอร์วิสขนาดกลาง
ค่าคงที่การดำเนินงานอื่น ๆ ที่แบบจำลองใช้
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สมมติฐาน: จำนวนเวิร์กเกอร์ เวลาให้บริการ ความจุฐานข้อมูล ขนาดแคช ความเร็วเติม ราคา และอัตราข้อผิดพลาดของบิลด์เสียเป็นค่าตัวอย่างสำหรับเว็บเซอร์วิสขนาดกลาง

ความสุ่ม: ตัวสร้าง 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

ใครทำงานนี้เป็นอาชีพ

โมเดลเพื่อการศึกษา — ไม่ใช่สำหรับการตัดสินใจเชิงปฏิบัติการ ไซต์จริงปรับเทียบค่าคงที่ทุกตัวให้ตรงกับอุปกรณ์และข้อมูลของตนเอง