SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Tlhahlobo ea ts'ebetso le tokiso ke sesebelisoa se matla sa ho netefatsa boitlamo ba ts'ebetso ho bareki.

Tlhahlobo ea ts'ebetso e ka sebelisoa ho hlahloba litšitiso lenaneong ka ho sebelisa mokhoa oa mahlale oa liteko tsa tokiso ea liteko. Sengoliloeng sena se hlalosa mokhoa o akaretsang oa tlhahlobo ea ts'ebetso le tokiso, o sebelisa Go webserver joalo ka mohlala.

Go e ntle haholo mona hobane e na le lisebelisoa tsa ho etsa profil pprof laebraring e tloaelehileng.

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Leqheka

Ha re theheng lethathamo la kakaretso bakeng sa tlhahlobo ea rona ea sebopeho. Re tla leka ho sebelisa lintlha tse ling ho etsa liqeto ho e-na le ho etsa liphetoho tse thehiloeng ho intuition kapa khakanyo. Ho etsa sena re tla etsa sena:

  • Re khetha meeli ea ho ntlafatsa (litlhoko);
  • Re bala mojaro oa transaction bakeng sa sistimi;
  • Re etsa tlhahlobo (etsa data);
  • Re ela hloko;
  • Re sekaseka - na litlhoko tsohle li fihletsoe?
  • Re e thehile ka mahlale, re etsa khopolo-taba;
  • Re etsa liteko ho leka khopolo-taba ena.

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Mehaho e bonolo ea HTTP Server

Bakeng sa sengoloa sena re tla sebelisa seva e nyane ea HTTP ho Golang. Khoutu eohle e tsoang ho sengoloa sena e ka fumanoa mona.

Kopo e ntseng e hlahlojoa ke seva sa HTTP se khethang Postgresql bakeng sa kopo e 'ngoe le e 'ngoe. Ho feta moo, ho na le Prometheus, node_exporter le Grafana bakeng sa ho bokella le ho bonts'a lits'ebetso le metrics ea sistimi.

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Ho nolofatsa, re nka hore bakeng sa sekala se otlolohileng (le ho nolofatsa lipalo) tšebeletso e 'ngoe le e 'ngoe le database li kentsoe hammoho:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Ho hlalosa lipakane

Ka mohato ona, re etsa qeto ka sepheo. Re leka ho sekaseka eng? Re tseba joang hore nako ea ho fela ke nako? Sehloohong sena, re tla nahana hore re na le bareki le hore tšebeletso ea rona e tla sebetsana le likopo tse 10 ka motsotsoana.

В Buka ea Google SRE Mekhoa ea ho khetha le ea mohlala e tšohloa ka botlalo. Ha re etseng joalo 'me re hahe mehlala:

  • Latency: 99% ea likopo li lokela ho phethoa ka nako e ka tlase ho 60ms;
  • Litšenyehelo: Tšebeletso e lokela ho sebelisa chelete e fokolang eo re nahanang hore e ka khoneha. Ho etsa sena, re eketsa tlhahiso;
  • Thero ea bokhoni: E hloka kutloisiso le ho ngola hore na ke mehlala e mekae ea kopo e tla hloka ho sebetsa, ho kenyelletsa le ts'ebetso ea kakaretso, le hore na ho tla hlokahala maemo a makae ho fihlela litlhoko tsa pele tsa mojaro le phano. tlhokeho n+1.

Latency e ka 'na ea hloka ho ntlafatsoa ntle le tlhahlobo, empa ka ho hlaka ho tlameha ho hlahlojoa. Ha o sebelisa ts'ebetso ea SRE SLO, kopo ea ho lieha e tsoa ho moreki kapa khoebo, e emeloang ke mong'a sehlahisoa. 'Me tšebeletso ea rona e tla phethahatsa tlamo ena ho tloha qalong ntle le litlhophiso leha e le life!

Ho theha tikoloho ea liteko

