SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Analysis euismod et tuning potens est instrumentum ad comprobandum obsequium pro clientibus perficiendis.

Facis analysis adhiberi potest ad reprimendam bottlenecks in programmate applicando accessum scientificum ad experimenta experiendi. Articulus hic definit generalem accessum ad analysin perficiendam et tuning, adhibito Go webservatori pro exemplo.

Ite hic imprimis bonum est quod instrumenta prolificatione habet pprof in bibliotheca vexillum.

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

belli

Summarium indicemus pro analysi structurali nostra. Conabimur aliqua notitia uti ad decisiones faciendas pro mutationibus faciendis secundum intuitum vel coniecturam. Hoc facere volumus;

  • Determinamus ipsum limites (requisita);
  • Rei onus pro systemate computamus;
  • Experimentum facimus (notitia creare);
  • Servamus;
  • Nos resolvere - omnes requisita convenerunt?
  • Nos scienter statuimus, hypothesin facimus;
  • Experimentum ad hanc hypothesim probandam.

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Simplex HTTP Servo Architecture

Ad hoc articulum utemur parva servo HTTP in Golang. Totum codicem ex hoc articulo inveniri potest hic.

Applicatio cum analysi est HTTP ministrantis quae suffragia Postgresql pro unaquaque petitione. Accedit Prometheus, nodi_exportator et Grafana ad applicationem ac rationem metricam colligendi et ostentandi.

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Ad simpliciorem reddendam censemus ad scalas horizontales (et calculos simplices) unumquodque servitium et datorum simul explicari;

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Definiens proposita

In hoc passu, propositum decernimus. Quid resolvere conamur? Quomodo scimus quando ad finem tempus est? In hoc articulo, nos clientes habere existimabimus et ministerium nostrum 10 petitionum secundorum procedere.

Π’ Google SRE Book Modi eligendi et modelandi singillatim discutiuntur. Idem faciamus et exempla faciamus:

  • Latency: 99% petitionum minus quam 60morum compleantur;
  • Sumptus: Ministerium debet minimum pecuniae consumere quam rationabiliter fieri posse putamus. Ad hoc maximize throughput;
  • Capacitas consiliorum: Intellectus et documentum requirit quot instantiae applicationis currere debebunt, inclusa altiore scalae functionis, quotque instantiae necessariae sunt ut ad primum onus et commeatus exigantur. addita n + I ".

Latentia optimizationem praeter analysim requirere potest, sed per put clare debet enucleari. Cum processu SRE SLO utens, mora petitio ex emptore vel negotio venit, quod dominus e producto repraesentat. Ac nostrum officium hanc obligationem inde ab initio sine ullis occasus adimplebit!

Test erigens amet

Ope ambitus experimenti, mensuratum onus in nostro systemate collocare poterimus. Pro analysi, notitia in persecutione muneris interreti generabitur.

Onus transactionis

Hoc environment usus vegeta HTTP petitio rate usque ad constitit consuetudo creare:

$ 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

vigilabo

Transactionale onus applicabitur in runtime. Praeter applicationes metricas (numerum petitionum, latenciarum responsionum) et systema operandi (memoria, CPU, IOPS), profiling applicationis ad intellegendum ubi difficultates habet, tum quomodo tempus CPU consumitur.

Profiling

Profiling est genus mensurae quae te videre sinit ubi tempus CPU eat cum application currit. Permittit te exacte determinare ubi et quantum processus temporis absumitur;

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Haec notitia in analysi adhiberi potest ut perspiciantur in tempore CPU marcido et in opere faciendo supervacuo. Vade (pprof) profile generare et eas visualizare ut graphs flammae utens norma instrumentorum. De eorum usu et rectore in articulo postea dicam.

Supplicium, observatio, examinatio.

Experimentum faciamus. Faciemus, observabimus et resolvemus donec contenti simus. Ad valorem leve onus arbitratu eligamus eam applicandi ad eventus primae observationum obtinendas. In unoquoque gradu subsequente, onere quadam scalae factoris augebimus, electo aliqua variatione. Uniuscuiusque onus probatio cursus conficitur, numerus petitionum adaequatus est; make load-test LOAD_TEST_RATE=X.

Petitiones per L secundo

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Attende ad summum duo graphs. Suprema sinistra ostendit nostrum applicationes processus 50 petitiones per secundam (ut cogitat) et supremam ius ostendit durationem cuiusque petitionis. Ambo parametri adiuvant nos quaerere et resolvere utrum intra fines nostros perficiendi sumus necne. In lacinia purus linea rubra HTTP Request Latency ostendit SLO ad 60ms. Linea ostendit nos bene infra tempus nostrum maximum responsum.

Intueamur ad latus sumptus:

10000 petitiones per secundam / 50 petitiones per servo = 200 servientes + 1

Hanc figuram adhuc emendare possumus.

Petitiones per L secundo

Plus interesting res incipit fieri cum onus ad 500 petitiones per secundam accipit:

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Rursum in grapho sinistro summo videre potes applicationis onus normali memoratu esse. Si hoc non fit, quaestio de servo in quo applicatio currit. Responsio graphi latency in summo dextro sita est, ostendens 500 petitiones secundas consecutas in responsione mora 25-40ms. 99th centuplum adhuc in 60ms SLO supra electum belle convenit.

Sumptus in terms:

10000 petitiones per secundam / 500 petitiones per servo = 20 servientes + 1

Omnia adhuc melius possunt.

