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

Mae dadansoddi perfformiad a thiwnio yn arf pwerus ar gyfer gwirio cydymffurfiaeth perfformiad ar gyfer cleientiaid.

Gellir defnyddio dadansoddiad perfformiad i wirio am dagfeydd mewn rhaglen trwy gymhwyso dull gwyddonol o brofi 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 dda yma oherwydd mae 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 ar sail greddf neu ddyfalu. I wneud hyn byddwn yn gwneud hyn:

  • Rydym yn pennu'r ffiniau optimization (gofynion);
  • Rydym yn cyfrifo'r llwyth trafodion ar gyfer y system;
  • Rydym yn perfformio y prawf (creu data);
  • Sylwn;
  • Rydym yn dadansoddi - a yw'r holl ofynion yn cael eu bodloni?
  • Rydym yn ei osod i fyny yn wyddonol, gwneud rhagdybiaeth;
  • Rydyn ni'n 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 cymhwysiad sy'n cael ei ddadansoddi yn weinydd HTTP sy'n pleidleisio Postgresql ar gyfer pob cais. Yn ogystal, mae Prometheus, node_exporter a Grafana ar gyfer casglu ac arddangos metrigau cymhwysiad a system.

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

I symleiddio, rydym o’r farn bod pob gwasanaeth a chronfa ddata yn cael eu defnyddio gyda’i gilydd ar gyfer graddio llorweddol (a symleiddio cyfrifiadau):

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

Diffinio nodau

Ar y cam hwn, rydym yn penderfynu ar y nod. Beth ydyn ni'n ceisio ei ddadansoddi? Sut ydyn ni'n gwybod pryd mae'n amser dod i ben? Yn yr erthygl hon, byddwn yn dychmygu bod gennym gleientiaid ac y bydd ein gwasanaeth yn prosesu 10 o geisiadau yr eiliad.

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

  • Cau: Dylid cwblhau 99% o geisiadau mewn llai na 60ms;
  • Cost: Dylai'r gwasanaeth ddefnyddio'r lleiafswm o arian sy'n rhesymol bosibl yn ein barn ni. I wneud hyn, rydym yn cynyddu trwybwn;
  • Cynllunio capasiti: Mae angen deall a dogfennu sawl achos o'r cais y bydd angen ei redeg, gan gynnwys ymarferoldeb graddio cyffredinol, a sawl achos fydd ei angen i fodloni gofynion llwyth a darpariaeth cychwynnol diswyddo n+1.

Efallai y bydd angen optimeiddio yn ogystal â dadansoddi i fod yn hwyr, ond mae'n amlwg bod angen dadansoddi trwybwn. Wrth ddefnyddio'r broses SRE SLO, daw'r cais oedi gan y cwsmer neu fusnes, a gynrychiolir gan berchennog y cynnyrch. A bydd ein gwasanaeth yn cyflawni'r rhwymedigaeth hon o'r cychwyn cyntaf heb unrhyw osodiadau!

Sefydlu amgylchedd prawf

Gyda chymorth amgylchedd prawf, byddwn yn gallu gosod llwyth mesuredig ar ein system. Er mwyn dadansoddi, bydd data ar berfformiad y gwasanaeth gwe yn cael ei gynhyrchu.

Llwyth trafodiad

Mae'r amgylchedd hwn yn defnyddio Llysieuyn i greu cyfradd cais HTTP arferol 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

Bydd llwyth trafodion yn cael ei gymhwyso ar amser rhedeg. Yn ogystal â metrigau cymhwysiad (nifer y ceisiadau, hwyrni ymateb) a system weithredu (cof, CPU, IOPS), bydd proffilio cymhwysiad yn cael ei redeg i ddeall lle mae ganddo broblemau a sut mae amser CPU yn cael ei ddefnyddio.

Proffilio

Mae proffilio yn fath o fesuriad sy'n eich galluogi i weld i ble mae amser CPU yn mynd pan fydd cais yn rhedeg. Mae'n caniatáu ichi benderfynu yn union ble a faint o amser prosesydd sy'n cael ei dreulio:

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

Gellir defnyddio'r data hwn wrth ddadansoddi i gael mewnwelediad i wastraff amser CPU a gwaith diangen sy'n cael ei wneud. Gall Go (pprof) gynhyrchu proffiliau a'u delweddu fel graffiau fflam gan ddefnyddio set safonol o offer. Byddaf yn siarad am eu canllaw defnydd a setup yn ddiweddarach yn yr erthygl.

Cyflawni, arsylwi, dadansoddi.

