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% ืžื”ื‘ืงืฉื•ืช ืืžื•ืจื•ืช ืœื”ืกืชื™ื™ื ืชื•ืš ืคื—ื•ืช ืž-60 ืืœืคื™ื•ืช ื”ืฉื ื™ื™ื”;
  • ืขืœื•ืช: ื”ืฉื™ืจื•ืช ืฆืจื™ืš ืœืฆืจื•ืš ืืช ื›ืžื•ืช ื”ื›ืกืฃ ื”ืžื™ื ื™ืžืœื™ืช ืฉืœื“ืขืชื ื• ืืคืฉืจื™ืช ื‘ืื•ืคืŸ ืกื‘ื™ืจ. ืœืฉื ื›ืš, ืื ื• ืžืžืงืกืžื™ื ืืช ื”ืชืคื•ืงื”;
  • ืชื›ื ื•ืŸ ืงื™ื‘ื•ืœืช: ื“ื•ืจืฉ ื”ื‘ื ื” ื•ืชื™ืขื•ื“ ืฉืœ ื›ืžื” ืžื•ืคืขื™ื ืฉืœ ื”ื™ื™ืฉื•ื ื™ื”ื™ื” ืฆื•ืจืš ืœื”ืคืขื™ืœ, ื›ื•ืœืœ ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืงื ื” ืžื™ื“ื” ื›ื•ืœืœ, ื•ื›ืžื” ืžื•ืคืขื™ื ื™ื™ื“ืจืฉื• ื›ื“ื™ ืœืขืžื•ื“ ื‘ื“ืจื™ืฉื•ืช ื”ื˜ืขื™ื ื” ื•ื”ื”ืงืฆืื” ื”ืจืืฉื•ื ื™ืช ื™ืชื™ืจื•ืช 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

ืชืฆืคื™ืช

ืขื•ืžืก ืขืกืงื” ื™ื•ืคืขืœ ื‘ื–ืžืŸ ื”ืจื™ืฆื”. ื‘ื ื•ืกืฃ ืœืžื“ื“ื™ ื™ื™ืฉื•ืžื™ื (ืžืกืคืจ ื‘ืงืฉื•ืช, ื–ืžืŸ ื”ืฉื”ื™ื™ืช ืชื’ื•ื‘ื”) ื•ืžืขืจื›ืช ื”ื”ืคืขืœื” (ื–ื™ื›ืจื•ืŸ, ืžืขื‘ื“, IOPS), ื™ื•ืคืขืœ ืคืจื•ืคื™ืœ ื™ื™ืฉื•ืžื™ื ื›ื“ื™ ืœื”ื‘ื™ืŸ ื”ื™ื›ืŸ ื™ืฉ ืœื” ื‘ืขื™ื•ืช ื•ืื™ืš ื–ืžืŸ ื”-CPU ื ืฆืจืš.

ื™ืฆื™ืจืช ืคืจื•ืคื™ืœื™ื

ืคืจื•ืคื™ืœ ื”ื•ื ืกื•ื’ ืฉืœ ืžื“ื™ื“ื” ื”ืžืืคืฉืจืช ืœืš ืœืจืื•ืช ืœืืŸ ืขื•ื‘ืจ ื–ืžืŸ ื”ืžืขื‘ื“ ื›ืืฉืจ ืืคืœื™ืงืฆื™ื” ืคื•ืขืœืช. ื–ื” ืžืืคืฉืจ ืœืš ืœืงื‘ื•ืข ื‘ื“ื™ื•ืง ื”ื™ื›ืŸ ื•ื›ืžื” ื–ืžืŸ ื”ืžืขื‘ื“ ืžื•ืฉืงืข:

SRE: ื ื™ืชื•ื— ื‘ื™ืฆื•ืขื™ื. ืฉื™ื˜ืช ืชืฆื•ืจื” ื‘ืืžืฆืขื•ืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืคืฉื•ื˜ ื‘-Go

ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื ืชื•ื ื™ื ืืœื• ื‘ืžื”ืœืš ื”ื ื™ืชื•ื— ื›ื“ื™ ืœืงื‘ืœ ืชื•ื‘ื ื•ืช ืœื’ื‘ื™ ื–ืžืŸ ืžืขื‘ื“ ืžื‘ื•ื–ื‘ื– ื•ืขื‘ื•ื“ื” ืžื™ื•ืชืจืช ืฉืžืชื‘ืฆืขืช. 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-40ms. ื”ืื—ื•ื–ื•ืŸ ื”-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

ื”ื’ืจืฃ ืžืจืื” ื”ื™ื›ืŸ ื•ื›ืžื” ื”ืืคืœื™ืงืฆื™ื” ืžื‘ืœื” ื–ืžืŸ ืžืขื‘ื“. ืžื”ืชื™ืื•ืจ ืž ื‘ืจื ื“ืŸ ื’ืจื’:

