SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Таҳлили кор ва танзим як воситаи пурқувват барои санҷиши мутобиқати иҷрои кор барои муштариён аст.

Таҳлили иҷро метавонад барои тафтиши монеаҳо дар барнома тавассути истифодаи равиши илмӣ барои санҷиши таҷрибаҳои танзим истифода шавад. Ин мақола равиши умумии таҳлил ва танзими корҳоро бо истифода аз веб-сервери Go ҳамчун намуна муайян мекунад.

Go махсусан дар ин ҷо хуб аст, зеро он дорои асбобҳои профилактикӣ мебошад pprof дар китобхонаи стандартӣ.

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Стратегия

Биёед барои таҳлили сохтории худ як рӯйхати ҷамъбастӣ эҷод кунем. Мо кӯшиш мекунем, ки баъзе маълумотҳоро барои қабули қарорҳо истифода барем, ба ҷои тағирот дар асоси эҳсосот ё тахминҳо. Барои ин мо ин корро мекунем:

  • Мо ҳудуди оптимизатсияро муайян мекунем (талабот);
  • Мо сарбории транзаксияро барои система ҳисоб мекунем;
  • Мо санҷиш мегузаронем (маълумот эҷод мекунем);
  • Мо мушоҳида мекунем;
  • Мо таҳлил мекунем - оё ҳама талаботҳо иҷро мешаванд?
  • Мо онро ба таври илмй ба рох мондаем, гипотеза мегузорем;
  • Мо барои санҷидани ин гипотеза таҷриба мегузаронем.

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Архитектураи оддии сервери HTTP

Барои ин мақола мо сервери хурди HTTP дар Голанг истифода хоҳем кард. Ҳама кодҳоро аз ин мақола ёфтан мумкин аст дар ин ҷо.

Барномае, ки таҳлил мешавад, сервери HTTP мебошад, ки Postgresql-ро барои ҳар як дархост пурсиш мекунад. Илова бар ин, Prometheus, node_exporter ва Grafana барои ҷамъоварӣ ва намоиш додани метрикаи барномаҳо ва системаҳо мавҷуданд.

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Барои содда кардан, мо фикр мекунем, ки барои миқёси уфуқӣ (ва содда кардани ҳисобҳо) ҳар як хидмат ва пойгоҳи додаҳо якҷоя ҷойгир карда мешаванд:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Муайян кардани ҳадафҳо

Дар ин марҳила мо дар бораи ҳадаф қарор медиҳем. Мо чиро таҳлил карданӣ ҳастем? Мо аз куҷо медонем, ки вақти ба охир расидани он расидааст? Дар ин мақола, мо тасаввур мекунем, ки мо мизоҷон дорем ва хидмати мо дар як сония 10 дархостро коркард мекунад.

В Китоби Google SRE Усулҳои интихоб ва моделсозӣ ба таври муфассал баррасӣ карда мешаванд. Биёед ҳамин тавр кунем ва моделҳоро созем:

  • Вақти таъхир: 99% дархостҳо бояд дар камтар аз 60ms анҷом дода шаванд;
  • Арзиш: Хидмат бояд ҳадди ақали пулеро, ки ба назари мо оқилона имконпазир аст, истеъмол кунад. Барои ин, мо суръати интиқолро ба ҳадди аксар мерасонем;
  • Банақшагирии иқтидор: Фаҳмидан ва ҳуҷҷатгузорӣ кардани чанд намунаи барномаро талаб мекунад, аз ҷумла функсияҳои миқёси умумӣ ва барои қонеъ кардани сарбории аввалия ва таъминот чанд намуна лозим аст. зиёдатӣ n+1.

Ниҳоят метавонад ба ғайр аз таҳлил оптимизатсияро талаб кунад, аммо интиқолро ба таври возеҳ таҳлил кардан лозим аст. Ҳангоми истифодаи раванди SRE SLO, дархости таъхир аз муштарӣ ё тиҷорате, ки соҳиби маҳсулот муаррифӣ шудааст, меояд. Ва хидмати мо ин ӯҳдадориро аз аввал бидуни танзим иҷро мекунад!

Муайян кардани муҳити санҷиш

Бо ёрии муҳити санҷиш, мо метавонем бори ченакро дар системаи худ ҷойгир кунем. Барои таҳлил маълумот дар бораи иҷрои хидмати веб тавлид мешавад.