Gadewch i ni gynnal arbrawf. Byddwn yn perfformio, arsylwi a dadansoddi hyd nes y byddwn yn fodlon ar y perfformiad. Gadewch inni ddewis gwerth llwyth isel yn fympwyol i'w gymhwyso i gael canlyniadau'r arsylwadau cyntaf. Ar bob cam dilynol byddwn yn cynyddu'r llwyth gyda ffactor graddio penodol, a ddewiswyd gyda rhywfaint o amrywiad. Perfformir pob rhediad profi llwyth gyda nifer y ceisiadau wedi'u haddasu: make load-test LOAD_TEST_RATE=X.

50 cais yr eiliad

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

Rhowch sylw i'r ddau graff uchaf. Mae'r chwith uchaf yn dangos bod ein cais yn prosesu 50 cais yr eiliad (mae'n meddwl) ac mae'r ochr dde uchaf yn dangos hyd pob cais. Mae'r ddau baramedr yn ein helpu i edrych a dadansoddi a ydym o fewn ein ffiniau perfformiad ai peidio. Llinell goch ar y graff HTTP Cais Cudd yn dangos SLO ar 60ms. Mae'r llinell yn dangos ein bod ymhell islaw ein hamser ymateb uchaf.

Edrychwn ar yr ochr gost:

10000 cais yr eiliad / 50 cais y gweinydd = 200 o weinyddion + 1

Gallwn wella’r ffigur hwn o hyd.

500 cais yr eiliad

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

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

Unwaith eto, yn y graff chwith uchaf gallwch weld bod y cais yn cofnodi llwyth arferol. Os nad yw hyn yn wir, mae problem ar y gweinydd y mae'r rhaglen yn rhedeg arno. Mae'r graff hwyrni ymateb wedi'i leoli ar y dde uchaf, sy'n dangos bod 500 o geisiadau yr eiliad wedi arwain at oedi ymateb o 25-40ms. Mae'r 99fed canradd yn dal i ffitio'n dda i'r SLO 60ms a ddewiswyd uchod.

O ran cost:

10000 cais yr eiliad / 500 cais y gweinydd = 20 o weinyddion + 1

Gellir gwella popeth o hyd.

1000 cais yr eiliad

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

Lansiad gwych! Mae'r cais yn dangos ei fod wedi prosesu 1000 o geisiadau yr eiliad, ond mae'r SLO wedi torri'r terfyn hwyrni. Gellir gweld hyn yn llinell t99 yn y graff uchaf ar y dde. Er gwaethaf y ffaith bod y llinell p100 yn llawer uwch, mae'r oedi gwirioneddol yn uwch na'r uchafswm o 60ms. Gadewch i ni blymio i broffilio i ddarganfod beth mae'r cais yn ei wneud mewn gwirionedd.

Proffilio

Ar gyfer proffilio, rydyn ni'n gosod y llwyth i 1000 o geisiadau yr eiliad, yna'n ei ddefnyddio pprof i gipio data i ddarganfod ble mae'r rhaglen yn treulio amser CPU. Gellir gwneud hyn trwy actifadu'r pwynt terfyn HTTP pprof, ac yna, o dan lwyth, arbedwch y canlyniadau 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 mae'r rhaglen yn treulio amser CPU. O'r disgrifiad o Brendan Gregg:

Yr echel X yw'r boblogaeth proffil stac, wedi'i didoli yn nhrefn yr wyddor (nid amser yw hyn), mae'r echel Y yn dangos dyfnder y pentwr, gan gyfrif o sero ar [brig]. Mae pob petryal yn ffrâm pentwr. Po fwyaf eang yw'r ffrâm, y mwyaf aml y mae'n bresennol yn y pentyrrau. Mae'r hyn sydd ar y brig yn rhedeg ar y CPU, a'r hyn sydd isod yw'r elfennau plentyn. Nid yw'r lliwiau fel arfer yn golygu 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 amser CPU wedi'i wastraffu. Byddwn yn chwilio am y ffynonellau mwyaf o wariant diwerth ac yn cael gwared arnynt. Wel, o ystyried bod proffilio yn datgelu'n gywir iawn ble yn union y mae'r cais yn treulio ei amser prosesydd, efallai y bydd yn rhaid i chi ei wneud sawl gwaith, a bydd angen i chi hefyd newid cod ffynhonnell y cais, ail-redeg y profion a gweld bod perfformiad yn agosáu at y targed.

Yn dilyn argymhellion Brendan Gregg, byddwn yn darllen y siart o'r top i'r gwaelod. Mae pob llinell yn dangos ffrâm pentwr (galwad swyddogaeth). Y llinell gyntaf yw'r pwynt mynediad i'r rhaglen, rhiant pob galwad arall (mewn geiriau eraill, bydd pob galwad arall ar eu pentwr). Mae'r llinell nesaf eisoes yn wahanol:

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

Os byddwch yn hofran y cyrchwr dros enw swyddogaeth ar y graff, bydd cyfanswm yr amser yr oedd ar y pentwr yn ystod dadfygio yn cael ei ddangos. Roedd swyddogaeth HTTPServe yno 65% o'r amser, swyddogaethau amser rhedeg eraill runtime.mcall, mstart и gc, wedi cymryd gweddill yr amser. Ffaith hwyliog: treulir 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 edrych 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, mewn egwyddor, bod tair prif ffynhonnell sy'n ychwanegu oedi: agor a chau cysylltiadau, gofyn am ddata, a chysylltu â'r gronfa ddata. Mae'r graff yn dangos bod ceisiadau DNS, agor a chau cysylltiadau yn cymryd tua 13% o gyfanswm yr amser gweithredu.

Damcaniaeth: Dylai ailddefnyddio cysylltiadau gan ddefnyddio cronni leihau amser cais HTTP unigol, gan ganiatáu trwybwn uwch a llai o hwyrni.

Sefydlu'r cais - arbrawf

Rydym yn diweddaru'r cod ffynhonnell, yn ceisio dileu'r cysylltiad â Postgresql ar gyfer pob cais. Yr opsiwn cyntaf yw ei ddefnyddio pwll cysylltiad ar lefel y cais. Yn yr arbrawf hwn rydym gadewch i ni ei sefydlu cronni cysylltiad gan ddefnyddio gyrrwr sql i fynd:

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

if err != nil {
   return nil, err
}

Cyflawni, arsylwi, dadansoddi

Ar ôl ailgychwyn y prawf gyda 1000 o geisiadau yr eiliad, mae’n amlwg bod lefelau hwyrni p99 wedi dychwelyd i normal gyda SLO o 60ms!

Beth yw'r gost?

10000 cais yr eiliad / 1000 cais y gweinydd = 10 o weinyddion + 1

Gadewch i ni ei wneud hyd yn oed yn well!

2000 cais 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 cais yn llwyddo i brosesu 2000 o geisiadau yr eiliad, mae p100 yn is na 60ms, mae p99 yn bodloni'r SLO.

O ran cost:

10000 cais yr eiliad / 2000 cais y gweinydd = 5 o weinyddion + 1

3000 cais yr eiliad

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

Yma gall y cais brosesu 3000 o geisiadau gyda hwyrni p99 o lai na 60ms. Nid yw'r SLO yn cael ei dorri, a derbynnir y gost fel a ganlyn:

10000 cais yr eiliad / fesul 3000 cais y gweinydd = 4 gweinydd + 1 (mae'r awdur wedi talgrynnu, tua. cyfieithydd)

Gadewch i ni roi cynnig ar rownd arall o ddadansoddi.

Dadansoddiad - rhagdybiaeth

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

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

Er hynny, treulir 6% o'r amser ar sefydlu cysylltiadau. Mae sefydlu'r pwll wedi gwella perfformiad, ond gallwch weld o hyd bod y rhaglen yn parhau i weithio ar greu cysylltiadau newydd â'r gronfa ddata.

Damcaniaeth: Mae cysylltiadau, er gwaethaf presenoldeb pwll, yn dal i gael eu gollwng a'u glanhau, felly mae angen i'r cais eu hailosod. Dylai gosod nifer y cysylltiadau arfaethedig â maint y pwll helpu gyda hwyrni trwy leihau'r amser y mae'r rhaglen yn ei dreulio yn creu cysylltiad.

Sefydlu'r cais - arbrawf

Yn ceisio gosod MaxIdleConns hafal i faint y pwll (disgrifir hefyd yma):

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

Cyflawni, arsylwi, dadansoddi

3000 cais yr eiliad

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

Mae t99 yn llai na 60ms gyda llawer llai o p100!

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

Mae gwirio'r graff fflam yn dangos nad yw'r cysylltiad bellach yn amlwg! Gadewch i ni wirio yn fwy manwl pg(*conn).query — nid ydym ychwaith yn sylwi ar y cysylltiad yn cael ei sefydlu yma.

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

Casgliad

Mae dadansoddi perfformiad yn hanfodol i ddeall bod disgwyliadau cwsmeriaid a gofynion anweithredol yn cael eu bodloni. Gall dadansoddi trwy gymharu arsylwadau â disgwyliadau cwsmeriaid helpu i benderfynu beth sy'n dderbyniol a beth nad yw'n dderbyniol. Mae Go yn darparu offer pwerus sydd wedi'u hymgorffori yn y llyfrgell safonol sy'n gwneud dadansoddiad yn syml ac yn hygyrch.

Ffynhonnell: hab.com

Ychwanegu sylw