ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Mae Dadansoddi a Thiwnio Perfformiad yn offeryn pwerus ar gyfer gwirio cydymffurfiaeth perfformiad ar gyfer cwsmeriaid.

Gellir defnyddio dadansoddi perfformiad i nodi tagfeydd mewn rhaglen, gan gymhwyso dull gwyddonol i ddilysu arbrofion tiwnio. Mae'r erthygl hon yn diffinio dull cyffredinol o ddadansoddi a thiwnio perfformiad, gan ddefnyddio gweinydd gwe Go fel enghraifft.

Mae Go yn arbennig o addas yma oherwydd bod ganddo offer proffilio. pprof yn y llyfrgell safonol.

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Strategaeth

Gadewch i ni greu rhestr gryno ar gyfer ein dadansoddiad strwythurol. Byddwn yn ceisio defnyddio rhywfaint o ddata i wneud penderfyniadau yn lle gwneud newidiadau yn seiliedig ar reddf neu ddyfalu. I wneud hyn, byddwn yn gwneud y canlynol:

  • Rydym yn diffinio'r ffiniau optimeiddio (gofynion);
  • Rydym yn cyfrifo'r llwyth trafodion ar gyfer y system;
  • Rydym yn cynnal y prawf (creu data);
  • Rydym yn arsylwi;
  • Rydym yn dadansoddi – a yw'r holl ofynion wedi'u bodloni?
  • Rydym yn ei sefydlu'n wyddonol ac yn gwneud rhagdybiaeth;
  • Rydym yn cynnal arbrawf i brofi'r ddamcaniaeth hon.

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Pensaernïaeth Gweinydd HTTP Syml

Ar gyfer yr erthygl hon byddwn yn defnyddio gweinydd HTTP bach yn Golang. Gellir dod o hyd i'r holl god o'r erthygl hon yma.

Mae'r rhaglen a ddadansoddwyd yn weinydd HTTP sy'n holi PostgreSQL am bob cais. Yn ogystal, defnyddir Prometheus, node_exporter, a Grafana i gasglu ac arddangos metrigau'r rhaglen a'r system.

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Er mwyn symlrwydd, rydym yn cymryd yn ganiataol, ar gyfer graddio llorweddol (ac i symleiddio cyfrifiadau), bod pob gwasanaeth a chronfa ddata yn cael eu defnyddio gyda'i gilydd:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Diffinio nodau

Yn y cam hwn, rydym yn diffinio ein nod. Beth ydym yn ceisio'i ddadansoddi? Sut ydym yn gwybod pryd mae'n bryd stopio? Yn yr erthygl hon, byddwn yn tybio bod gennym gleientiaid a bydd ein gwasanaeth yn prosesu 10,000 o geisiadau yr eiliad.

В Llyfr SRE Google Trafodwyd dulliau dethol a modelu yn fanwl. Gadewch i ni wneud yr un peth ac adeiladu modelau:

  • Oedi: Dylai 99% o geisiadau gael eu cwblhau mewn llai na 60ms;
  • Cost: Dylai'r gwasanaeth ddefnyddio'r swm lleiaf o arian yr ydym yn ei ystyried yn rhesymol bosibl. I gyflawni hyn, rydym yn cynyddu'r trwybwn i'r eithaf;
  • Cynllunio capasiti: Deall a dogfennu faint o achosion o'r rhaglen fydd angen eu rhedeg, gan gynnwys ymarferoldeb graddio cyffredinol, yn ogystal â faint o achosion fydd eu hangen i fodloni gofynion llwyth a darpariaeth cychwynnol diswyddiad n+1.

Efallai y bydd angen optimeiddio oedi yn ogystal â dadansoddi, ond mae angen dadansoddi trwybwn yn bendant. Wrth ddefnyddio'r broses SLO SRE, mae'r gofyniad oedi yn dod gan y cleient a/neu'r busnes, a gynrychiolir gan berchennog y cynnyrch. A bydd ein gwasanaeth yn cyflawni'r ymrwymiad hwn o'r cychwyn cyntaf, heb unrhyw addasu!

Sefydlu amgylchedd prawf

