🖥️ IT operacijos – paslaugų patikimumas Gyvas modelis
Budite dėl žiniatinklio paslaugos: apkrovos balansuotojas prieš egzempliorių parką, talpykla prieš duomenų bazę ir 99,9 % pasiekiamumo tikslas. Kiekvieną minutę modelis pagal vadovėlines formules apskaičiuoja eilės delsą, skirtojo laiko viršijimus, talpyklos pataikymus ir duomenų bazės apkrovą – ir ką kainuoja jūsų sprendimai.
Ko išmoksite
Kodėl delsa sprogsta prie pilno naudojimo (Erlang C) ir kodėl automatinis mastelio keitimas su įkrovos delsa visada pavėluoja.
Kaip SLO, klaidų biudžetai ir išeikvojimo greičio įspėjimai nusprendžia, kada atšaukti.
Kaip šalta talpykla virsta duomenų bazės gedimu ir kokie svertai nupirkia laiko: atmetimas, funkcionalumo mažinimas, kaitinimas.
Simuliatorius
Laikas 0 min.
▶Egzempliorius aptarnauja
⚙Egzempliorius kraunasi
!Egzempliorius blogoje versijoje
·Laisva vieta
•Gaunamos užklausos
Valdikliai
Parko apatinė riba. Ją padidinus egzemplioriai paleidžiami iš karto – bet jiems vis tiek reikia įkrovos delsos, kad pradėtų aptarnauti.
Apkrovos sekimas pagal naudojimą; naujas plėtimas nevyksta, kol egzemplioriai dar kraunasi. Išjungta = tiksliai minimumas.
Mažiau = daugiau atsargos ir didesnės išlaidos. Išmatuotas naudojimas negali viršyti 100 %, todėl prisotintas parkas auga tik žingsnis po žingsnio.
Ilgesnis TTL = daugiau pataikymų, bet atsakymai gali būti senesni (vidutinis amžius ≈ TTL/2).
6 minutes kraunami dažnai naudojami raktai (+12 % talpyklos per minutę) už 600 papildomų duomenų bazės užklausų/s kainą.
Mažo prioriteto 30 % (išankstinis krovimas, paketai, vorai) dalis, kurią apkrovos balansuotojas atmeta su „bandykite vėliau“.
Sunkioji funkcija prideda 20 ms CPU ir vieną duomenų bazės užklausą kiekvienai užklausai. Išjungta = sklandus funkcionalumo mažinimas.
Iš naujo paleidžia paskutinę gerą versiją naujame serverių parke (5 min., apmokestinama dvigubai), tada perjungia srautą. Paspaudus dar kartą, paruošimas pradedamas iš naujo; jei nėra veikiančios blogos versijos, tai tik kainuoja pinigus.
Rodikliai
Klaidų dažnis
0,00%
normali
p99 delsa
342ms
normali
Likęs klaidų biudžetas (30 dienų)
50,0%
normali
Parko naudojimas
52%
normali
Išeikvojimo greitis (1 h)
0,0 ×
Užklausos
1125 req/s
Aptarnaujantys egzemplioriai
10
Kraunami egzemplioriai
0
Talpyklos pataikymų dažnis
77 %
Duomenų bazės naudojimas
19 %
Atmestas srautas
0 %
Parko kaina
4,00 $/h
Kaina iki šiol
0,00 $
Talpyklos atsakymų vidutinis amžius
30 s
Srautas blogoje versijoje
0 %
Prieinamos rekomendacijos
100 %
Tendencija
Krizių scenarijai
1 lygis · Bloga versija
Nauja versija išleidžiama 09:10. Mėnuo ir taip buvo sunkus: liko tik 20 % klaidų biudžeto. Praėjus minutėms po diegimo suveikia išeikvojimo greičio signalas. Apsaugokite biudžetą.
Klaidų biudžeto likutis pabaigoje ≥ 18,5 %
Vidutinis klaidų dažnis po diegimo ≤ 0,65 %
Parko kaina ≤ 9,50 USD
2 lygis · Staigus lankytojų antplūdis
Nuoroda į paslaugą sparčiai plinta, ir šį rytą kažkada laukiamas srauto šuolis — niekas nežino, kada ir kokio dydžio. Nauji egzemplioriai šiandien paleidžiami per 8 minutes. Kai jis ateis, išlaikykite klaidas ir delsą mažas neišleisdami pinigų nenaudojamam pajėgumui.
Vidutinis klaidų dažnis ≤ 0,2 %
Vidutinė p99 delsa ≤ 400 ms
Vidutinis atmestas srautas ≤ 5 %
Bendra kaina ≤ 21 USD
Rekomendacijos prieinamos ≥ 85 % laiko
3 lygis · Šalta talpykla
Dienos piko metu priežiūros scenarijus išvalo visą talpyklą. Dabar kiekviena užklausa eina į duomenų bazę, kuri buvo suprojektuota įprastam 85 % pataikymų dažniui. Atkurkite paslaugą neperkraudami duomenų bazės.
Vidutinis klaidų dažnis ≤ 1,5 %
Duomenų bazės naudojimas niekada nevirš 90 % po pirmos minutės
Talpyklos atsakymų vidutinis amžius ≤ 90 s vidutiniškai
Bendra kaina ≤ 9 USD
Rekomendacijos prieinamos ≥ 80 % laiko
Vidutinis atmestas srautas ≤ 5 %
Pagrindas — modelis už skaičių
Kiekviena simuliatoriaus naudojama priklausomybė su savo šaltiniu. Konstantos, pažymėtos kaip prielaidos, yra iliustraciniai kalibravimai.
Užklausos seka paros kreivę plius sutrikimus; užklausų skaičius per minutę yra atsitiktinis (Puasono, normalioji aproksimacija) su nedideliu sprogstamumu.
λ(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]Prielaida: darbuotojų (worker) skaičius, aptarnavimo laikai, duomenų bazės talpa, talpyklos dydis, užpildymo greitis, kainos ir blogos versijos klaidų dažnis yra iliustracinės vidutinio žiniatinklio paslaugos vertės.
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
Laukimo laiko uodega: tikimybė laukti ilgiau nei t krenta eksponentiškai; užklausos, vis dar laukiančios 2 s skirtojo laiko pabaigoje, nepavyksta. Viršijus pajėgumą perteklius nepavyksta.
p99 delsa iš aptarnavimo ir laukimo laiko kvantilių.
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]Apytikslis skaičiavimas: aptarnavimo ir laukimo kvantilių sudėjimas nėra tikslus jų sumos p99 (gali būti kiek didesnis ar mažesnis); eilė kiekvieną minutę laikoma pastovia, nes užklausos trunka milisekundes.
Little dėsnis: užimti darbuotojai = atvykimo greitis × laikas aptarnavime.
TTL talpykla: esant atsitiktinėms užklausoms kiekvienas nepataikymas pradeda TTL laikotarpį, kurio metu užklausos pataiko.
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
Talpyklos nepataikymai apkrauna duomenų bazę; jos eilės delsa sulėtina kiekvieną užklausą, kuri į ją kreipiasi, o tai taip pat užpildo programos darbuotojus.
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]Prielaida: darbuotojų (worker) skaičius, aptarnavimo laikai, duomenų bazės talpa, talpyklos dydis, užpildymo greitis, kainos ir blogos versijos klaidų dažnis yra iliustracinės vidutinio žiniatinklio paslaugos vertės.
SLO ir klaidų biudžetas: išeikvojimo greitis (burn rate) parodo, kiek kartų greičiau nei leidžiama išleidžiamas biudžetas.
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]
Tikslo sekimo automatinis mastelio keitiklis su įkrovos delsa ir atvėsimo laikotarpiu.
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]Prielaida: darbuotojų (worker) skaičius, aptarnavimo laikai, duomenų bazės talpa, talpyklos dydis, užpildymo greitis, kainos ir blogos versijos klaidų dažnis yra iliustracinės vidutinio žiniatinklio paslaugos vertės.
Kitos modelyje naudojamos eksploatacinės konstantos.
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 instancesPrielaida: darbuotojų (worker) skaičius, aptarnavimo laikai, duomenų bazės talpa, talpyklos dydis, užpildymo greitis, kainos ir blogos versijos klaidų dažnis yra iliustracinės vidutinio žiniatinklio paslaugos vertės.
Atsitiktinumas: mulberry32 generatorius su pradiniu skaičiumi; naudojami skirstiniai — tolygusis, eksponentinis (atvirkštinė pasiskirstymo funkcija), normalusis (Box–Muller), Puasono (Knuth). Pradinis skaičius rodomas ir juo galima dalytis.
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