Сарбории транзаксия

Ин муҳит истифода мебарад ВНМО то қатъ кардани суръати дархости HTTP-и фармоишӣ эҷод кунед:

$ 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

Нозирон

Сарбории транзаксионӣ дар вақти корӣ татбиқ карда мешавад. Илова ба ченакҳои барнома (шумораи дархостҳо, таъхири посух) ва системаи амалиётӣ (хотира, CPU, IOPS), профили барнома барои фаҳмидани он, ки дар куҷо мушкилот дорад ва вақти CPU чӣ гуна сарф мешавад, иҷро карда мешавад.

Профилсозӣ

Профилсозӣ як намуди ченакест, ки ба шумо имкон медиҳад бубинед, ки вақти CPU ҳангоми кор кардани барнома куҷо меравад. Он ба шумо имкон медиҳад, ки дақиқ муайян кунед, ки дар куҷо ва чӣ қадар вақти протсессор сарф мешавад:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Ин маълумотро ҳангоми таҳлил барои дарёфти фаҳмиш дар бораи вақти сарфшудаи CPU ва корҳои нолозим истифода бурдан мумкин аст. Go (pprof) метавонад бо истифода аз маҷмӯи стандартии асбобҳо профилҳо тавлид кунад ва онҳоро ҳамчун графикҳои шӯъла тасаввур кунад. Ман дар бораи истифода ва дастури танзими онҳо баъдтар дар мақола сӯҳбат хоҳам кард.

Иҷро, мушоҳида, таҳлил.

Биёед таҷриба кунем. Мо то даме ки аз спектакль каноатманд нашавем, ичро мекунем, мушохида мекунем ва тахлил мекунем. Биёед барои ба даст овардани натиҷаҳои мушоҳидаҳои аввал арзиши сарбории худсарона пастро интихоб кунем. Дар ҳар як қадами минбаъда мо сарборро бо як омили муайяни миқёс, ки бо баъзе тағирот интихоб карда мешавад, зиёд мекунем. Ҳар як озмоиши сарборӣ бо шумораи дархостҳо тасҳеҳ карда мешавад: make load-test LOAD_TEST_RATE=X.

50 дархост дар як сония

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Ба ду графики боло диққат диҳед. Дар тарафи чапи боло нишон медиҳад, ки барномаи мо дар як сония 50 дархостро коркард мекунад (он фикр мекунад) ва рости боло давомнокии ҳар як дархостро нишон медиҳад. Ҳарду параметр ба мо кӯмак мекунанд, ки бубинем ва таҳлил кунем, ки оё мо дар ҳудуди фаъолияти худ ҳастем ё не. Хати сурх дар график Таъхири дархости HTTP SLO дар 60ms нишон медиҳад. Сатр нишон медиҳад, ки мо аз вақти максималии посухи худ хеле камтарем.

Биёед ба тарафи хароҷот назар кунем:

10000 дархост дар як сония / 50 дархост барои як сервер = 200 сервер + 1

Мо ҳоло ҳам метавонем ин рақамро беҳтар кунем.

500 дархост дар як сония

Вақте ки сарборӣ ба 500 дархост дар як сония мерасад, чизҳои ҷолибтар ба амал меоянд:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Боз, дар графикаи чапи боло шумо мебинед, ки барнома сарбории муқаррариро сабт мекунад. Агар ин тавр набошад, дар сервере, ки барнома дар он кор мекунад, мушкилот вуҷуд дорад. Графикаи таъхири посух дар тарафи рости боло ҷойгир аст, ки нишон медиҳад, ки 500 дархост дар як сония боиси таъхири посухи 25-40 мс шудааст. Фоизи 99-ум то ҳол ба 60ms SLO-и дар боло интихобшуда мувофиқат мекунад.

Дар робита ба арзиши:

10000 дархост дар як сония / 500 дархост барои як сервер = 20 сервер + 1

Ҳама чизро ҳоло ҳам беҳтар кардан мумкин аст.