ืฆื™ืจ ื”-X ื”ื•ื ืื•ื›ืœื•ืกื™ื™ืช ืคืจื•ืคื™ืœ ื”ืžื—ืกื ื™ืช, ืžืžื•ื™ื ืช ืœืคื™ ืืœืคื‘ื™ืชื™ (ื–ื” ืœื ื”ื–ืžืŸ), ืฆื™ืจ ื”-Y ืžืฆื™ื’ ืืช ืขื•ืžืง ื”ืขืจื™ืžื”, ืกื•ืคืจ ืžืืคืก ื‘ [ืœืžืขืœื”]. ื›ืœ ืžืœื‘ืŸ ื”ื•ื ืžืกื’ืจืช ืžื—ืกื ื™ืช. ื›ื›ืœ ืฉื”ืžืกื’ืจืช ืจื—ื‘ื” ื™ื•ืชืจ, ื›ืš ื”ื™ื ื ื•ื›ื—ืช ื‘ืขืจื™ืžื•ืช ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื™ื•ืชืจ. ืžื” ืฉืžื•ืคื™ืข ืœืžืขืœื” ืคื•ืขืœ ืขืœ ื”-CPU, ื•ืžื” ืฉืœืžื˜ื” ื”ื ืจื›ื™ื‘ื™ ื”ืฆืืฆื. ื”ืฆื‘ืขื™ื ื‘ื“ืจืš ื›ืœืœ ืœื ืื•ืžืจื™ื ื›ืœื•ื, ืืœื ืคืฉื•ื˜ ื ื‘ื—ืจื™ื ื‘ืืงืจืื™ ื›ื“ื™ ืœื”ื‘ื“ื™ืœ ื‘ื™ืŸ ืžืกื’ืจื•ืช.

ื ื™ืชื•ื— โ€“ ื”ืฉืขืจื”

ืœืฆื•ืจืš ื›ื•ื•ื ื•ืŸ, ื ืชืžืงื“ ื‘ื ื™ืกื™ื•ืŸ ืœืžืฆื•ื ื–ืžืŸ ืžืขื‘ื“ ืžื‘ื•ื–ื‘ื–. ื ื—ืคืฉ ืืช ื”ืžืงื•ืจื•ืช ื”ื’ื“ื•ืœื™ื ื‘ื™ื•ืชืจ ืœื”ื•ืฆืื•ืช ื—ืกืจื•ืช ืชื•ืขืœืช ื•ื ืกื™ืจ ืื•ืชื. ื•ื‘ื›ืŸ, ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉืคืจื•ืคื™ืœ ืžื’ืœื” ื‘ืฆื•ืจื” ืžื“ื•ื™ืงืช ืžืื•ื“ ื”ื™ื›ืŸ ื‘ื“ื™ื•ืง ื”ืืคืœื™ืงืฆื™ื” ืžื‘ืœื” ืืช ื–ืžืŸ ื”ืžืขื‘ื“ ืฉืœื”, ื™ื™ืชื›ืŸ ืฉืชืฆื˜ืจื›ื• ืœืขืฉื•ืช ื–ืืช ืžืกืคืจ ืคืขืžื™ื, ื•ืชืฆื˜ืจื›ื• ื’ื ืœืฉื ื•ืช ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืืคืœื™ืงืฆื™ื”, ืœื”ืจื™ืฅ ืžื—ื“ืฉ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ืœืจืื•ืช ืฉื”ื‘ื™ืฆื•ืขื™ื ืžืชืงืจื‘ื™ื ืœื™ืขื“.

ื‘ืขืงื‘ื•ืช ื”ื”ืžืœืฆื•ืช ืฉืœ ื‘ืจื ื“ืŸ ื’ืจื’, ื ืงืจื ืืช ื”ืชืจืฉื™ื ืžืœืžืขืœื” ืœืžื˜ื”. ื›ืœ ืฉื•ืจื” ืžืฆื™ื’ื” ืžืกื’ืจืช ืžื—ืกื ื™ืช (ืงืจื™ืืช ืคื•ื ืงืฆื™ื”). ื”ืฉื•ืจื” ื”ืจืืฉื•ื ื” ื”ื™ื ื ืงื•ื“ืช ื”ื›ื ื™ืกื” ืœืชื•ื›ื ื™ืช, ื”ืื‘ ืฉืœ ื›ืœ ื”ืฉื™ื—ื•ืช ื”ืื—ืจื•ืช (ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื›ืœ ืฉืืจ ื”ืฉื™ื—ื•ืช ื™ืงื‘ืœื• ืื•ืชื” ื‘ืขืจื™ืžื”). ื”ืฉื•ืจื” ื”ื‘ืื” ื›ื‘ืจ ืฉื•ื ื”:

SRE: ื ื™ืชื•ื— ื‘ื™ืฆื•ืขื™ื. ืฉื™ื˜ืช ืชืฆื•ืจื” ื‘ืืžืฆืขื•ืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืคืฉื•ื˜ ื‘-Go

