🖥️ IT darbība — pakalpojumu uzticamība Dzīvais modelis
Jūs esat dežurants tīmekļa pakalpojumam: slodzes balansētājs pirms instanču flotes, kešatmiņa pirms datubāzes un 99,9 % pieejamības mērķis. Katru minūti modelis no mācību grāmatu formulām aprēķina rindas aizturi, noildzes, kešatmiņas trāpījumus un datubāzes slodzi, kā arī to, ko maksā jūsu lēmumi.
Ko jūs uzzināsiet
Kāpēc latentums eksplodē pie pilnas noslodzes (Erlanga C) un kāpēc automātiskā mērogošana ar startēšanas aizturi vienmēr atnāk par vēlu.
Kā SLO, kļūdu budžeti un izdegšanas ātruma brīdinājumi izlemj, kad atritināt laidienu.
Kā auksta kešatmiņa pārvēršas datubāzes atteicē un kādas sviras nopērk laiku: atslogošana, funkcionalitātes samazināšana, iesildīšana.
Simulators
Laiks 0 min
▶Instance apkalpo
⚙Instance startē
!Instance sliktajā būvējumā
·Brīva vieta
•Ienākošie pieprasījumi
Vadīklas
Flotes apakšējā robeža. Tās palielināšana palaiž instances uzreiz, bet pirms apkalpošanas tām joprojām vajadzīga startēšanas aizture.
Mērķa sekošana noslodzei; jauna mērogošana uz augšu nenotiek, kamēr instances vēl startē. Izslēgts = tieši minimums.
Zemāka = lielāka rezerve un augstākas izmaksas. Izmērītā noslodze nevar pārsniegt 100 %, tāpēc piesātināta flote aug tikai pa soļiem.
Garāks TTL = vairāk trāpījumu, bet atbildes var būt vecākas (vidējais vecums ≈ TTL/2).
Ielādē karstās atslēgas 6 minūtes (+12 % no kešatmiņas minūtē) par cenu 600 papildu datubāzes vaicājumi/s.
Zemas prioritātes 30 % daļa (priekšielāde, pakešu apstrāde, rāpuļprogrammas), ko slodzes balansētājs noraida ar „mēģiniet vēlāk”.
Smagā funkcija pievieno 20 ms CPU un vienu datubāzes vaicājumu katram pieprasījumam. Izslēgts = graciozs funkcionalitātes samazinājums.
Pārlieto pēdējo labo būvējumu uz jauna servera parka (5 min, tiek rēķināts divreiz), pēc tam pārslēdz trafiku. Atkārtota nospiešana sāk sagatavošanu no jauna; ja neviens sliktais būvējums nedarbojas, tas maksā tikai naudu.
Rādītāji
Kļūdu īpatsvars
0,00%
normāls
p99 latentums
342ms
normāls
Atlikušais kļūdu budžets (30 dienas)
50,0%
normāls
Flotes noslodze
52%
normāls
Izdegšanas ātrums (1 h)
0,0 ×
Pieprasījumi
1125 req/s
Apkalpojošās instances
10
Instances startē
0
Kešatmiņas trāpījumu īpatsvars
77 %
Datubāzes noslodze
19 %
Atslogotais trafiks
0 %
Flotes izmaksas
4,00 $/h
Līdz šim izmaksas
0,00 $
Kešoto atbilžu vidējais vecums
30 s
Trafiks sliktajā būvējumā
0 %
Pieejami ieteikumi
100 %
Tendence
Krīzes scenāriji
Līmenis 1 · Slikts laidiens
Jauns būvējums tiek izlaists plkst. 09:10. Mēnesis jau bijis grūts: atlicis tikai 20 % kļūdu budžeta. Dažas minūtes pēc izlaides nostrādā izdegšanas ātruma brīdinājums. Pasargājiet budžetu.
Atlikušais kļūdu budžets beigās ≥ 18,5 %
Vidējais kļūdu īpatsvars pēc izlaides ≤ 0,65 %
Flotes izmaksas ≤ 9,50 $
Līmenis 2 · Pēkšņs apmeklētāju pieplūdums
Saite uz pakalpojumu strauji izplatās, un šorīt kādā brīdī gaidāms datplūsmas lēciens — neviens nezina, kad un cik liels. Jaunām instancēm šodien vajag 8 minūtes, lai startētu. Kad tas notiks, noturiet kļūdas un aizkavi zemas, netērējot naudu tukšai jaudai.
Vidējais kļūdu īpatsvars ≤ 0,2 %
Vidējais p99 latentums ≤ 400 ms
Vidējais atslogotais trafiks ≤ 5 %
Kopējās izmaksas ≤ 21 $
Ieteikumi pieejami ≥ 85 % laika
Līmenis 3 · Auksta kešatmiņa
Dienas vidus maksimumā apkopes skripts iztīra visu kešatmiņu. Tagad katrs pieprasījums iet uz datubāzi, kas bija dimensionēta ierastajam 85 % trāpījumu īpatsvaram. Atjaunojiet pakalpojumu, nepārslogojot datubāzi.
Vidējais kļūdu īpatsvars ≤ 1,5 %
Datubāzes noslodze pēc pirmās minūtes nekad virs 90 %
Kešoto atbilžu vidējais vecums vidēji ≤ 90 s
Kopējās izmaksas ≤ 9 $
Ieteikumi pieejami ≥ 80 % laika
Vidējais atslogotais trafiks ≤ 5 %
Pamats — modelis aiz skaitļiem
Katra simulatora izmantotā sakarība ar tās avotu. Konstantes, kas atzīmētas kā pieņēmumi, ir ilustratīvas kalibrācijas.
Pieprasījumi seko dienas līknei plus traucējumiem; pieprasījumu skaits minūtē ir nejaušs (Puasona, normālā tuvinājumā) ar nelielu pieplūdumu.
λ(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]Pieņēmums: darbinieku skaits, apkalpošanas laiki, datubāzes jauda, kešatmiņas izmērs, atjaunošanās ātrums, cenas un sliktā būvējuma kļūdu īpatsvars ir ilustratīvas vērtības vidēja izmēra tīmekļa pakalpojumam.
Erlanga C: varbūtība, ka pieprasījumam jāgaida brīvs darbinieks M/M/N sistēmā.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Gaidīšanas laika aste: varbūtība gaidīt ilgāk par t krītas eksponenciāli; pieprasījumi, kas pie 2 s noildzes vēl gaida, neizdodas. Pārsniedzot jaudu, pārpalikums neizdodas.
p99 latentums no apkalpošanas laika un gaidīšanas laika kvantiļiem.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Tuvinājums: apkalpošanas un gaidīšanas kvantiļu saskaitīšana nav precīza to summas p99 (tā var būt nedaudz augstāka vai zemāka); rinda katras minūtes ietvaros tiek uzskatīta par stabilu, jo pieprasījumi aizņem milisekundes.
Litla likums: aizņemtie darbinieki = pienākšanas ātrums × apkalpošanas laiks.
TTL kešatmiņa: ar nejaušiem pieprasījumiem katrs netrāpījums sāk TTL periodu, kurā pieprasījumi trāpa.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Kešatmiņas netrāpījumi slogo datubāzi; tās rindas aizture palēnina katru pieprasījumu, kas to skar, un tas arī piepilda lietotnes darbiniekus.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Pieņēmums: darbinieku skaits, apkalpošanas laiki, datubāzes jauda, kešatmiņas izmērs, atjaunošanās ātrums, cenas un sliktā būvējuma kļūdu īpatsvars ir ilustratīvas vērtības vidēja izmēra tīmekļa pakalpojumam.
SLO un kļūdu budžets: izdegšanas ātrums parāda, cik reižu ātrāk nekā atļauts tiek tērēts budžets.
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]
Mērķa sekošanas automātiskais mērogotājs ar startēšanas aizturi un atdzišanas periodu.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Pieņēmums: darbinieku skaits, apkalpošanas laiki, datubāzes jauda, kešatmiņas izmērs, atjaunošanās ātrums, cenas un sliktā būvējuma kļūdu īpatsvars ir ilustratīvas vērtības vidēja izmēra tīmekļa pakalpojumam.
Pārējās modelī izmantotās ekspluatācijas konstantes.
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 instancesPieņēmums: darbinieku skaits, apkalpošanas laiki, datubāzes jauda, kešatmiņas izmērs, atjaunošanās ātrums, cenas un sliktā būvējuma kļūdu īpatsvars ir ilustratīvas vērtības vidēja izmēra tīmekļa pakalpojumam.
Nejaušība: sēklas mulberry32 ģenerators; izmantotie sadalījumi — vienmērīgais, eksponenciālais (apgrieztā CDF), normālais (Box–Muller), Puasona (Knuth). Sēkla tiek rādīta un to var kopīgot.
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