1000 дархост дар як сония

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Ифтитоҳи олӣ! Ин барнома нишон медиҳад, ки он дар як сония 1000 дархостро коркард кардааст, аммо маҳдудияти таъхир аз ҷониби SLO вайрон карда шудааст. Инро дар сатри p99 дар графики рости боло дидан мумкин аст. Сарфи назар аз он, ки хати p100 хеле баландтар аст, таъхирҳои воқеӣ аз ҳадди аксар 60ms баландтаранд. Биёед ба профилсозӣ машғул шавем, то бифаҳмем, ки барнома воқеан чӣ кор мекунад.

Профилсозӣ

Барои профилсозӣ, мо сарбориро ба 1000 дархост дар як сония муқаррар карда, сипас истифода мебарем pprof барои гирифтани маълумот барои фаҳмидани он ки барнома вақти CPU-ро дар куҷо сарф мекунад. Инро тавассути фаъол кардани нуқтаи ниҳоии HTTP анҷом додан мумкин аст pprof, ва сипас, дар зери сарборӣ, натиҷаҳоро бо истифода аз curl захира кунед:

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

Натиҷаҳоро метавон чунин нишон дод:

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

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

График нишон медиҳад, ки барнома вақти CPU-ро дар куҷо ва чӣ қадар сарф мекунад. Аз тавсиф аз Брендан Грег:

Меҳвари X шумораи аҳолии профили стек мебошад, ки аз рӯи алифбо мураттаб карда шудааст (ин вақт нест), меҳвари Y умқи стекро нишон медиҳад, ки аз сифр дар [боло] ҳисоб карда мешавад. Ҳар як чоркунҷа як чаҳорчӯбаи стек мебошад. Чӣ қадаре ки чаҳорчӯба васеътар бошад, ҳамон қадар он дар стеллажҳо мавҷуд аст. Он чизе, ки дар боло аст, дар CPU кор мекунад ва он чизе, ки дар зер аст, унсурҳои кӯдак мебошанд. Рангҳо одатан маънои чизе надоранд, аммо танҳо барои фарқ кардани чаҳорчӯба ба таври тасодуфӣ интихоб карда мешаванд.

Таҳлил - гипотеза

Барои танзим, мо ба кӯшиши ёфтани вақти беҳудаи CPU тамаркуз хоҳем кард. Мо манбаъхои калонтарини харочоти бефоидаро чустучу карда, онхоро бартараф мекунем. Хуб, бо назардошти он, ки профилсозӣ хеле дақиқ нишон медиҳад, ки барнома маҳз дар куҷо вақти протсессори худро сарф мекунад, ба шумо лозим меояд, ки ин корро якчанд маротиба анҷом диҳед ва инчунин ба шумо лозим меояд, ки рамзи сарчашмаи барномаро тағир диҳед, санҷишҳоро дубора иҷро кунед ва бубинед, ки иҷроиш ба ҳадаф наздик мешавад.

Пас аз тавсияҳои Брендан Грег, мо диаграммаро аз боло то поён хонем. Ҳар як сатр чаҳорчӯбаи стекро нишон медиҳад (даъвати функсия). Сатри аввал нуқтаи воридшавӣ ба барнома, волидайни ҳама зангҳои дигар аст (ба ибораи дигар, ҳамаи зангҳои дигар онро дар стеки худ доранд). Сатри навбатӣ аллакай фарқ мекунад:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Агар шумо курсорро ба болои номи функсия дар график гузоред, вақти умумии он дар стек ҳангоми ислоҳи ислоҳ нишон дода мешавад. Функсияи HTTPServe дар 65% вақт мавҷуд буд, дигар функсияҳои вақти корӣ runtime.mcall, mstart и gc, вакти бокимондаро гирифта. Далели ҷолиб: 5% вақти умумӣ барои дархостҳои DNS сарф мешавад:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Суроғаҳое, ки барнома ҷустуҷӯ мекунад, ба Postgresql тааллуқ доранд. -ро пахш кунед FindByAge:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Ҷолиб он аст, ки барнома нишон медиҳад, ки аслан се манбаи асосӣ вуҷуд доранд, ки таъхирҳоро илова мекунанд: кушодан ва бастани пайвастҳо, дархости маълумот ва пайвастшавӣ ба пойгоҳи додаҳо. График нишон медиҳад, ки дархостҳои DNS, кушодан ва бастани пайвастҳо тақрибан 13% вақти умумии иҷроро ташкил медиҳанд.

