SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Tha mion-sgrùdadh coileanaidh agus gleusadh na inneal cumhachdach airson dearbhadh gèilleadh coileanaidh do luchd-dèiligidh.

Faodar mion-sgrùdadh coileanaidh a chleachdadh gus sgrùdadh a dhèanamh airson botail ann am prògram le bhith a’ cleachdadh dòigh saidheansail airson deuchainnean gleusaidh a dhearbhadh. Tha an artaigil seo a’ mìneachadh dòigh-obrach coitcheann airson mion-sgrùdadh coileanaidh agus gleusadh, a’ cleachdadh frithealaiche lìn Go mar eisimpleir.

Tha Go gu sònraichte math an seo leis gu bheil innealan pròifil aige pprof anns an leabharlann àbhaisteach.

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

An Ro-innleachd

Nach cruthaich sinn liosta geàrr-chunntas airson ar mion-sgrùdadh structarail. Feuchaidh sinn ri beagan dàta a chleachdadh gus co-dhùnaidhean a dhèanamh an àite atharrachaidhean a dhèanamh stèidhichte air intuition no obair tomhais. Gus seo a dhèanamh nì sinn seo:

  • Bidh sinn a 'dearbhadh crìochan optimization (riatanasan);
  • Bidh sinn a’ tomhas an luchd malairt airson an t-siostam;
  • Bidh sinn a 'dèanamh an deuchainn (cruthaich dàta);
  • Tha sinn ag amharc ;
  • Bidh sinn a’ dèanamh anailis - a bheil a h-uile riatanas air a choileanadh?
  • Bidh sinn ga stèidheachadh gu saidheansail, a’ dèanamh barail;
  • Bidh sinn a’ dèanamh deuchainn gus am beachd-bharail seo a dhearbhadh.

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Ailtireachd frithealaiche HTTP sìmplidh

Airson an artaigil seo cleachdaidh sinn frithealaiche HTTP beag ann an Golang. Gheibhear a h-uile còd bhon artaigil seo an seo.

Is e an tagradh a thathar a’ sgrùdadh frithealaiche HTTP a bhios a’ bhòtadh Postgresql airson gach iarrtas. A bharrachd air an sin, tha Prometheus, node_exporter agus Grafana ann airson a bhith a’ tional agus a’ taisbeanadh metrics tagraidh is siostam.

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Gus a dhèanamh nas sìmplidhe, tha sinn den bheachd gu bheil gach seirbheis agus stòr-dàta air an cleachdadh còmhla airson sgèileadh còmhnard (agus àireamhachadh a dhèanamh nas sìmplidhe):

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

A 'sònrachadh amasan

Aig a 'cheum seo, bidh sinn a' co-dhùnadh air an amas. Dè tha sinn a’ feuchainn ri mion-sgrùdadh? Ciamar a bhios fios againn cuin a thig an t-àm gu crìch? San artaigil seo, smaoinichidh sinn gu bheil teachdaichean againn agus gum bi an t-seirbheis againn a’ giullachd 10 iarrtas gach diog.

В Leabhar Google SRE Thathas a’ beachdachadh gu mionaideach air dòighean taghaidh agus modaladh. Dèanamaid an aon rud agus togaidh sinn modalan:

  • Latency: bu chòir 99% de dh'iarrtasan a bhith air an lìonadh ann an nas lugha na 60ms;
  • Cosgais: Bu chòir don t-seirbheis an ìre as lugha de airgead ithe a tha sinn a’ smaoineachadh a tha reusanta comasach. Gus seo a dhèanamh, bidh sinn a’ meudachadh trochur;
  • Planadh comais: Feumaidh tuigse agus clàradh cia mheud suidheachadh den iarrtas a dh’ fheumar a ruith, a’ gabhail a-steach comas-gnìomh sgèileachaidh iomlan, agus cia mheud suidheachadh a bhios a dhìth gus coinneachadh ri riatanasan luchdaidh is solarachaidh tùsail call dreuchd n+1.

Dh’ fhaodadh gum bi feum aig latency air optimization a bharrachd air mion-sgrùdadh, ach tha e soilleir gu feumar sgrùdadh a dhèanamh air trochur. Nuair a bhios tu a’ cleachdadh pròiseas SRE SLO, thig an t-iarrtas dàil bhon neach-ceannach no bhon ghnìomhachas, air a riochdachadh le sealbhadair an toraidh. Agus coileanaidh an t-seirbheis againn an dleastanas seo bhon fhìor thoiseach gun suidheachadh sam bith!

A 'stèidheachadh àrainneachd deuchainn

