🖥️ Vận hành CNTT — độ tin cậy hệ thống Mô hình trực tiếp
Bạn trực on-call cho một dịch vụ web: một bộ cân bằng tải trước một cụm máy, một bộ nhớ đệm trước một cơ sở dữ liệu, và mục tiêu sẵn sàng 99,9 %. Mỗi phút mô hình tính độ trễ hàng đợi, timeout, lần trúng bộ nhớ đệm và tải cơ sở dữ liệu từ các công thức giáo khoa — và các quyết định của bạn tốn bao nhiêu.
Bạn sẽ học được gì
Vì sao độ trễ bùng nổ gần mức sử dụng đầy (Erlang C), và vì sao tự động mở rộng có độ trễ khởi động luôn đến muộn.
Cách SLO, ngân sách lỗi và cảnh báo tốc độ đốt quyết định khi nào nên hoàn tác.
Cách bộ nhớ đệm lạnh thành sự cố cơ sở dữ liệu, và công cụ nào mua thêm thời gian: loại bớt, giảm tính năng, làm nóng.
Trình mô phỏng
Thời gian 0 phút
▶Máy đang phục vụ
⚙Máy đang khởi động
!Máy chạy bản dựng xấu
·Ô trống
•Yêu cầu đến
Điều khiển
Mức sàn của cụm máy. Tăng lên sẽ khởi chạy máy ngay — chúng vẫn cần thời gian khởi động trước khi phục vụ.
Bám theo mức sử dụng mục tiêu; không mở rộng thêm khi các máy còn đang khởi động. Tắt = đúng mức tối thiểu.
Thấp hơn = nhiều dư địa hơn và tốn kém hơn. Mức sử dụng đo được không vượt quá 100 %, nên cụm máy bão hòa chỉ lớn lên từng bước.
TTL dài hơn = nhiều lần trúng hơn, nhưng câu trả lời có thể cũ hơn (tuổi trung bình ≈ TTL/2).
Nạp các khóa nóng trong 6 phút (+12 % bộ nhớ đệm mỗi phút) với giá 600 truy vấn cơ sở dữ liệu/s thêm.
Tỷ lệ trong 30 % ưu tiên thấp (tải trước, tác vụ lô, trình thu thập) bị bộ cân bằng tải từ chối với "thử lại sau".
Tính năng nặng thêm 20 ms CPU và một truy vấn cơ sở dữ liệu cho mỗi yêu cầu. Tắt = suy giảm có kiểm soát.
Triển khai lại bản build tốt gần nhất trên một cụm máy mới (5 phút, tính phí hai lần), rồi chuyển lưu lượng. Bấm lại sẽ khởi động lại khâu chuẩn bị; nếu không có bản build lỗi đang chạy thì chỉ tốn tiền.
Chỉ số
Tỷ lệ lỗi
0,00%
bình thường
Độ trễ p99
342ms
bình thường
Ngân sách lỗi còn lại (30 ngày)
50,0%
bình thường
Mức sử dụng cụm máy
52%
bình thường
Tốc độ đốt (1 h)
0,0 ×
Yêu cầu
1125 req/s
Máy đang phục vụ
10
Máy đang khởi động
0
Tỷ lệ trúng bộ nhớ đệm
77 %
Mức sử dụng cơ sở dữ liệu
19 %
Lưu lượng bị loại bớt
0 %
Chi phí cụm máy
4,00 $/h
Chi phí đến nay
0,00 $
Tuổi trung bình của câu trả lời trong bộ nhớ đệm
30 s
Lưu lượng trên bản dựng xấu
0 %
Gợi ý có sẵn
100 %
Xu hướng
Kịch bản khủng hoảng
Cấp 1 · Bản phát hành lỗi
Một bản dựng mới được phát hành lúc 09:10. Tháng này đã khó khăn sẵn: chỉ còn 20 % ngân sách lỗi. Vài phút sau khi triển khai, cảnh báo tốc độ đốt kêu. Hãy bảo vệ ngân sách.
Ngân sách lỗi còn lại khi kết thúc ≥ 18,5 %
Tỷ lệ lỗi trung bình ≤ 0,65 % sau khi triển khai
Chi phí cụm máy ≤ $9,50
Cấp 2 · Đám đông đột ngột
Một liên kết đến dịch vụ đang lan nhanh và dự kiến có một đợt tăng vọt lưu lượng vào lúc nào đó sáng nay — không ai biết khi nào hay lớn đến đâu. Hiện nay các instance mới cần 8 phút để khởi động. Khi nó đến, hãy giữ lỗi và độ trễ ở mức thấp mà không đốt tiền vào công suất nhàn rỗi.
Tỷ lệ lỗi trung bình ≤ 0,2 %
Độ trễ p99 trung bình ≤ 400 ms
Lưu lượng bị loại bớt trung bình ≤ 5 %
Tổng chi phí ≤ $21
Gợi ý có sẵn ≥ 85 % thời gian
Cấp 3 · Bộ nhớ đệm lạnh
Vào đỉnh buổi trưa, một script bảo trì xóa toàn bộ bộ nhớ đệm. Mọi yêu cầu giờ đổ vào cơ sở dữ liệu, vốn được định cỡ cho tỷ lệ trúng 85 % thông thường. Đưa dịch vụ trở lại mà không làm quá tải cơ sở dữ liệu.
Tỷ lệ lỗi trung bình ≤ 1,5 %
Mức sử dụng cơ sở dữ liệu không bao giờ trên 90 % sau phút đầu tiên
Tuổi trung bình của câu trả lời trong bộ nhớ đệm ≤ 90 s tính trung bình
Tổng chi phí ≤ $9
Gợi ý có sẵn ≥ 80 % thời gian
Lưu lượng bị loại bớt trung bình ≤ 5 %
Cơ sở — mô hình đằng sau các con số
Mọi quan hệ mà trình mô phỏng sử dụng, kèm nguồn. Các hằng số đánh dấu là giả định là các hiệu chỉnh minh họa.
Yêu cầu theo đường cong hằng ngày cộng các nhiễu loạn; số lượng mỗi phút là ngẫu nhiên (Poisson, xấp xỉ chuẩn) với chút tính bùng phát.
λ(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]Giả định: số worker, thời gian phục vụ, dung lượng cơ sở dữ liệu, kích thước bộ nhớ đệm, tốc độ nạp lại, giá và tỷ lệ lỗi của bản dựng xấu là giá trị minh họa cho một dịch vụ web cỡ vừa.
Erlang C: xác suất một yêu cầu phải chờ worker rảnh trong hệ M/M/N.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Đuôi thời gian chờ: khả năng chờ lâu hơn t giảm theo hàm mũ; yêu cầu còn chờ ở mốc timeout 2 s sẽ thất bại. Vượt quá công suất, phần dư thất bại.
Độ trễ p99 từ các phân vị của thời gian phục vụ và thời gian chờ.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Xấp xỉ: cộng các phân vị của thời gian phục vụ và thời gian chờ không phải là p99 chính xác của tổng chúng (có thể hơi cao hoặc thấp); hàng đợi được coi là ổn định trong mỗi phút vì các yêu cầu chỉ mất vài mili giây.
Định luật Little: số worker bận = tốc độ đến × thời gian phục vụ.
Bộ nhớ đệm TTL: với yêu cầu ngẫu nhiên, mỗi lần trượt bắt đầu một khoảng TTL mà trong đó các yêu cầu trúng.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Các lần trượt bộ nhớ đệm đè lên cơ sở dữ liệu; độ trễ hàng đợi của nó làm chậm mọi yêu cầu chạm vào nó, đồng thời làm đầy các worker ứng dụng.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Giả định: số worker, thời gian phục vụ, dung lượng cơ sở dữ liệu, kích thước bộ nhớ đệm, tốc độ nạp lại, giá và tỷ lệ lỗi của bản dựng xấu là giá trị minh họa cho một dịch vụ web cỡ vừa.
SLO và ngân sách lỗi: tốc độ đốt cho biết ngân sách đang bị tiêu nhanh hơn cho phép bao nhiêu lần.
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]
Bộ tự động mở rộng bám mục tiêu với độ trễ khởi động và thời gian chờ.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Giả định: số worker, thời gian phục vụ, dung lượng cơ sở dữ liệu, kích thước bộ nhớ đệm, tốc độ nạp lại, giá và tỷ lệ lỗi của bản dựng xấu là giá trị minh họa cho một dịch vụ web cỡ vừa.
Các hằng số vận hành khác mô hình sử dụng.
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 instancesGiả định: số worker, thời gian phục vụ, dung lượng cơ sở dữ liệu, kích thước bộ nhớ đệm, tốc độ nạp lại, giá và tỷ lệ lỗi của bản dựng xấu là giá trị minh họa cho một dịch vụ web cỡ vừa.
Tính ngẫu nhiên: bộ sinh mulberry32 có seed; các phân phối được dùng — đều, mũ (CDF nghịch đảo), chuẩn (Box–Muller), Poisson (Knuth). Seed được hiển thị và có thể chia sẻ.
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