SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Nyocha arụmọrụ na nlegharị anya bụ ngwá ọrụ dị ike iji nyochaa nrubeisi arụmọrụ maka ndị ahịa.

Enwere ike iji nyocha arụmọrụ iji lelee ihe mgbochi na mmemme site n'itinye usoro sayensị iji nwalee nnwale nlegharị anya. Edemede a na-akọwa usoro izugbe maka nyocha na nlegharị anya arụmọrụ, na-eji Go webserver dịka ọmụmaatụ.

Go dị mma karịsịa ebe a n'ihi na o nwere ngwaọrụ profaịlụ pprof n'ọbá akwụkwọ ọkọlọtọ.

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Atụmatụ

Ka anyị mepụta ndepụta nchịkọta maka nyocha nhazi anyị. Anyị ga-agbalị iji ụfọdụ data mee mkpebi kama ime mgbanwe dabere na nghọta ma ọ bụ ịkọ nkọ. Iji mee nke a, anyị ga-eme nke a:

  • Anyị na-ekpebi oke njikarịcha (chọrọ);
  • Anyị na-agbakọ ibu azụmahịa maka usoro;
  • Anyị na-eme ule (mepụta data);
  • Anyị na-ahụ;
  • Anyị na-enyocha - a na-emezu ihe niile achọrọ?
  • Anyị na-edozi ya na nkà mmụta sayensị, mee echiche;
  • Anyị na-eme nnwale iji nwalee echiche a.

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Nhazi nkesa HTTP dị mfe

Maka akụkọ a, anyị ga-eji obere ihe nkesa HTTP na Golang. Enwere ike ịchọta koodu niile sitere na akụkọ a ebe a.

Ngwa a na-enyocha bụ sava HTTP na-eme ntuli aka Postgresql maka arịrịọ ọ bụla. Na mgbakwunye, enwere Prometheus, node_exporter na Grafana maka ịnakọta na igosipụta ngwa na metrik sistemụ.

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Iji mee ka ọ dị mfe, anyị na-atụle na maka nhazigharị kwụ ọtọ (na ịgbakọ ọnụ) ọrụ ọ bụla na nchekwa data na-ejikọta ọnụ:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Na-akọwapụta ebumnuche

Na nzọụkwụ a, anyị na-ekpebi ihe mgbaru ọsọ. Kedu ihe anyị na-agbalị ịtụle? Olee otú anyị si mara mgbe oge na-agwụ agwụ? N'isiokwu a, anyị ga-eche na anyị nwere ndị ahịa yana ọrụ anyị ga-edozi arịrịọ 10 kwa nkeji.

В Akwụkwọ Google SRE A na-atụle usoro nhọrọ na ịme ihe n'ụzọ zuru ezu. Ka anyị mee otu ihe ahụ wee wuo ụdị:

  • Latency: 99% nke arịrịọ kwesịrị imecha na ihe na-erughị 60ms;
  • Ọnụ: Ọrụ ahụ kwesịrị iri obere ego nke anyị chere na ọ ga-ekwe omume. Iji mee nke a, anyị na-ebuli throughput;
  • Atụmatụ ikike: chọrọ nghọta na idekọ ugboro ole nke ngwa a ga-achọ ka ọ na-agba ọsọ, gụnyere ọrụ nlegharị anya n'ozuzu ya, yana ugboro ole ka a ga-achọ iji mezuo ibu mbụ na ihe ndị a chọrọ. redundancy n+1.

Latency nwere ike ịchọ njikarịcha na mgbakwunye na nyocha, mana ọ dị mkpa ka enyocha ya nke ọma. Mgbe ị na-eji usoro SRE SLO, arịrịọ igbu oge na-abịa site n'aka onye ahịa ma ọ bụ azụmaahịa, onye nwe ngwaahịa nọchiri anya ya. Na ọrụ anyị ga-arụ ọrụ a site na mmalite na-enweghị ntọala ọ bụla!

Ịtọlite ​​​​gburugburu ule

Site n'enyemaka nke gburugburu ule, anyị ga-enwe ike itinye ibu dosed na sistemụ anyị. Maka nyocha, a ga-emepụta data na arụmọrụ nke ọrụ weebụ.