Le cuideachadh bho àrainneachd deuchainn, bidh e comasach dhuinn luchd tomhaiste a chuir air an t-siostam againn. Airson mion-sgrùdadh, thèid dàta mu choileanadh na seirbheis lìn a chruthachadh.

eallach malairt

Tha an àrainneachd seo a’ cleachdadh Vegeta gus ìre iarrtas HTTP àbhaisteach a chruthachadh gus an stad e:

$ 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

Amharc

Thèid luchd malairt a chuir an sàs aig àm ruith. A bharrachd air tomhasan tagraidh (àireamh iarrtasan, latency freagairt) agus siostam obrachaidh (cuimhne, CPU, IOPS), thèid pròifil tagraidh a ruith gus tuigsinn far a bheil duilgheadasan aige agus mar a thathas a’ caitheamh ùine CPU.

Pròifil

Is e seòrsa de thomhas a th’ ann an pròifil a leigeas leat faicinn far a bheil ùine CPU a’ dol nuair a tha tagradh a’ ruith. Leigidh e leat faighinn a-mach càite agus dè an ùine pròiseasar a thèid a chaitheamh:

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Faodar an dàta seo a chleachdadh rè mion-sgrùdadh gus sealladh fhaighinn air ùine CPU a chaidh a chaitheamh agus obair neo-riatanach a thathar a’ dèanamh. Faodaidh Go (pprof) pròifilean a ghineadh agus an sealladh mar ghrafaichean lasrach a’ cleachdadh seata innealan àbhaisteach. Bruidhnidh mi mun stiùireadh cleachdaidh agus rèiteachaidh aca nas fhaide air adhart san artaigil.

Cur gu bàs, amharc, mion-sgrùdadh.

Feuch an dèan sinn deuchainn. Bidh sinn a’ coileanadh, a’ coimhead agus a’ sgrùdadh gus am bi sinn riaraichte leis a’ choileanadh. Leig leinn luach luchdan ìosal a thaghadh airson a chuir an sàs gus toraidhean a’ chiad bheachdan fhaighinn. Aig gach ceum às deidh sin àrdaichidh sinn an luchd le feart sgèile sònraichte, air a thaghadh le beagan eadar-dhealachaidh. Bithear a’ coileanadh gach ruith deuchainn luchd leis an àireamh de dh’iarrtasan air an atharrachadh: make load-test LOAD_TEST_RATE=X.

50 iarrtas gach diog

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Thoir aire don dà ghraf as àirde. Tha an taobh chlì gu h-àrd a’ sealltainn gu bheil ar pròiseas tagraidh 50 iarrtas gach diog (tha e a’ smaoineachadh) agus gu h-àrd air an làimh dheis a’ sealltainn fad gach iarrtas. Bidh an dà pharamadair gar cuideachadh le bhith a’ coimhead agus a’ sgrùdadh a bheil sinn taobh a-staigh ar crìochan coileanaidh no nach eil. Loidhne dhearg air a’ ghraf Iarrtas HTTP Latency a’ sealltainn SLO aig 60ms. Tha an loidhne a’ sealltainn gu bheil sinn gu math nas ìsle na an ùine freagairt as àirde a th’ againn.

Bheir sinn sùil air an taobh cosgais:

10000 iarrtas gach diog / 50 iarrtas gach frithealaiche = 200 frithealaiche + 1

Faodaidh sinn fhathast am figear seo a leasachadh.

500 iarrtas gach diog

Bidh rudan nas inntinniche a’ tòiseachadh a’ tachairt nuair a ruigeas an luchd 500 iarrtas gach diog:

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

A-rithist, anns a’ ghraf gu h-àrd air an taobh chlì chì thu gu bheil an aplacaid a’ clàradh luchd àbhaisteach. Mura h-eil seo fìor, tha duilgheadas ann air an fhrithealaiche air a bheil an aplacaid a’ ruith. Tha an graf latency freagairt suidhichte aig a’ mhullach air an làimh dheis, a’ sealltainn gun do dh’ adhbhraich 500 iarrtas gach diog dàil freagairt de 25-40ms. Tha an 99mh sa cheud fhathast a’ freagairt gu math ris an 60ms SLO a chaidh a thaghadh gu h-àrd.

A thaobh cosgais:

10000 iarrtas gach diog / 500 iarrtas gach frithealaiche = 20 frithealaiche + 1

Faodar a h-uile càil a leasachadh fhathast.