Ka thuso ea tikoloho ea teko, re tla khona ho beha mojaro o lekantsoeng tsamaisong ea rona. Bakeng sa tlhahlobo, lintlha tse mabapi le ts'ebetso ea ts'ebeletso ea webo li tla hlahisoa.

Mojaro oa transaction

Tikoloho ena e sebelisa Vegeta ho theha sekhahla sa kopo ea HTTP e tloaelehileng ho fihlela e emisa:

$ 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

Ho shebella

Phetoho e tla sebelisoa nakong ea ts'ebetso. Ntle le ts'ebeliso (palo ea likopo, latency ea karabelo) le metrics ea sistimi ea ts'ebetso (memory, CPU, IOPS), profiling ea kopo e tla tsamaisoa ho utloisisa moo e nang le mathata le hore na nako ea CPU e sebelisoa joang.

Profileing

Profil ke mofuta oa litekanyo tse u lumellang ho bona hore na nako ea CPU e ea kae ha sesebelisoa se ntse se sebetsa. E u lumella ho tseba hantle hore na processor e sebelisoa nako e kae le hore na e sebelisoa hokae:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Lintlha tsena li ka sebelisoa nakong ea tlhahlobo ho fumana temohisiso mabapi le nako e senyehileng ea CPU le mosebetsi o sa hlokahaleng o etsoang. Go (pprof) e ka hlahisa litlaleho le ho li bona ka mahlo a kelello e le li-graph tsa lelakabe li sebelisa lisebelisoa tse tloaelehileng. Ke tla bua ka tšebeliso ea bona le tataiso ea ho seta hamorao sehloohong.

Phethahatso, tebello, tlhahlobo.

Ha re etseng teko. Re tla etsa, re shebe le ho sekaseka ho fihlela re khotsofetse ke ts'ebetso. A re khetheng boleng bo tlase ba moroalo ho bo sebelisa ho fumana liphetho tsa litebello tsa pele. Mohato o mong le o mong o latelang re tla eketsa mojaro ka ntlha e itseng ea sekhahla e khethiloeng ka ho fapana ho itseng. Mosebetsi o mong le o mong oa tlhahlobo ea mojaro o etsoa ka palo ea likopo tse fetotsoeng: make load-test LOAD_TEST_RATE=X.

Likopo tse 50 motsotsoana

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Ela hloko li-graph tse peli tse holimo. E kaholimo ho le letšehali e bonts'a hore kopo ea rona e sebetsa likopo tse 50 motsotsoana (e nahana) 'me ka ho le letona ho bonts'a nako ea kopo ka' ngoe. Mekhahlelo ka bobeli e re thusa ho sheba le ho sekaseka hore na re ka har'a meeli ea ts'ebetso ea rona kapa che. Mola o mofubelu holim'a kerafo HTTP Kopo Latency e bonts'a SLO ka 60ms. Mohala o bontša hore re ka tlase ho nako ea rona e phahameng ea ho arabela.

Ha re shebeng lehlakore la litšenyehelo:

Likopo tse 10000 motsotsoana / likopo tse 50 ka seva = li-server tse 200 + 1

Re ntse re ka ntlafatsa palo ena.

Likopo tse 500 motsotsoana

Lintho tse ling tse khahlisang li qala ho etsahala ha mojaro o fihla ho likopo tse 500 motsotsoana:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Hape, ho graph e kaholimo ho le letšehali u ka bona hore sesebelisoa se rekota mojaro o tloaelehileng. Haeba ho se joalo, ho na le bothata ho seva moo sesebelisoa se sebetsang ho sona. graph ea latency ea karabo e kaholimo ho le letona, e bonts'a hore likopo tse 500 motsotsoana li bakile tieho ea karabo ea 25-40ms. 99th percentile e ntse e lumellana hantle le 60ms SLO e khethiloeng ka holimo.

Ho latela litšenyehelo:

Likopo tse 10000 motsotsoana / likopo tse 500 ka seva = li-server tse 20 + 1

Lintho tsohle li ntse li ka ntlafatsoa.