ืื ืชืจื—ืฃ ืขื ื”ืกืžืŸ ืžืขืœ ืฉื ืคื•ื ืงืฆื™ื” ื‘ื’ืจืฃ, ื”ื–ืžืŸ ื”ื›ื•ืœืœ ืฉื”ื™ื ื”ื™ื™ืชื” ืขืœ ื”ืขืจื™ืžื” ื‘ืžื”ืœืš ืื™ืชื•ืจ ื‘ืื’ื™ื ื™ื•ืฆื’. ื”ืคื•ื ืงืฆื™ื” HTTPServe ื”ื™ื™ืชื” ืฉื 65% ืžื”ื–ืžืŸ, ืคื•ื ืงืฆื™ื•ืช ืื—ืจื•ืช ื‘ื–ืžืŸ ืจื™ืฆื” runtime.mcall, mstart ะธ gc, ืœืงื— ืืช ืฉืืจ ื”ื–ืžืŸ. ืขื•ื‘ื“ื” ืžื”ื ื”: 5% ืžื”ื–ืžืŸ ื”ื›ื•ืœืœ ืžื•ืฉืงืข ื‘ืฉืื™ืœืชื•ืช DNS:

SRE: ื ื™ืชื•ื— ื‘ื™ืฆื•ืขื™ื. ืฉื™ื˜ืช ืชืฆื•ืจื” ื‘ืืžืฆืขื•ืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืคืฉื•ื˜ ื‘-Go

ื”ื›ืชื•ื‘ื•ืช ืฉื”ืชื•ื›ื ื™ืช ืžื—ืคืฉืช ืฉื™ื™ื›ื•ืช ืœ-Postgresql. ืœื—ืฅ ืขืœ FindByAge:

SRE: ื ื™ืชื•ื— ื‘ื™ืฆื•ืขื™ื. ืฉื™ื˜ืช ืชืฆื•ืจื” ื‘ืืžืฆืขื•ืช ืฉืจืช ืื™ื ื˜ืจื ื˜ ืคืฉื•ื˜ ื‘-Go

ืžืขื ื™ื™ืŸ ืฉื”ืชื•ื›ื ื™ืช ืžืจืื” ืฉื‘ืื•ืคืŸ ืขืงืจื•ื ื™ ื™ืฉื ื ืฉืœื•ืฉื” ืžืงื•ืจื•ืช ืขื™ืงืจื™ื™ื ื”ืžื•ืกื™ืคื™ื ืขื™ื›ื•ื‘ื™ื: ืคืชื™ื—ื” ื•ืกื’ื™ืจื” ืฉืœ ืงืฉืจื™ื, ื‘ืงืฉืช ื ืชื•ื ื™ื ื•ื—ื™ื‘ื•ืจ ืœืžืกื“ ื”ื ืชื•ื ื™ื. ื”ื’ืจืฃ ืžืจืื” ืฉื‘ืงืฉื•ืช DNS, ืคืชื™ื—ื” ื•ืกื’ื™ืจื” ืฉืœ ื—ื™ื‘ื•ืจื™ื ืชื•ืคืกื™ื ื›-13% ืžื–ืžืŸ ื”ื‘ื™ืฆื•ืข ื”ื›ื•ืœืœ.

ื”ึทืฉืืขึธืจึธื”: ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ื—ื™ื‘ื•ืจื™ื ื‘ืืžืฆืขื•ืช ืื™ื’ื•ื ืืžื•ืจ ืœื”ืคื—ื™ืช ืืช ื”ื–ืžืŸ ืฉืœ ื‘ืงืฉืช HTTP ื‘ื•ื“ื“ืช, ื•ืœืืคืฉืจ ืชืคื•ืงื” ื’ื‘ื•ื”ื” ื™ื•ืชืจ ื•ื”ืฉื”ื™ื™ื” ื ืžื•ื›ื” ื™ื•ืชืจ.

ื”ื’ื“ืจืช ื”ืืคืœื™ืงืฆื™ื” - ื ื™ืกื•ื™

ืื ื• ืžืขื“ื›ื ื™ื ืืช ืงื•ื“ ื”ืžืงื•ืจ, ื ืกื• ืœื”ืกื™ืจ ืืช ื”ื—ื™ื‘ื•ืจ ืœ-Postgresql ืขื‘ื•ืจ ื›ืœ ื‘ืงืฉื”. ื”ืืคืฉืจื•ืช ื”ืจืืฉื•ื ื” ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ืจื™ื›ืช ื—ื™ื‘ื•ืจ ื‘ืจืžืช ื”ื™ื™ืฉื•ื. ื‘ื ื™ืกื•ื™ ื–ื” ืื ื—ื ื• ื‘ื•ืื• ื ื’ื“ื™ืจ ืืช ื–ื” ื—ื™ื‘ื•ืจ ื—ื™ื‘ื•ืจื™ื ื‘ืืžืฆืขื•ืช ืžื ื”ืœ ื”ืชืงืŸ sql ืขื‘ื•ืจ go:

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 ื ืžื•ืš ืž-60ms, 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 ืžืกืคืงืช ื›ืœื™ื ืจื‘ื™ ืขื•ืฆืžื” ื”ืžื•ื‘ื ื™ื ื‘ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช ืฉื”ื•ืคื›ื™ื ืืช ื”ื ื™ืชื•ื— ืœืคืฉื•ื˜ ื•ื ื’ื™ืฉ.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”