1000 iarrtas gach diog

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Cur air bhog sgoinneil! Tha an tagradh a’ sealltainn gun do ghiollaich e 1000 iarrtas gach diog, ach chaidh a’ chrìoch latency a bhriseadh leis an SLO. Chithear seo ann an loidhne td99 sa ghraf gu h-àrd air an làimh dheis. A dh'aindeoin 's gu bheil an loidhne p100 mòran nas àirde, tha an fhìor dàil nas àirde na an ìre as àirde de 60ms. Rachamaid a-steach do phròifil gus faighinn a-mach dè dha-rìribh a bhios an tagradh a’ dèanamh.

Pròifil

Airson pròifil, chuir sinn an luchd gu 1000 iarrtas gach diog, agus an uairsin cleachdaidh sinn pprof gus dàta a ghlacadh gus faighinn a-mach càite a bheil an aplacaid a’ caitheamh ùine CPU. Faodar seo a dhèanamh le bhith a’ cur an gnìomh crìoch HTTP pprof, agus an uairsin, fo luchd, sàbhail na toraidhean le bhith a’ cleachdadh curl:

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

Faodar na toraidhean a thaisbeanadh mar seo:

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

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Tha an graf a’ sealltainn càite agus dè an ìre a bhios an aplacaid a’ cosg ùine CPU. Bhon tuairisgeul bho Brendan Gregg:

Is e an X axis àireamh-sluaigh ìomhaigh stac, air a sheòrsachadh a rèir na h-aibideil (chan e seo an t-àm), tha an axis Y a’ sealltainn doimhneachd a’ chruaich, a’ cunntadh bho neoni aig [mullach]. Tha gach ceart-cheàrnach na fhrèam stac. Mar as fharsainge am frèam, is ann as trice a bhios e anns na stacan. Tha na tha gu h-àrd a’ ruith air an CPU, agus na tha gu h-ìosal tha na h-eileamaidean cloinne. Mar as trice chan eil na dathan a 'ciallachadh rud sam bith, ach tha iad dìreach air an taghadh air thuaiream gus frèaman eadar-dhealaichte.

Mion-sgrùdadh - beachd-bharail

Airson gleusadh, cuiridh sinn fòcas air a bhith a’ feuchainn ri caitheamh ùine CPU a lorg. Coimheadaidh sinn airson na stòran as motha de chaitheamh gun fheum agus bheir sinn air falbh iad. Uill, leis gu bheil pròifil a ’nochdadh gu fìor cheart far a bheil an tagradh a’ caitheamh an ùine pròiseasar aige, is dòcha gum feum thu a dhèanamh grunn thursan, agus feumaidh tu cuideachd còd stòr an tagraidh atharrachadh, na deuchainnean ath-ruith agus faicinn gu bheil coileanadh a ’tighinn faisg air an targaid.

A’ leantainn molaidhean Brendan Gregg, leughaidh sinn a’ chairt bho mhullach gu bonn. Bidh gach loidhne a’ taisbeanadh frèam stac (gairm gnìomh). Is e a’ chiad loidhne an t-àite inntrigidh a-steach don phrògram, pàrant a h-uile gairm eile (ann am faclan eile, bidh e air a’ chruach aca a h-uile gairm eile). Tha an ath loidhne eadar-dhealaichte mu thràth:

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Ma chuireas tu an cursair thairis air ainm gnìomh air a’ ghraf, thèid an ùine iomlan a bha e air a’ chruach aig àm dì-bhugachaidh a thaisbeanadh. Bha an gnìomh HTTPServe ann 65% den ùine, gnìomhan ùine ruith eile runtime.mcall, mstart и gc, ghabh e an còrr den ùine. Fìrinn spòrsail: tha 5% den ùine iomlan ga chosg air ceistean DNS:

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Buinidh na seòlaidhean a tha am prògram a’ sireadh do Postgresql. Cliog air FindByAge:

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Gu inntinneach, tha am prògram a 'sealltainn gu bheil, ann am prionnsabal, trì prìomh thùsan a tha a' cur dàil: fosgladh agus dùnadh cheanglaichean, ag iarraidh dàta, agus a 'ceangal ris an stòr-dàta. Tha an graf a 'sealltainn gu bheil iarrtasan DNS, fosgladh agus dùnadh cheanglaichean a' toirt suas mu 13% den ùine cur gu bàs iomlan.

Beachd-bharail: Bu chòir ath-chleachdadh cheanglaichean a’ cleachdadh cruinneachadh ùine aon iarrtas HTTP a lughdachadh, a’ ceadachadh trochur nas àirde agus latency nas ìsle.

A 'stèidheachadh an tagraidh - deuchainn