Ibu azụmahịa

Nke a gburugburu ebe obibi na-eji Vegeta iji mepụta ọnụego arịrịọ HTTP omenala ruo mgbe akwụsịre:

$ 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

Idebe

A ga-etinye ibu azụmahịa n'oge ọsọ ọsọ. Na mgbakwunye na ngwa (ọnụọgụ arịrịọ, latency nzaghachi) na sistemụ arụmọrụ (ncheta, CPU, IOPS), profaịlụ ngwa ga-agba ọsọ iji ghọta ebe o nwere nsogbu yana otu esi eri oge CPU.

Profiling

Profiling bụ ụdị nlele na-enye gị ohere ịhụ ebe oge CPU na-aga mgbe ngwa na-agba ọsọ. Ọ na-enye gị ohere ikpebi kpọmkwem ebe na oge processor na-eji:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Enwere ike iji data a n'oge nyocha iji nweta nghọta n'ime oge CPU efu na ọrụ na-adịghị mkpa a na-arụ. Go (pprof) nwere ike iwepụta profaịlụ wee were anya ya dị ka eserese ire ọkụ na-eji usoro ọkọlọtọ. Aga m ekwu maka ojiji ha na ntuziaka ntọlite ​​​​ma emechaa na edemede.

Mmegbu, nleba anya, nyocha.

Ka anyị mee nnwale. Anyị ga-eme, lelee ma nyochaa ruo mgbe anyị nwere afọ ojuju na arụmọrụ. Ka anyị họrọ ọnụ ahịa dị ala na-enweghị ike itinye ya n'ọrụ iji nweta nsonaazụ nke nlele mbụ. Na nzọụkwụ ọ bụla sochirinụ, anyị ga-ebuli ibu ahụ na ụfọdụ ihe na-eme ka ọ dị elu, nke a na-ahọrọ na mgbanwe ụfọdụ. A na-eme ọsọ nnwale ọ bụla site na iji ọnụọgụ arịrịọ edoziri: make load-test LOAD_TEST_RATE=X.

Arịrịọ 50 kwa nkeji

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Lezienụ anya na eserese abụọ kachasị elu. N'elu aka ekpe na-egosi na ngwa anyị na-ahazi arịrịọ 50 kwa nkeji (ọ na-eche) na elu aka nri na-egosi ogologo oge nke arịrịọ ọ bụla. Akụkụ abụọ a na-enyere anyị aka ileba anya na nyochaa ma anyị nọ n'ime oke arụmọrụ anyị ma ọ bụ na anyị adịghị. Ahịrị uhie na eserese ahụ Arịrịọ arịrịọ HTTP na-egosi SLO na 60ms. Ahịrị na-egosi na anyị nọ n'okpuru oge nzaghachi kachasị.

Ka anyị leba anya n'akụkụ ọnụ ahịa:

10000 arịrịọ kwa sekọnd / 50 arịrịọ kwa nkesa = 200 sava + 1

Anyị ka nwere ike imeziwanye ọnụ ọgụgụ a.

Arịrịọ 500 kwa nkeji

Ihe ndị ọzọ na-atọ ụtọ na-amalite ime mgbe ibu ahụ ruru arịrịọ 500 kwa nkeji:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Ọzọ, na elu aka ekpe graph ị nwere ike ịhụ na ngwa na-dekọ nkịtị ibu. Ọ bụrụ na nke a abụghị ikpe, enwere nsogbu na sava nke ngwa na-arụ ọrụ. Eserese nzaghachi nzaghachi dị n'elu aka nri, na-egosi na arịrịọ 500 kwa sekọnd butere nkwụghachi nzaghachi nke 25-40ms. Pasent 99 ka dabara nke ọma na 60ms SLO ahọpụtara n'elu.

N'ihe gbasara ọnụ ahịa:

10000 arịrịọ kwa sekọnd / 500 arịrịọ kwa nkesa = 20 sava + 1

Ihe niile ka nwere ike imeziwanye.