Гипотеза: Истифодаи такрории пайвастагиҳо бо истифода аз ҳавз бояд вақти дархости ягонаи HTTP-ро кам кунад ва имкон диҳад, ки интиқоли баландтар ва таъхири камтарро фароҳам орад..

Танзими барнома - таҷриба

Мо рамзи сарчашмаро навсозӣ мекунем, кӯшиш мекунем, ки пайвастшавиро ба Postgresql барои ҳар як дархост хориҷ кунем. Варианти аввал ин истифода аст ҳавзи пайвастшавӣ дар сатҳи барнома. Дар ин тачриба мо биёед онро танзим кунем пайвастшавӣ бо истифода аз драйвери sql барои рафтан:

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

if err != nil {
   return nil, err
}

Иҷро, мушоҳида, таҳлил

Пас аз аз нав оғоз кардани санҷиш бо 1000 дархост дар як сония, маълум аст, ки сатҳи таъхири p99 бо SLO 60ms ба ҳолати муқаррарӣ баргаштааст!

Нархаш чанд аст?

10000 дархост дар як сония / 1000 дархост барои як сервер = 10 сервер + 1

Биёед боз хам бехтар кор кунем!

2000 дархост дар як сония

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Дучанд кардани сарборӣ ҳамон чизро нишон медиҳад, графики чапи боло нишон медиҳад, ки барнома коркарди 2000 дархост дар як сонияро идора мекунад, p100 аз 60 мс камтар аст, p99 SLO-ро қонеъ мекунад.

Дар робита ба арзиши:

10000 дархост дар як сония / 2000 дархост барои як сервер = 5 сервер + 1

3000 дархост дар як сония

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Дар ин ҷо барнома метавонад 3000 дархостро бо таъхири p99 камтар аз 60ms коркард кунад. SLO вайрон карда намешавад ва арзиши зерин қабул карда мешавад:

10000 дархост дар як сония / барои 3000 дархост барои як сервер = 4 сервер + 1 (муаллиф ҷамъбаст кардааст, тақрибан. тарчумон)

Биёед як даври дигари таҳлилро санҷем.

Таҳлил - гипотеза

Мо натиҷаҳои ислоҳи барномаро бо 3000 дархост дар як сония ҷамъоварӣ ва намоиш медиҳем:

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Хануз 6 фоизи вакт барои мукаррар намудани алока сарф мешавад. Насб кардани ҳавз иҷроишро беҳтар кард, аммо шумо ба ҳар ҳол метавонед бубинед, ки барнома корашро дар эҷоди пайвастҳои нав ба пойгоҳи додаҳо идома медиҳад.

Гипотеза: Пайвастшавӣ, сарфи назар аз мавҷудияти ҳавз, то ҳол партофта ва тоза карда мешаванд, аз ин рӯ барнома бояд онҳоро аз нав танзим кунад. Муқаррар кардани шумораи пайвастҳои интизорӣ ба андозаи ҳавз бояд ба таъхир бо роҳи кам кардани вақти сарф кардани барнома барои эҷоди пайваст кӯмак кунад..

Танзими барнома - таҷриба

Кӯшиши насб кардан MaxIdleConns баробар ба андозаи ҳавз (инчунин тавсиф дар ин ҷо):

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

Иҷро, мушоҳида, таҳлил

3000 дархост дар як сония

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

p99 камтар аз 60ms бо p100 хеле камтар аст!

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

Тафтиши графики аланга нишон медиҳад, ки пайвастшавӣ дигар намоён нест! Биёед муфассалтар тафтиш кунем pg(*conn).query — мо низ пай намебарем, ки дар ин чо робита мукаррар карда мешавад.

SRE: Таҳлили фаъолият. Усули конфигуратсия бо истифода аз веб-сервери оддӣ дар Go

хулоса

Таҳлили фаъолият барои фаҳмидани он ки интизориҳои муштариён ва талаботи ғайрифунксионалӣ қонеъ карда мешаванд, муҳим аст. Таҳлил тавассути муқоисаи мушоҳидаҳо бо интизориҳои муштариён метавонад муайян кунад, ки чӣ қобили қабул аст ва чӣ не. Go асбобҳои пурқувватеро, ки дар китобхонаи стандартӣ сохта шудаанд, таъмин мекунад, ки таҳлилро содда ва дастрас мекунанд.

Манбаъ: will.com

Илова Эзоҳ