Ùraichidh sinn an còd tùsail, feuch ris a’ cheangal gu Postgresql a thoirt air falbh airson gach iarrtas. Tha a 'chiad roghainn a chleachdadh amar ceangail aig ìre tagraidh. Anns an deuchainn seo tha sinn deanamaid e Co-chruinneachadh ceangail a 'cleachdadh sql driver airson falbh:

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

if err != nil {
   return nil, err
}

Cur gu bàs, amharc, mion-sgrùdadh

Às deidh an deuchainn ath-thòiseachadh le 1000 iarrtas gach diog, tha e soilleir gu bheil ìrean latency p99 air tilleadh gu àbhaisteach le SLO de 60ms!

Dè a' chosgais a th' ann?

10000 iarrtas gach diog / 1000 iarrtas gach frithealaiche = 10 frithealaiche + 1

Feuch an dèan sinn eadhon nas fheàrr!

2000 iarrtas gach diog

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Le bhith a’ dùblachadh an luchd a’ sealltainn an aon rud, tha an graf gu h-àrd air an taobh chlì a’ sealltainn gu bheil an aplacaid a’ riaghladh 2000 iarrtas gach diog a phròiseasadh, tha p100 nas ìsle na 60ms, tha p99 a’ sàsachadh an SLO.

A thaobh cosgais:

10000 iarrtas gach diog / 2000 iarrtas gach frithealaiche = 5 frithealaiche + 1

3000 iarrtas gach diog

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

An seo faodaidh an tagradh 3000 iarrtas a phròiseasadh le latency p99 nas lugha na 60ms. Chan eilear a’ briseadh an SLO, agus thathar a’ gabhail ris a’ chosgais mar a leanas:

10000 iarrtas gach diog / gach 3000 iarrtas gach frithealaiche = 4 frithealaichean + 1 (tha an t-ùghdar air cruinneachadh, mu thuairmeas. eadar-theangair)

Feuch sinn cuairt eile de mhion-sgrùdadh.

Mion-sgrùdadh - beachd-bharail

Bidh sinn a’ cruinneachadh agus a’ taisbeanadh toraidhean dì-bhugachadh an tagraidh aig 3000 iarrtas gach diog:

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Ach tha 6% den ùine ga chosg air ceanglaichean a stèidheachadh. Tha stèidheachadh an amar air coileanadh nas fheàrr, ach chì thu fhathast gu bheil an aplacaid a’ leantainn air adhart ag obair air ceanglaichean ùra a chruthachadh ris an stòr-dàta.

Beachd-bharail: Tha ceanglaichean, a dh'aindeoin làthaireachd amar, fhathast air an leigeil sìos agus air an glanadh, agus mar sin feumaidh an tagradh an ath-shuidheachadh. Bu chòir a bhith a’ suidheachadh na h-àireimh de cheanglaichean ri meud an linne cuideachadh le latency le bhith a’ lughdachadh na h-ùine a chaitheas an tagradh a’ cruthachadh ceangal.

A 'stèidheachadh an tagraidh - deuchainn

A 'feuchainn ri stàladh MaxIdleConns co-ionann ri meud an amar (cuideachd air a mhìneachadh an seo):

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

Cur gu bàs, amharc, mion-sgrùdadh

3000 iarrtas gach diog

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Tha p99 nas lugha na 60ms le mòran nas lugha de p100!

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

Le bhith a’ sgrùdadh a’ ghraf lasair chithear nach eil an ceangal ri fhaicinn tuilleadh! Feuch an dèan sinn sgrùdadh nas mionaidiche pg(*conn).query - chan eil sinn cuideachd a’ mothachadh a’ cheangail a thathas a’ stèidheachadh an seo.

SRE: Mion-sgrùdadh Coileanaidh. Modh rèiteachaidh a’ cleachdadh frithealaiche lìn sìmplidh ann an Go

co-dhùnadh

Tha mion-sgrùdadh coileanaidh deatamach gus tuigsinn gu bheilear a’ coinneachadh ri dùilean luchd-cleachdaidh agus riatanasan neo-ghnìomhach. Faodaidh mion-sgrùdadh le bhith a’ dèanamh coimeas eadar beachdan agus dùilean luchd-cleachdaidh cuideachadh gus faighinn a-mach dè a tha iomchaidh agus dè nach eil. Tha Go a’ toirt seachad innealan cumhachdach a tha air an togail a-steach don leabharlann àbhaisteach a nì mion-sgrùdadh sìmplidh agus ruigsinneach.

Source: www.habr.com

Cuir beachd ann