Petitiones per L secundo

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Lorem magna! Applicatio ostendit petitiones 1000 secundo discursum esse, sed modus latency per SLO violatum est. Hoc videri potest in linea p99 in graphi capitis dextri. Quamvis p100 linea multo superior sit, ipsae morae sunt altiores quam maximum 60morum. Sit intendere in profiling ut quid applicationis actu facit.

Profiling

Ad profiling, onere 1000 petitionibus per secundam posuimus, deinde utimur pprof ut notitias capias ut invenias ubi applicationis tempus expendit CPU. Hoc potest fieri per activum HTTP endpoint pprofet deinde sub onere, nisi utens Crispum;

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

Eventus sic exponi possunt:

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

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Aliquam lacinia purus ostendit ubi et quantum applicationis tempus expendit CPU. Ex descriptione Brendanus Gregg:

Axis X est acervus incolarum profile, alphabetice digestus (hoc tempus non est), axis Y ostendit altitudinem acervi, a nulla in [top] computando. Utrumque rectangulum est ACERVUS pectora. Quo latior artus, eo frequentius inest acervis. Quid sursum est in CPU decurrit, et quid infra pueri elementa sunt. Colores plerumque nihil significant, sed temere simpliciter electi ad tabulas differentias.

Analysis - hypothesis

For tuning, dabimus operam ut CPU tempus perditum inveniat. Maximas fontes inutilium expendendorum quaeremus ac removebimus. Bene, dato quod profiling accuratissime patefacit ubi exacte applicatio processus temporis expendit, pluries hoc facere debebis, et etiam necesse est ut fons applicationis codicem mutet, rerum probationes ac perficiendi aditus videas. scopo.

Brendan Gregg commendationes sequentes, chartulam a summo ad imum legemus. Quaeque linea ostendit ACERVUS artus (munus vocant). Prima linea est aculeus in programmatis, parens omnium aliorum vocat (id est, omnes alias vocat in acervo suo). Sequentis versus iam diversus est;

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Si cursorem nomine functionis in grapho oberret, totum tempus in ACERVO in debugging ostendetur. Munus HTTPServe erat 65% temporis, alia munera runtime runtime.mcall, mstart ΠΈ gcreliquo tempore sublatis. Fun re: 5% totius temporis impenditur in DNS queries:

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Inscriptiones quae programma spectat ad Postgresql pertinent. Click FindByAge:

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Interestingly, propositum ostendit in principio tres esse fontes principales qui moras addunt: nexus aperiendi et claudendi, data petens et connectens datorum. In grapho ostendit DNS petitiones, nexus aperiendi et claudendi circiter 13% totius temporis exsecutionis.

Hypothesi: Reusing nexus utentes collatis temporibus unius petitionis HTTP minuere debent, permittentes superiores perput et inferiorem latentiam..

Profecta applicatione experimentum

Codicem fontem renovamus, nexum ad Postgresql pro singulis petitionibus removere conamur. Prima optio utendi nexum piscinam in applicatione massa. In hoc experimento sumus lets 'reposuit eum' nexum collatis per sql exactoris for go:

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

if err != nil {
   return nil, err
}

Executio, animadversio, analysis

Postquam probationem cum 1000 petitionibus per secundam sileo reposui, patet p99 gradus latitudinis normales cum SLO 60ms reddidisse!

Quid sumptum?

10000 petitiones per secundam / 1000 petitiones per servo = 10 servientes + 1

Etiam melius faciamus!

Petitiones per L secundo

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Duplicatio oneris idem ostendit, graph sinistra superior ostendit applicationem procurare ad petitiones 2000 per alterum, p100 infra 60ms, p99 SLO satisfacere.

Sumptus in terms:

10000 petitiones per secundam / 2000 petitiones per servo = 5 servientes + 1

Petitiones per L secundo

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Hic applicatio potest procedere 3000 petitionum cum p99 latentia minorum quam 60morum. SLO non violatur, et sumptus sic accipitur;

10000 petitiones per secundam / per 3000 petitiones per servo = 4 servientes + 1 (Auctor rotundus est; proxime. translator)

Aliam experiamur analysin per gyrum.

Analysis - hypothesis

Colligimus et ostendimus eventus debugging applicationis ad 3000 petitionum per alterum:

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Adhuc 6% temporis connexiones constituendae absumitur. Stagnum constituere melius effectum est, sed adhuc videre potes applicationem pergere operam ut novas nexus datorum datorum condat.

Hypothesi: Nexus, obstante praesentia piscinae, adhuc omittuntur et purgantur, ita applicatio necessaria est ut eas reset. Numerum nexus ad piscinam pendens constituens magnitudine iuvare debet latency extenuando tempus applicationis nexum creando.

Profecta applicatione experimentum

Conatur install MaxIdleConns exaequabo piscinam magnitudine (describitur etiam hic):

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

Executio, animadversio, analysis

Petitiones per L secundo

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

p99 minus quam 60ms cum signanter p100 minus!

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

Reprehendens flammam graphi ostendit nexum iam non conspicuum esse! Sit scriptor accuratius reprehendo pg(*conn).query β€” Nos quoque nexum hic constitutum non animadvertimus.

SRE: euismod Analysis. Configurationis methodus utendi simplici telae server in Go

conclusio,

Analysis euismod critica est ad intellegendum quod exspectationes emptoris ac requisita non-muneris obvia sunt. Analysis per observationes cum exspectationibus emptoribus comparando adiuvare potest quid acceptum sit et quid non. Ite instrumenta validissima in bibliotheca normaria aedificata praebet quae analysim simplicem et facilem faciunt.

Source: www.habr.com