ProHoster > Blogs > AdministrÄcija > SRE: veiktspÄjas analÄ«ze. KonfigurÄcijas metode, izmantojot vienkÄrÅ”u tÄ«mekļa serveri Go
SRE: veiktspÄjas analÄ«ze. KonfigurÄcijas metode, izmantojot vienkÄrÅ”u tÄ«mekļa serveri Go
VeiktspÄjas analÄ«ze un regulÄÅ”ana ir spÄcÄ«gs rÄ«ks, lai pÄrbaudÄ«tu klientu veiktspÄjas atbilstÄ«bu.
VeiktspÄjas analÄ«zi var izmantot, lai pÄrbaudÄ«tu programmas vÄjÄs vietas, pielietojot zinÄtnisku pieeju regulÄÅ”anas eksperimentu testÄÅ”anai. Å ajÄ rakstÄ ir definÄta vispÄrÄ«ga pieeja veiktspÄjas analÄ«zei un regulÄÅ”anai, kÄ piemÄru izmantojot Go tÄ«mekļa serveri.
Go ir Ä«paÅ”i labs Å”eit, jo tam ir profilÄÅ”anas rÄ«ki pprof standarta bibliotÄkÄ.
stratÄÄ£ija
Izveidosim kopsavilkuma sarakstu mÅ«su strukturÄlajai analÄ«zei. MÄs mÄÄ£inÄsim izmantot dažus datus, lai pieÅemtu lÄmumus, nevis veiktu izmaiÅas, pamatojoties uz intuÄ«ciju vai minÄjumiem. Lai to izdarÄ«tu, mÄs darÄ«sim Å”Ädi:
NosakÄm optimizÄcijas robežas (prasÄ«bas);
MÄs aprÄÄ·inÄm transakciju slodzi sistÄmai;
Veicam testu (veidojam datus);
MÄs novÄrojam;
MÄs analizÄjam ā vai visas prasÄ«bas ir izpildÄ«tas?
MÄs to uzstÄdÄm zinÄtniski, izvirzÄm hipotÄzi;
MÄs veicam eksperimentu, lai pÄrbaudÄ«tu Å”o hipotÄzi.
VienkÄrÅ”a HTTP servera arhitektÅ«ra
Å im rakstam mÄs izmantosim nelielu HTTP serveri GolangÄ. Visu Ŕī raksta kodu var atrast Å”eit.
AnalizÄjamÄ lietojumprogramma ir HTTP serveris, kas aptauj Postgresql katram pieprasÄ«jumam. TurklÄt ir Prometheus, node_exporter un Grafana lietojumprogrammu un sistÄmas metrikas apkopoÅ”anai un parÄdÄ«Å”anai.
VienkÄrÅ”oÅ”anas labad mÄs uzskatÄm, ka horizontÄlajai mÄrogoÅ”anai (un aprÄÄ·inu vienkÄrÅ”oÅ”anai) katrs pakalpojums un datubÄze tiek izvietoti kopÄ:
MÄrÄ·u definÄÅ”ana
Å ajÄ posmÄ mÄs izlemjam par mÄrÄ·i. Ko mÄs cenÅ”amies analizÄt? KÄ mÄs zinÄm, kad ir pienÄcis laiks beigt? Å ajÄ rakstÄ mÄs iedomÄsimies, ka mums ir klienti un mÅ«su pakalpojums apstrÄdÄs 10 000 pieprasÄ«jumu sekundÄ.
Š Google SRE grÄmata Atlases un modelÄÅ”anas metodes ir detalizÄti apskatÄ«tas. DarÄ«sim to paÅ”u un veidosim modeļus:
Izmaksas: pakalpojumam ir jÄpatÄrÄ minimÄlÄ naudas summa, kas, mÅ«suprÄt, ir saprÄtÄ«gi iespÄjama. Lai to izdarÄ«tu, mÄs palielinÄm caurlaidspÄju;
Jaudas plÄnoÅ”ana: ir jÄsaprot un jÄdokumentÄ, cik lietojumprogrammas gadÄ«jumu bÅ«s jÄpalaiž, ieskaitot vispÄrÄjo mÄrogoÅ”anas funkcionalitÄti un cik gadÄ«jumu bÅ«s nepiecieÅ”ams, lai izpildÄ«tu sÄkotnÄjÄs slodzes un nodroÅ”inÄÅ”anas prasÄ«bas. atlaiÅ”ana n+1.
Latentam var bÅ«t nepiecieÅ”ama optimizÄcija papildus analÄ«zei, taÄu nepÄrprotami ir jÄanalizÄ caurlaidspÄja. Izmantojot SRE SLO procesu, aizkaves pieprasÄ«jums nÄk no klienta vai uzÅÄmuma, ko pÄrstÄv produkta Ä«paÅ”nieks. Un mÅ«su serviss Å”o pienÄkumu izpildÄ«s jau no paÅ”a sÄkuma bez jebkÄdiem iestatÄ«jumiem!
Testa vides iestatīŔana
Ar testa vides palÄ«dzÄ«bu mÄs varÄsim novietot izmÄrÄ«tu slodzi uz mÅ«su sistÄmu. AnalÄ«zei tiks Ä£enerÄti dati par tÄ«mekļa pakalpojuma veiktspÄju.
Darījumu slodze
Å Ä« vide izmanto veÄ£etÄt lai izveidotu pielÄgotu HTTP pieprasÄ«juma Ätrumu lÄ«dz apturÄÅ”anai:
$ make load-test LOAD_TEST_RATE=50
echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report
NovÄroÅ”ana
DarÄ«juma slodze tiks piemÄrota izpildlaikÄ. Papildus lietojumprogrammu (pieprasÄ«jumu skaits, atbildes latentums) un operÄtÄjsistÄmas (atmiÅa, centrÄlais procesors, IOPS) metrikai tiks veikta lietojumprogrammu profilÄÅ”ana, lai saprastu, kur tai ir problÄmas un kÄ tiek patÄrÄts CPU laiks.
ProfilÄÅ”ana
ProfilÄÅ”ana ir mÄrÄ«jumu veids, kas ļauj redzÄt, kur paiet CPU laiks, kad lietojumprogramma darbojas. Tas ļauj precÄ«zi noteikt, kur un cik daudz procesora laika tiek tÄrÄts:
Å os datus var izmantot analÄ«zes laikÄ, lai gÅ«tu ieskatu par izŔķÄrdÄto CPU laiku un nevajadzÄ«go darbu. Go (pprof) var Ä£enerÄt profilus un vizualizÄt tos kÄ liesmu diagrammas, izmantojot standarta rÄ«ku komplektu. Par to lietoÅ”anu un iestatÄ«Å”anas rokasgrÄmatu es runÄÅ”u vÄlÄk rakstÄ.
Izpilde, novÄroÅ”ana, analÄ«ze.
Veiksim eksperimentu. UzstÄsim, vÄrosim un analizÄsim, lÄ«dz bÅ«sim apmierinÄti ar sniegumu. IzvÄlÄsimies patvaļīgi zemu slodzes vÄrtÄ«bu, lai to lietotu, lai iegÅ«tu pirmo novÄrojumu rezultÄtus. KatrÄ nÄkamajÄ solÄ« mÄs palielinÄsim slodzi ar noteiktu mÄrogoÅ”anas koeficientu, kas izvÄlÄts ar dažÄm izmaiÅÄm. Katra slodzes pÄrbaudes darbÄ«ba tiek veikta ar pielÄgotu pieprasÄ«jumu skaitu: make load-test LOAD_TEST_RATE=X.
50 pieprasÄ«jumi sekundÄ
PievÄrsiet uzmanÄ«bu diviem augÅ”Äjiem grafikiem. AugÅ”ÄjÄ kreisajÄ pusÄ ir redzams, ka mÅ«su lietojumprogramma apstrÄdÄ 50 pieprasÄ«jumus sekundÄ (tÄ domÄ), un augÅ”ÄjÄ labajÄ stÅ«rÄ« ir redzams katra pieprasÄ«juma ilgums. Abi parametri palÄ«dz mums apskatÄ«t un analizÄt, vai esam mÅ«su veiktspÄjas robežÄs vai nÄ. SarkanÄ lÄ«nija diagrammÄ HTTP pieprasÄ«juma latentums parÄda SLO pie 60 ms. LÄ«nija parÄda, ka esam krietni zem maksimÄlÄ atbildes laika.
InteresantÄkas lietas sÄk notikt, kad slodze sasniedz 500 pieprasÄ«jumus sekundÄ:
Atkal augÅ”ÄjÄ kreisajÄ diagrammÄ var redzÄt, ka lietojumprogramma reÄ£istrÄ normÄlu slodzi. Ja tas tÄ nav, serverÄ«, kurÄ darbojas lietojumprogramma, ir problÄma. Atbildes latentuma diagramma atrodas augÅ”ÄjÄ labajÄ stÅ«rÄ«, un tas parÄda, ka 500 pieprasÄ«jumi sekundÄ izraisÄ«ja atbildes aizkavi 25ā40 ms. 99. procentile joprojÄm lieliski iekļaujas iepriekÅ” izvÄlÄtajÄ 60 ms SLO.
Lieliska palaiÅ”ana! Lietojumprogramma rÄda, ka tÄ apstrÄdÄja 1000 pieprasÄ«jumus sekundÄ, taÄu latentuma limits tika pÄrkÄpts ar SLO. To var redzÄt p99 rindÄ augÅ”ÄjÄ labajÄ diagrammÄ. Neskatoties uz to, ka p100 lÄ«nija ir daudz augstÄka, faktiskÄ aizkave ir lielÄka par maksimÄlo 60 ms. IedziļinÄsimies profilÄÅ”anÄ, lai uzzinÄtu, ko lietojumprogramma faktiski dara.
ProfilÄÅ”ana
ProfilÄÅ”anai mÄs iestatÄm slodzi uz 1000 pieprasÄ«jumiem sekundÄ, pÄc tam izmantojiet pprof lai iegÅ«tu datus, lai uzzinÄtu, kur lietojumprogramma pavada CPU laiku. To var izdarÄ«t, aktivizÄjot HTTP galapunktu pprof, un pÄc tam zem slodzes saglabÄjiet rezultÄtus, izmantojot curl:
$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof
Diagramma parÄda, kur un cik daudz lietojumprogramma tÄrÄ CPU laiku. No apraksta no Brendans Gregs:
X ass ir kaudzes profila populÄcija, kas sakÄrtota alfabÄtiskÄ secÄ«bÄ (tas nav laiks), Y ass parÄda kaudzes dziļumu, skaitot no nulles [augÅ”Ä]. Katrs taisnstÅ«ris ir kaudzes rÄmis. Jo platÄks rÄmis, jo biežÄk tas atrodas skursteÅos. Tas, kas atrodas augÅ”pusÄ, darbojas ar centrÄlo procesoru, un tas, kas atrodas zemÄk, ir pakÄrtotie elementi. KrÄsas parasti neko nenozÄ«mÄ, bet vienkÄrÅ”i tiek izvÄlÄtas nejauÅ”i, lai atŔķirtu rÄmjus.
AnalÄ«ze - hipotÄze
NoregulÄÅ”anai mÄs koncentrÄsimies uz mÄÄ£inÄjumu atrast izŔķÄrdÄtu CPU laiku. MÄs meklÄsim lielÄkos bezjÄdzÄ«go tÄriÅu avotus un noÅemsim tos. TÄ kÄ profilÄÅ”ana ļoti precÄ«zi atklÄj, kur tieÅ”i lietojumprogramma tÄrÄ savu procesora laiku, iespÄjams, tas bÅ«s jÄdara vairÄkas reizes, kÄ arÄ« bÅ«s jÄmaina lietojumprogrammas pirmkods, atkÄrtoti jÄveic testi un jÄpÄrliecinÄs, ka veiktspÄja tuvojas mÄrÄ·im.
Sekojot Brendana Grega ieteikumiem, mÄs lasÄ«sim diagrammu no augÅ”as uz leju. KatrÄ rindÄ tiek parÄdÄ«ts kaudzes rÄmis (funkcijas izsaukums). PirmÄ rinda ir ieejas punkts programmÄ, visu pÄrÄjo zvanu vecÄks (citiem vÄrdiem sakot, visiem pÄrÄjiem zvaniem tas bÅ«s savÄ kaudzÄ). NÄkamÄ rinda jau ir atŔķirÄ«ga:
Ja grafikÄ novietojat kursoru virs funkcijas nosaukuma, tiks parÄdÄ«ts kopÄjais laiks, kad tÄ atradÄs kaudzÄ atkļūdoÅ”anas laikÄ. HTTPServe funkcija bija tur 65% laika, citas izpildlaika funkcijas runtime.mcall, mstart Šø gc, aizÅÄma atlikuÅ”o laiku. Jautrs fakts: 5% no kopÄjÄ laika tiek tÄrÄti DNS vaicÄjumiem:
Programmas meklÄtÄs adreses pieder Postgresql. KlikŔķiniet uz FindByAge:
Interesanti, ka programma parÄda, ka principÄ ir trÄ«s galvenie avoti, kas pievieno aizkavÄÅ”anos: savienojumu atvÄrÅ”ana un aizvÄrÅ”ana, datu pieprasÄ«Å”ana un pieslÄgÅ”ana datubÄzei. GrafikÄ redzams, ka DNS pieprasÄ«jumi, savienojumu atvÄrÅ”ana un aizvÄrÅ”ana aizÅem aptuveni 13% no kopÄjÄ izpildes laika.
HipotÄze: AtkÄrtoti izmantojot savienojumus, izmantojot pÅ«lÄÅ”anu, jÄsamazina viena HTTP pieprasÄ«juma laiks, nodroÅ”inot lielÄku caurlaidspÄju un mazÄku latentumu.
Lietojumprogrammas iestatīŔana - eksperiments
MÄs atjauninÄm avota kodu, cenÅ”amies noÅemt savienojumu ar Postgresql katram pieprasÄ«jumam. PirmÄ iespÄja ir izmantot savienojuma baseins lietojumprogrammas lÄ«menÄ«. Å ajÄ eksperimentÄ mÄs iestatÄ«sim to savienojumu apvienoÅ”ana, izmantojot SQL draiveri for go:
Å eit lietojumprogramma var apstrÄdÄt 3000 pieprasÄ«jumus ar p99 latentumu, kas mazÄks par 60 ms. SLO netiek pÄrkÄpts, un izmaksas tiek pieÅemtas Å”Ädi:
10000 3000 pieprasÄ«jumu sekundÄ / uz 4 1 pieprasÄ«jumiem uz serveri = XNUMX serveri + XNUMX (autors ir noapaļojis, apm. tulkotÄjs)
MÄÄ£inÄsim veikt citu analÄ«zes kÄrtu.
AnalÄ«ze - hipotÄze
MÄs apkopojam un parÄdÄm lietojumprogrammas atkļūdoÅ”anas rezultÄtus ar 3000 pieprasÄ«jumiem sekundÄ:
JoprojÄm 6% laika tiek veltÄ«ti savienojumu izveidei. PÅ«la iestatÄ«Å”ana ir uzlabojusi veiktspÄju, taÄu joprojÄm varat redzÄt, ka lietojumprogramma turpina darbu, lai izveidotu jaunus savienojumus ar datu bÄzi.
HipotÄze: Savienojumi, neskatoties uz baseina klÄtbÅ«tni, joprojÄm tiek pÄrtraukti un iztÄ«rÄ«ti, tÄpÄc lietojumprogrammai tie ir jÄatiestata. NeapstiprinÄto savienojumu skaita iestatÄ«Å”ana uz pÅ«la lielumu palÄ«dzÄs samazinÄt latentumu, samazinot laiku, ko lietojumprogramma pavada savienojuma izveidei..
Lietojumprogrammas iestatīŔana - eksperiments
MÄÄ£ina instalÄt MaxIdleConns vienÄds ar baseina izmÄru (arÄ« aprakstÄ«ts Å”eit):
p99 ir mazÄks par 60 ms ar ievÄrojami mazÄku p100!
PÄrbaudot liesmas grafiku, redzams, ka savienojums vairs nav manÄms! PÄrbaudÄ«sim sÄ«kÄk pg(*conn).query ā mÄs arÄ« nepamanÄm, ka Å”eit tiek izveidots savienojums.
SecinÄjums
VeiktspÄjas analÄ«ze ir ļoti svarÄ«ga, lai saprastu, ka tiek izpildÄ«tas klientu vÄlmes un nefunkcionÄlÄs prasÄ«bas. AnalÄ«ze, salÄ«dzinot novÄrojumus ar klientu vÄlmÄm, var palÄ«dzÄt noteikt, kas ir pieÅemams un kas nav. Go nodroÅ”ina jaudÄ«gus standarta bibliotÄkÄ iebÅ«vÄtus rÄ«kus, kas padara analÄ«zi vienkÄrÅ”u un pieejamu.