Gan ddefnyddio amgylchedd prawf, gallwn roi llwyth mesuredig ar ein system. Bydd data perfformiad gwasanaeth gwe yn cael ei gynhyrchu i'w ddadansoddi.

Llwyth trafodion

Mae'r amgylchedd hwn yn defnyddio Llysieuyn i greu cyfradd cais HTTP personol nes ei stopio:

$ 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

Arsylwi

Yn ystod y gweithrediad, bydd llwyth gwaith trafodion yn cael ei gymhwyso. Yn ogystal â metrigau cymhwysiad (nifer y ceisiadau, oedi ymateb) a metrigau system weithredu (cof, CPU, IOPS), bydd proffilio cymwysiadau yn cael ei redeg i ddeall ble mae problemau'n digwydd a sut mae amser CPU yn cael ei ddefnyddio.

Proffilio

Mae proffilio yn fath o fesuriad sy'n eich galluogi i weld ble mae amser CPU yn cael ei dreulio tra bod rhaglen yn rhedeg. Mae'n eich galluogi i benderfynu'n union ble a faint o amser CPU sy'n cael ei dreulio:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Gellir defnyddio'r data hwn yn ystod y dadansoddiad i gael cipolwg ar amser CPU a wastraffwyd a gwaith diangen. Gall Go (pprof) gynhyrchu proffiliau a'u delweddu fel graff fflam gan ddefnyddio set safonol o offer. Byddaf yn trafod eu defnydd a chanllaw gosod yn ddiweddarach yn yr erthygl.

Gweithredu, arsylwi, dadansoddi.

Gadewch i ni gynnal arbrawf. Byddwn yn rhedeg, yn arsylwi, ac yn dadansoddi nes ein bod yn fodlon ar y perfformiad. Byddwn yn dewis llwyth mympwyol o isel i'w ddefnyddio i gael arsylwadau cychwynnol. Ym mhob cam dilynol, byddwn yn cynyddu'r llwyth gyda ffactor graddio a ddewisir gyda rhywfaint o amrywiant. Bydd pob rhediad prawf llwyth yn cael ei berfformio gyda nifer addasedig o geisiadau: make load-test LOAD_TEST_RATE=X.

50 o geisiadau yr eiliad

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Rhowch sylw i'r ddau graff uchaf. Mae'r graff chwith uchaf yn dangos bod ein cymhwysiad yn prosesu 50 cais yr eiliad (yn ôl ei gyfrifiadau), ac mae'r graff dde uchaf yn dangos hyd pob cais. Mae'r ddau baramedr yn ein helpu i fonitro a dadansoddi a ydym o fewn ein terfynau perfformiad. Y llinell goch ar y graff Oedi Cais HTTP yn dangos SLO o 60ms. Mae'r llinell yn dangos ein bod ymhell islaw ein hamser ymateb mwyaf.

Gadewch i ni edrych arno o ochr y gost:

10000 o geisiadau yr eiliad / 50 o geisiadau fesul gweinydd = 200 o weinyddion + 1

Gallwn ni wella’r ffigur hwn o hyd.

500 o geisiadau yr eiliad

Mae pethau mwy diddorol yn dechrau digwydd pan fydd y llwyth yn cyrraedd 500 o geisiadau yr eiliad:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Unwaith eto, mae'r graff chwith uchaf yn dangos bod y rhaglen yn cofrestru llwyth arferol. Os nad yw hyn yn wir, mae problem gyda'r gweinydd sy'n rhedeg y rhaglen. Mae'r graff oedi ymateb, sydd wedi'i leoli ar y dde uchaf, yn dangos bod 500 o geisiadau'r eiliad wedi arwain at oedi ymateb o 25-40ms. Mae'r 99fed ganradd yn dal i fod yn gyfforddus o fewn y SLO o 60ms a ddewiswyd uchod.

O ran cost:

10000 o geisiadau yr eiliad / 500 o geisiadau fesul gweinydd = 20 o weinyddion + 1

Mae lle i wella o hyd.

1000 o geisiadau yr eiliad

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Lansiad gwych! Mae'r ap yn dangos ei fod wedi prosesu 1000 o geisiadau'r eiliad, ond torrwyd y terfyn latency gan y SLO. Mae hyn yn amlwg yn y llinell p99 yn y graff dde uchaf. Er bod y llinell p100 yn llawer uwch, mae'r latency gwirioneddol uwchlaw'r uchafswm o 60ms. Gadewch i ni blymio i broffilio i weld beth mae'r ap yn ei wneud mewn gwirionedd.