Arịrịọ 1000 kwa nkeji

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Nnukwu mmalite! Ngwa a na-egosi na ọ na-ahazi arịrịọ 1000 kwa sekọnd, mana SLO mebiri oke latency. Enwere ike ịhụ nke a na ahịrị p99 na eserese dị n'elu aka nri. N'agbanyeghị eziokwu na p100 ahịrị dị nnọọ elu, n'ezie igbu oge dị elu karịa kacha nke 60ms. Ka anyị banye n'ime profaịlụ iji chọpụta ihe ngwa ahụ na-eme n'ezie.

Profiling

Maka profaịlụ, anyị na-edobe ibu ahụ na arịrịọ 1000 kwa sekọnd, wee jiri ya pprof iji weghara data iji chọpụta ebe ngwa na-eji oge CPU. Enwere ike ime nke a site na ịgbalite ebe njedebe HTTP pprof, na mgbe ahụ, n'okpuru ibu, chekwaa nsonaazụ site na iji curl:

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

Enwere ike igosipụta nsonaazụ ya dị ka nke a:

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

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Eserese na-egosi ebe na ole ngwa ngwa na-eji oge CPU. Site na nkọwa si Brendan Gregg:

X axis bụ ọnụ ọgụgụ profaịlụ stack, ahazi ya na mkpụrụedemede (nke a abụghị oge), axis Y na-egosi omimi nke ngwugwu ahụ, na-agụta site na efu na [n'elu]. Nke ọ bụla rektangulu bụ a tojupụtara etiti. Ka obosara etiti ahụ, ka ọ na-adịkarị na nchịkọta. Ihe dị n'elu na-agba ọsọ na CPU, na ihe dị n'okpuru bụ ihe ụmụaka. Agba ndị ahụ anaghị apụtakarị ihe ọ bụla, mana a na-ahọrọ ya na enweghị usoro iji mata ọdịiche nke okpokolo agba.

Analysis - echiche

Maka nlegharị anya, anyị ga-elekwasị anya n'ịgbalị ịchọta oge CPU furu efu. Anyị ga-achọ isi mmalite nke mmefu na-abaghị uru ma wepụ ha. Ọfọn, nyere na profaịlụ na-ekpughe nnọọ n'ụzọ ziri ezi ebe kpọmkwem ngwa na-eji ya processor oge, ị nwere ike na-eme ya ọtụtụ ugboro, na ị ga-mkpa ịgbanwe ngwa isi koodu, megharịa ule na-ahụ na arụmọrụ na-eru nso lekwasịrị.

N'ịgbaso ndụmọdụ Brendan Gregg, anyị ga-agụ chaatị ahụ site n'elu ruo na ala. Ahịrị ọ bụla na-egosiputa etiti tojupụtara (oku ọrụ). Ahịrị nke mbụ bụ ebe ntinye n'ime mmemme ahụ, nne na nna nke oku ndị ọzọ niile (na okwu ndị ọzọ, oku ndị ọzọ niile ga-enwe ya na ngwugwu ha). Ahịrị na-esote adịlarị iche:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Ọ bụrụ na ị na-efegharị cursor n'elu aha ọrụ dị na eserese ahụ, a ga-egosipụta oge niile ọ nọ na nchịkọta n'oge nbipu. Ọrụ HTTPServe dị 65% nke oge ahụ, ọrụ ndị ọzọ na-agba ọsọ runtime.mcall, mstart и gc, were oge fọdụrụnụ. Eziokwu na-atọ ụtọ: 5% nke ngụkọta oge na-eji na ajụjụ DNS:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Adreesị ndị mmemme a na-achọ bụ nke Postgresql. Pịa na FindByAge:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

N'ụzọ na-akpali mmasị, mmemme ahụ na-egosi na, na ụkpụrụ, e nwere isi ihe atọ na-agbakwụnye oge: imeghe na imechi njikọ, ịrịọ data, na ijikọ na nchekwa data. Eserese ahụ na-egosi na arịrịọ DNS, mmeghe na mmechi njikọ na-ewe ihe dị ka 13% nke ngụkọta oge igbu.

Echiche: Ijikọ njikọ ijikọ ọnụ kwesịrị ibelata oge nke otu HTTP arịrịọ, na-enye ohere mmepụta dị elu na obere latency..

Ịtọlite ​​​​ngwa - nnwale

Anyị na-emelite koodu isi mmalite, gbalịa wepụ njikọ na Postgresql maka arịrịọ ọ bụla. Nhọrọ nke mbụ bụ iji njikọ ọdọ mmiri na ọkwa ngwa. N'ime nnwale a anyị ka anyị guzobe ya njikọ njikọ iji sql ọkwọ ụgbọ ala maka aga:

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

if err != nil {
   return nil, err
}

Mmegbu, nleba anya, nyocha

Ka ịmalitegharịa ule ahụ site na arịrịọ 1000 kwa nkeji, o doro anya na ọkwa latency p99 ejirila SLO nke 60ms laghachi na nkịtị!

Gịnị bụ ọnụ ahịa?

10000 arịrịọ kwa sekọnd / 1000 arịrịọ kwa nkesa = 10 sava + 1

Ka anyị mee ya nke ọma!

Arịrịọ 2000 kwa nkeji

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Ugboro abụọ ibu na-egosi otu ihe ahụ, eserese aka ekpe nke elu na-egosi na ngwa ahụ na-ejikwa 2000 arịrịọ kwa nkeji, p100 dị ala karịa 60ms, p99 na-eju SLO.

N'ihe gbasara ọnụ ahịa:

10000 arịrịọ kwa sekọnd / 2000 arịrịọ kwa nkesa = 5 sava + 1

Arịrịọ 3000 kwa nkeji

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Ebe a ngwa nwere ike hazie arịrịọ 3000 na p99 latency nke na-erughị 60ms. A naghị emebi SLO, a nabatakwa ọnụ ahịa ya dị ka ndị a:

10000 arịrịọ kwa sekọnd / kwa 3000 arịrịọ kwa nkesa = 4 sava + 1 (Onye edemede ahụ chịkọtara, ihe ruru. onye ntụgharị okwu)

Ka anyị nwalee nyocha nyocha ọzọ.

Analysis - echiche

Anyị na-anakọta ma gosipụta nsonaazụ nbibi ngwa na arịrịọ 3000 kwa nkeji:

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

A na-etinyekwa 6% nke oge iji guzobe njikọ. Ịmepụta ọdọ mmiri emeela ka arụmọrụ dịkwuo mma, ma ị ka nwere ike ịhụ na ngwa ahụ na-aga n'ihu na-arụ ọrụ na ịmepụta njikọ ọhụrụ na nchekwa data.

Echiche: Njikọ, n'agbanyeghị ọnụnọ nke ọdọ mmiri, ka na-adaba ma kpochaa ya, ya mere ngwa ahụ kwesịrị ịtọgharịa ha. Ịtọlite ​​​​ọnụ ọgụgụ nke njikọ echere na nha ọdọ mmiri kwesịrị inye aka na nkwụsịtụ site na ibelata oge ngwa ahụ na-eji mepụta njikọ..

Ịtọlite ​​​​ngwa - nnwale

Na-agbalị ịwụnye MaxIdleConns hà nhata ọdọ mmiri (a kọwakwara ya ebe a):

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

Mmegbu, nleba anya, nyocha

Arịrịọ 3000 kwa nkeji

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

p99 erughị 60ms na obere p100!

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

Ịlele eserese ire ọkụ na-egosi na njikọ ahụ adịkwaghị anya! Ka anyị lelee n'ụzọ zuru ezu pg(*conn).query - anyị ahụghịkwa njikọ na-eguzobe ebe a.

SRE: Nyocha arụmọrụ. Mepụta usoro site na iji sava weebụ dị mfe na Go

nkwubi

Nyocha arụmọrụ dị oke mkpa iji ghọta na a na-emezu atụmanya ndị ahịa na ihe ndị na-adịghị arụ ọrụ. Nyocha site n'iji nleba anya atụnyere atụmanya ndị ahịa nwere ike inye aka chọpụta ihe a na-anabata na nke na-adịghị. Gaa na-enye ngwá ọrụ dị ike arụnyere n'ime ọbá akwụkwọ ọkọlọtọ na-eme ka nyocha dị mfe ma dị mfe.

isi: www.habr.com

Tinye a comment