KÄ iekÅ”Ä
KÄdu dienu es pamodos no neapmierinÄta e-pasta saistÄ«bÄ ar ilgu kavÄÅ”anos ar Alvinu, kuru plÄnojÄm palaist tuvÄkajÄ nÄkotnÄ. KonkrÄti, klientam bija 99. procentiles latentums aptuveni 50 ms, kas ir krietni virs mÅ«su latentuma budžeta. Tas bija pÄrsteidzoÅ”i, jo es plaÅ”i pÄrbaudÄ«ju pakalpojumu, jo Ä«paÅ”i attiecÄ«bÄ uz latentumu, kas ir izplatÄ«ta sÅ«dzÄ«ba.
Pirms Alvina testÄÅ”anas es veicu daudz eksperimentu ar 40 10 vaicÄjumu sekundÄ (QPS), un visi uzrÄdÄ«ja latentumu, kas mazÄks par 40 ms. Es biju gatavs paziÅot, ka nepiekrÄ«tu viÅu rezultÄtiem. Bet vÄlreiz aplÅ«kojot vÄstuli, es pamanÄ«ju kaut ko jaunu: es nebiju precÄ«zi pÄrbaudÄ«jis viÅu minÄtos apstÄkļus, viÅu QPS bija daudz zemÄks nekÄ manÄjais. Es testÄju ar 1k QPS, bet viÅi tikai ar XNUMXk. Es veicu vÄl vienu eksperimentu, Å”oreiz ar zemÄku QPS, lai viÅus nomierinÄtu.
TÄ kÄ es rakstu par Å”o emuÄru, jÅ«s droÅ”i vien jau esat sapratuÅ”i, ka viÅu skaitļi bija pareizi. Es atkal un atkal pÄrbaudÄ«ju savu virtuÄlo klientu ar vienu un to paÅ”u rezultÄtu: mazs pieprasÄ«jumu skaits ne tikai palielina latentumu, bet arÄ« palielina pieprasÄ«jumu skaitu, kuru latentums pÄrsniedz 10 ms. Citiem vÄrdiem sakot, ja pie 40k QPS aptuveni 50 pieprasÄ«jumi sekundÄ pÄrsniedza 50 ms, tad pie 1k QPS bija 100 pieprasÄ«jumi virs 50 ms katrÄ sekundÄ. Paradokss!
MeklÄÅ”anas saÅ”aurinÄÅ”anÄs
Saskaroties ar latentuma problÄmu izplatÄ«tÄ sistÄmÄ ar daudziem komponentiem, pirmais solis ir izveidot Ä«su aizdomÄs turamo sarakstu. IedziļinÄsimies Alvina arhitektÅ«rÄ:
Labs sÄkumpunkts ir pabeigto I/O pÄreju saraksts (tÄ«kla zvani/diska meklÄÅ”ana utt.). MÄÄ£inÄsim noskaidrot, kur ir kavÄÅ”anÄs. Papildus acÄ«mredzamajai ievadei/izvadei ar klientu Alvins veic papildu soli: viÅÅ” piekļūst datu krÄtuvei. TomÄr Ŕī krÄtuve darbojas tajÄ paÅ”Ä klasterÄ« kÄ Alvin, tÄpÄc latentumam tajÄ jÄbÅ«t mazÄkam nekÄ klientam. TÄtad aizdomÄs turamo saraksts:
- TÄ«kla zvans no klienta Alvinam.
- TÄ«kla zvans no Alvin uz datu krÄtuvi.
- MeklÄt diskÄ datu krÄtuvÄ.
- TÄ«kla zvans no datu noliktavas uz Alvinu.
- TÄ«kla zvans no Alvin klientam.
MÄÄ£inÄsim izsvÄ«trot dažus punktus.
Datu glabÄÅ”anai ar to nav nekÄda sakara
PirmÄ lieta, ko es izdarÄ«ju, bija Alvin pÄrveidot par ping-ping serveri, kas neapstrÄdÄ pieprasÄ«jumus. Kad tas saÅem pieprasÄ«jumu, tas atgriež tukÅ”u atbildi. Ja latentums samazinÄs, Alvin vai datu noliktavas ievieÅ”anas kļūda nav nekas nedzirdÄts. PirmajÄ eksperimentÄ mÄs iegÅ«stam Å”Ädu grafiku:
KÄ redzat, ping-ping serveri nav uzlabojumu. Tas nozÄ«mÄ, ka datu noliktava nepalielina latentumu, un aizdomÄs turamo saraksts tiek samazinÄts uz pusi:
- TÄ«kla zvans no klienta Alvinam.
- TÄ«kla zvans no Alvin klientam.
Lieliski! Saraksts strauji sarÅ«k. Man likÄs, ka esmu gandrÄ«z sapratis iemeslu.
grRPC
Tagad ir pienÄcis laiks iepazÄ«stinÄt jÅ«s ar jaunu spÄlÄtÄju: gRPC
labi optimizÄta un plaÅ”i izmantota, Ŕī bija mana pirmÄ reize, kad to izmantoju Å”Äda izmÄra sistÄmÄ, un es gaidÄ«ju, ka mana ievieÅ”ana bÅ«s neoptimÄla - lai neteiktu vairÄk.
pieejamība gRPC
kaudzÄ radÄ«ja jaunu jautÄjumu: varbÅ«t tÄ ir mana Ä«stenoÅ”ana vai es gRPC
rada latentuma problÄmu? Jauna aizdomÄs turamÄ pievienoÅ”ana sarakstam:
- Klients zvana uz bibliotÄku
gRPC
- BibliotÄka
gRPC
veic tÄ«kla zvanu uz klienta bibliotÄkugRPC
serverÄ« - BibliotÄka
gRPC
sazinÄs ar Alvinu (ping-pong servera gadÄ«jumÄ nedarbojas)
Lai sniegtu jums priekÅ”statu par to, kÄ izskatÄs kods, mana klienta/Alvina ievieÅ”ana daudz neatŔķiras no klienta-servera ievieÅ”anas.
PiezÄ«me: iepriekÅ” minÄtais saraksts ir nedaudz vienkÄrÅ”ots, jo
gRPC
dod iespÄju izmantot savu (veidnes?) vÄ«tÅoÅ”anas modeli, kurÄ savijas izpildes kaudzegRPC
un lietotÄja ievieÅ”ana. VienkÄrŔības labad mÄs paliksim pie Ŕī modeļa.
ProfilÄÅ”ana visu izlabos
IzsvÄ«trojis datu krÄtuves, es domÄju, ka esmu gandrÄ«z pabeidzis: āTagad tas ir vienkÄrÅ”i! Pielietosim profilu un noskaidrosim, kur notiek kavÄÅ”anÄs. es
Es izvÄlÄjos Äetrus profilus: ar augstu QPS (zemu latentumu) un ar galda tenisa serveri ar zemu QPS (augstu latentumu) gan klienta, gan servera pusÄ. Un katram gadÄ«jumam paÅÄmu arÄ« procesora profila paraugu. SalÄ«dzinot profilus, es parasti meklÄju anomÄlu zvanu steku. PiemÄram, sliktajÄ pusÄ ar lielu latentumu ir daudz vairÄk konteksta slÄdžu (10 reizes vai vairÄk). Bet manÄ gadÄ«jumÄ konteksta slÄdžu skaits bija gandrÄ«z vienÄds. Man par Å”ausmÄm tur nebija nekÄ nozÄ«mÄ«ga.
Papildu atkļūdoŔana
Es biju izmisusi. Es nezinÄju, kÄdus citus rÄ«kus es varÄtu izmantot, un mans nÄkamais plÄns bÅ«tÄ«bÄ bija atkÄrtot eksperimentus ar dažÄdÄm variÄcijÄm, nevis skaidri diagnosticÄt problÄmu.
Ko darīt, ja
Jau no paÅ”a sÄkuma mani uztrauca konkrÄtais 50 ms latentums. Å is ir ļoti liels laiks. Es nolÄmu, ka es izgriezÄ«Å”u gabalus no koda, lÄ«dz varÄÅ”u precÄ«zi noskaidrot, kura daļa izraisÄ«ja Å”o kļūdu. Tad sekoja eksperiments, kas darbojÄs.
KÄ jau ierasts, vÄlÄk Ŕķiet, ka viss bija paÅ”saprotami. Es ievietoju klientu tajÄ paÅ”Ä maŔīnÄ, kur Alvins - un nosÅ«tÄ«ju pieprasÄ«jumu localhost
. Un latentuma pieaugums ir pagÄjis!
Kaut kas nebija kÄrtÄ«bÄ ar tÄ«klu.
Apgūst tīkla inženiera prasmes
JÄatzÄ«st: manas zinÄÅ”anas par tÄ«kla tehnoloÄ£ijÄm ir Å”ausmÄ«gas, Ä«paÅ”i Åemot vÄrÄ to, ka ar tÄm strÄdÄju ikdienÄ. TaÄu tÄ«kls bija galvenais aizdomÄs turamais, un man bija jÄiemÄcÄs to atkļūdot.
Par laimi, internets mÄ«l tos, kas vÄlas mÄcÄ«ties. Ping un tracert kombinÄcija Ŕķita pietiekami labs sÄkums tÄ«kla transporta problÄmu atkļūdoÅ”anai.
PirmkÄrt, es palaidu
Tad es mÄÄ£inÄju
TÄtad aizkavi izraisÄ«ja nevis mans kods, gRPC ievieÅ”ana vai tÄ«kls. Es sÄku uztraukties, ka es to nekad nesapratÄ«Å”u.
Tagad kÄdu OS mÄs izmantojam
gRPC
plaÅ”i izmantots operÄtÄjsistÄmÄ Linux, bet eksotisks operÄtÄjsistÄmÄ Windows. Es nolÄmu izmÄÄ£inÄt eksperimentu, kas darbojÄs: izveidoju Linux virtuÄlo maŔīnu, kompilÄju Alvin for Linux un izvietoju to.
Un notika Å”Ädi: Linux galda tenisa serverim nebija tÄdas paÅ”as aizkaves kÄ lÄ«dzÄ«gam Windows resursdatoram, lai gan datu avots neatŔķīrÄs. IzrÄdÄs, ka problÄma ir gRPC ievieÅ”anÄ operÄtÄjsistÄmai Windows.
Nagles algoritms
Visu Å”o laiku es domÄju, ka man trÅ«kst karoga gRPC
. Tagad es saprotu, kas tas Ä«sti ir gRPC
TrÅ«kst Windows karoga. Es atradu iekÅ”Äjo RPC bibliotÄku, par kuru biju pÄrliecinÄts, ka tÄ labi darbosies visiem karodziÅu komplektiem
GandrÄ«z Gatavs: es sÄku noÅemt pievienotos karogus pa vienam, lÄ«dz regresija atgriezÄs, lai varÄtu precÄ«zi noteikt cÄloni. Tas bija bÄdÄ«gi slavens
gRPC
Å”is karodziÅÅ” tika iestatÄ«ts Linux ievieÅ”anÄ TCP ligzdÄm, bet ne sistÄmÄ Windows. Es esmu Å”is
SecinÄjums
LielÄku latentumu pie zema QPS izraisÄ«ja OS optimizÄcija. RetrospektÄ«vi, profilÄÅ”ana nekonstatÄja latentumu, jo tÄ tika veikta kodola režīmÄ, nevis iekÅ”Ä
Kas attiecas uz localhost eksperimentu, tas, iespÄjams, nepieskÄrÄs faktiskajam tÄ«kla kodam un Nagle algoritms nedarbojÄs, tÄpÄc latentuma problÄmas pazuda, kad klients sasniedza Alvin, izmantojot localhost.
NÄkamreiz, kad redzÄsiet latentuma pieaugumu, jo samazinÄs pieprasÄ«jumu skaits sekundÄ, Nagle algoritmam vajadzÄtu bÅ«t jÅ«su aizdomÄs turamo sarakstÄ!
Avots: www.habr.com