Likopo tse 1000 motsotsoana

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Qalo e kholo! Kopo e bontša hore e sebetsane le likōpo tsa 1000 ka motsotsoana, empa moeli oa latency o ne o tlōtsoe ke SLO. Sena se ka bonoa moleng oa p99 ho graph e kaholimo ho le letona. Ho sa tsotellehe hore mohala oa p100 o phahame haholo, tieho ea sebele e phahame ho feta boholo ba 60ms. Ha re kenelle ho profiling ho fumana hore na ts'ebeliso e hlile e etsa eng.

Profileing

Bakeng sa profiling, re beha mojaro ho likopo tse 1000 motsotsoana, ebe o sebelisa pprof ho hapa data ho fumana hore na kopo e qeta nako ea CPU hokae. Sena se ka etsoa ka ho kenya tšebetsong ntlha ea ho qetela ea HTTP pprof, 'me ka mor'a moroalo, boloka liphetho u sebelisa curl:

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

Liphetho li ka hlahisoa ka tsela ena:

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

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Kerafo e bonts'a hore na ts'ebeliso e sebelisa nako ea CPU hokae le bokae. Ho tsoa ho tlhaloso e tsoang ho Brendan Gregg:

X axis ke palo ea profil ea stack, e hlophisitsoeng ka alfabeta (ena ha se nako), axis ea Y e bonts'a botebo ba stack, ho bala ho tloha ho zero ho ea [holimo]. Rectangle ka 'ngoe ke foreime ea stack. Ha foreimi e pharaletse, hangata e teng ka har'a mekotla. Se ka holimo se sebetsa ho CPU, 'me se ka tlase ke likarolo tsa bana. Mebala hangata ha e bolele letho, empa e khethoa feela ka tšohanyetso ho khetholla liforeimi.

Analysis - khopolo-taba

Bakeng sa tokiso, re tla shebana le ho leka ho fumana nako ea CPU e senyehileng. Re tla batla mehloli e meholo ka ho fetisisa ea ho sebelisa chelete e se nang thuso le ho e tlosa. Hantle, kaha profiling e senola hantle hore na kopo e sebelisa nako ea eona ea processor, u ka 'na ua tlameha ho e etsa ka makhetlo a' maloa, 'me u tla hloka ho fetola khoutu ea mohloli oa kopo, ho etsa liteko hape le ho bona hore ts'ebetso e atamela sepheo.

Ho latela likhothaletso tsa Brendan Gregg, re tla bala chate ho tloha holimo ho ea tlase. Mohala o mong le o mong o bonts'a foreimi ea stack (call ea tšebetso). Mohala oa pele ke sebaka sa ho kena lenaneong, motsoali oa li-call tse ling kaofela (ka mantsoe a mang, mehala e meng kaofela e tla ba le eona ka har'a stack ea bona). Mola o latelang o se o fapane:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Haeba u sututsa khesa holim'a lebitso la tšebetso ho kerafo, kakaretso ea nako eo e neng e le ka har'a stack nakong ea ho lokisa bothata e tla hlahisoa. Ts'ebetso ea HTTPServe e ne e le teng 65% ea nako, mesebetsi e meng ea nako ea ho sebetsa runtime.mcall, mstart и gc, e ile ea nka nako e setseng. Taba e monate: 5% ea nako eohle e sebelisoa lipotsong tsa DNS:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Liaterese tseo lenaneo le li batlang ke tsa Postgresql. Tobetsa ho FindByAge:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Hoa thahasellisa hore lenaneo le bontša hore, ha e le hantle, ho na le mehloli e meraro e ka sehloohong e eketsang ho lieha: ho bula le ho koala likhokahano, ho kopa data, le ho hokahanya le database. graph e bonts'a hore likopo tsa DNS, likhokahano tsa ho bula le ho koala li nka hoo e ka bang 13% ea nako eohle ea ts'ebetso.

Khopolo-taba: Ho sebelisa likhokahano hape ka ho kopanya ho lokela ho fokotsa nako ea kopo e le 'ngoe ea HTTP, ho lumella ho feta le ho lieha ho tlase..