Proffilio

Ar gyfer proffilio rydym yn gosod y llwyth i 1000 o geisiadau yr eiliad, yna'n defnyddio pprof i gasglu data i ddarganfod ble mae'r rhaglen yn treulio amser CPU. Gellir gwneud hyn drwy actifadu pwynt terfyn HTTP. pprof, yna arbedwch y canlyniadau o dan lwyth gan ddefnyddio curl:

$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof

Gellir arddangos y canlyniadau fel hyn:

$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Mae'r graff yn dangos ble a faint o amser CPU mae'r ap yn ei dreulio. O'r disgrifiad Brendan Gregg:

Mae'r echelin-X yn dangos llenwad proffil y pentwr, wedi'i ddidoli yn nhrefn yr wyddor (nid amser). Mae'r echelin-Y yn dangos dyfnder y pentwr, gan gyfrif o sero i [brig]. Mae pob petryal yn cynrychioli ffrâm pentwr. Po lletaf yw'r ffrâm, y mwyaf aml y mae'n ymddangos mewn pentyrrau. Mae'r ffrâm uchaf yn rhedeg ar y CPU, tra bod y fframiau isaf yn elfennau plentyn. Yn gyffredinol, nid yw lliwiau'n cynrychioli unrhyw beth, ond fe'u dewisir ar hap i wahaniaethu rhwng fframiau.

Dadansoddiad - rhagdybiaeth

Ar gyfer tiwnio, byddwn yn canolbwyntio ar geisio dod o hyd i wastraff amser CPU. Byddwn yn chwilio am y ffynonellau mwyaf o wariant gwastraffus ac yn eu dileu. Wel, o ystyried bod proffilio yn datgelu'n eithaf cywir ble yn union mae rhaglen yn treulio ei hamser CPU, efallai y bydd yn rhaid i chi wneud hyn sawl gwaith, a bydd angen i chi hefyd newid cod ffynhonnell y rhaglen, ail-redeg y profion, ac arsylwi bod y perfformiad yn agosáu at y targed.

Gan ddilyn argymhellion Brendan Gregg, byddwn yn darllen y graff o'r top i'r gwaelod. Mae pob llinell yn cynrychioli ffrâm pentwr (galwad swyddogaeth). Y llinell gyntaf yw pwynt mynediad y rhaglen, rhiant yr holl alwadau eraill (hynny yw, bydd gan bob galwad arall ef yn eu pentwr). Mae'r llinell nesaf yn wahanol:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Os byddwch chi'n hofran dros enw swyddogaeth ar y graff, fe welwch chi gyfanswm yr amser a dreuliodd ar y pentwr yn ystod dadfygio. Roedd y swyddogaeth HTTPServe yno am 65% o'r amser, tra bod swyddogaethau amser rhedeg eraill runtime.mcall, mstart и gc, cymerodd weddill yr amser. Ffaith ddiddorol: treuliwyd 5% o gyfanswm yr amser ar ymholiadau DNS:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Mae'r cyfeiriadau y mae'r rhaglen yn chwilio amdanynt yn perthyn i Postgresql. Cliciwch ar FindByAge:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Yn ddiddorol, mae'r rhaglen yn dangos bod tair prif ffynhonnell oedi yn y bôn: agor a chau cysylltiadau, ceisiadau data, a chysylltiadau cronfa ddata. Mae'r graff yn dangos bod ceisiadau DNS ac agor a chau cysylltiadau yn cyfrif am oddeutu 13% o gyfanswm yr amser gweithredu.

Damcaniaeth: Dylai ailddefnyddio cysylltiadau gyda phwll leihau amser un cais HTTP, gan ganiatáu ar gyfer trwybwn uwch a latency is..

Gosod y rhaglen - arbrawf