Ho theha ts'ebeliso - teko

Re ntlafatsa khoutu ea mohloli, re leka ho tlosa khokahano ho Postgresql bakeng sa kopo ka 'ngoe. Khetho ea pele ke ho e sebelisa letamo la kgokelo boemong ba kopo. Tekong ena re ha re e hlophiseng ho kopanya ho sebelisa sql driver bakeng sa ho ea:

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

if err != nil {
   return nil, err
}

Phethahatso, tebello, tlhahlobo

Kamora ho qala tlhahlobo hape ka likopo tsa 1000 motsotsoana, ho hlakile hore maemo a latency a p99 a khutletse ho tloaelehileng ka SLO ea 60ms!

Ke bokae?

Likopo tse 10000 motsotsoana / likopo tse 1000 ka seva = li-server tse 10 + 1

Ha re e etseng hamolemo le ho feta!

Likopo tse 2000 motsotsoana

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Ho habeli mojaro o bonts'a ntho e ts'oanang, graph e kaholimo e ka letsohong le letšehali e bonts'a hore kopo e khona ho sebetsana le likopo tsa 2000 motsotsoana, p100 e tlase ho 60ms, p99 e khotsofatsa SLO.

Ho latela litšenyehelo:

Likopo tse 10000 motsotsoana / likopo tse 2000 ka seva = li-server tse 5 + 1

Likopo tse 3000 motsotsoana

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Mona kopo e ka sebetsana le likopo tse 3000 ka p99 latency e ka tlase ho 60ms. SLO ha e tlotsoe, 'me litšenyehelo li amoheloa ka tsela e latelang:

Likopo tse 10000 motsotsoana / likopo tse 3000 ka seva = li-server tse 4 + 1 (mongoli o ile a bokella, hoo e ka bang. mofetoleli)

Ha re leke potoloho e 'ngoe ea tlhahlobo.

Analysis - khopolo-taba

Re bokella le ho hlahisa liphetho tsa ho lokisa ts'ebeliso ka likopo tse 3000 motsotsoana:

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Leha ho le joalo 6% ea nako e sebelisoa ho theha likhokahano. Ho theha letamo ho ntlafalitse ts'ebetso, empa o ntse o ka bona hore ts'ebeliso e ntse e tsoela pele ho sebetsa ho theha likhokahano tse ncha ho database.

Khopolo-taba: Lihokelo, ho sa tsotellehe ho ba teng ha letamo, li ntse li theoha le ho hloekisoa, kahoo kopo e hloka ho li tsosolosa. Ho beha palo ea likhokahano tse emetseng ho boholo ba letamo ho lokela ho thusa ka latency ka ho fokotsa nako eo sesebelisoa se e qetang ho theha khokahano..

Ho theha ts'ebeliso - teko

E leka ho kenya MaxIdleConns e lekana le boholo ba letamo (hape le hlalositsoe mona):

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

Phethahatso, tebello, tlhahlobo

Likopo tse 3000 motsotsoana

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

p99 e ka tlase ho 60ms ka p100 e tlase haholo!

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

Ho hlahloba graph ea lelakabe ho bontša hore khokahano ha e sa bonahala! Ha re hlahlobeng ka botlalo pg(*conn).query - hape ha re hlokomele hore khokahano e thehiloe mona.

SRE: Tlhahlobo ea Ts'ebetso. Mokhoa oa ho hlophisa o sebelisa sebatli se bonolo sa webo ho Go

fihlela qeto e

Tlhahlobo ea ts'ebetso e bohlokoa ho utloisisa hore litebello tsa bareki le litlhoko tse sa sebetseng lia fihlelleha. Tlhahlobo ka ho bapisa litebello le litebello tsa bareki e ka thusa ho fumana hore na ke eng e amohelehang le e sa amoheleheng. Go e fana ka lisebelisoa tse matla tse hahelletsoeng ka har'a laeborari e tloaelehileng tse etsang hore tlhahlobo e be bonolo hape e fumanehe.

Source: www.habr.com

Eketsa ka tlhaloso