Rydym yn diweddaru'r cod ffynhonnell ac yn ceisio tynnu'r cysylltiad PostgreSQL ar gyfer pob ymholiad. Y dewis cyntaf yw defnyddio pwll cysylltiad ar lefel y cymhwysiad. Yn yr arbrawf hwn, rydym ni gadewch i ni ei sefydlu cronni cysylltiadau gan ddefnyddio gyrrwr sql ar gyfer go:

db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)

if err != nil {
   return nil, err
}

Gweithredu, arsylwi, dadansoddi

Ar ôl ailgychwyn y prawf gyda 1000 o geisiadau'r eiliad, mae'n amlwg bod latency p99 wedi dychwelyd i normal gyda SLO o 60ms!

Beth yw'r gost?

10000 o geisiadau yr eiliad / 1000 o geisiadau fesul gweinydd = 10 o weinyddion + 1

Gadewch i ni ei wneud hyd yn oed yn well!

2000 o geisiadau yr eiliad

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Mae dyblu'r llwyth yn dangos yr un peth, mae'r graff chwith uchaf yn dangos bod y rhaglen yn llwyddo i brosesu 2000 o geisiadau'r eiliad, mae p100 yn is na 60ms, mae p99 yn bodloni'r SLO.

O ran cost:

10000 o geisiadau yr eiliad / 2000 o geisiadau fesul gweinydd = 5 o weinyddion + 1

3000 o geisiadau yr eiliad

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Yma, gall y rhaglen brosesu 3000 o geisiadau gyda latency p99 o lai na 60 ms. Ni thorrir y SLO, a gosodir y gost fel a ganlyn:

10000 o geisiadau yr eiliad / 3000 o geisiadau fesul gweinydd = 4 gweinydd + 1 (talgrynnodd yr awdur, tua. cyfieithydd)

Gadewch i ni roi cynnig ar rownd arall o ddadansoddi.

Dadansoddiad - rhagdybiaeth

Rydym yn casglu ac yn arddangos canlyniadau dadfygio'r rhaglen ar 3000 o geisiadau'r eiliad:

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Mae 6% o'r amser yn dal i gael ei dreulio yn sefydlu cysylltiadau. Mae sefydlu pwll wedi gwella perfformiad, ond mae'n dal yn amlwg bod y rhaglen yn parhau i greu cysylltiadau newydd i'r gronfa ddata.

Damcaniaeth: Mae cysylltiadau, er gwaethaf presenoldeb pwll, yn dal i gael eu gollwng a'u clirio, felly mae angen i'r rhaglen eu hailsefydlu. Dylai gosod nifer y cysylltiadau sydd ar y gweill i faint y pwll helpu gyda'r oedi trwy leihau'r amser y mae'r rhaglen yn ei dreulio yn sefydlu cysylltiad..

Gosod y rhaglen - arbrawf

Gadewch i ni geisio gosod MaxIdleConns yn hafal i faint y pwll (a ddisgrifir hefyd yma):

db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
   return nil, err
}

Gweithredu, arsylwi, dadansoddi

3000 o geisiadau yr eiliad

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

p99 llai na 60ms gyda p100 sylweddol is!

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Mae gwiriad graff fflam yn dangos nad yw'r cysylltiad yn weladwy mwyach! Gadewch i ni edrych yn agosach. pg(*conn).query — nid ydym chwaith yn sylwi ar y cysylltiad sy'n cael ei sefydlu yma.

ARhPh: Dadansoddi Perfformiad. Dull gosod gan ddefnyddio gweinydd gwe syml yn Go

Casgliad

Mae dadansoddi perfformiad yn hanfodol i ddeall a yw disgwyliadau cwsmeriaid a gofynion answyddogaethol yn cael eu bodloni. Gall cymharu arsylwadau â disgwyliadau cwsmeriaid helpu i benderfynu beth sy'n dderbyniol a beth sydd ddim. Mae Go yn darparu offer pwerus sydd wedi'u hadeiladu i'r llyfrgell safonol sy'n gwneud y dadansoddiad hwn yn syml ac yn hygyrch.

Ffynhonnell: hab.com

Prynu gwesteio dibynadwy ar gyfer gwefannau sydd â diogelwch DDoS, gweinyddwyr VPS VDS 🔥 Prynu cynnal gwefannau dibynadwy gyda diogelwch DDoS, gweinyddion VPS VDS | ProHoster