SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдгрд┐ рдЯреНрдпреВрдирд┐рдВрдЧ рд╣реЗ рдХреНрд▓рд╛рдпрдВрдЯрд╕рд╛рдареА рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдкрд╛рд▓рди рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рд╛рдзрди рдЖрд╣реЗ.

рдЯреНрдпреВрдирд┐рдВрдЧ рдкреНрд░рдпреЛрдЧрд╛рдВрдЪреНрдпрд╛ рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рджреГрд╖реНрдЯреАрдХреЛрди рд▓рд╛рдЧреВ рдХрд░реВрди рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреАрд▓ рдЕрдбрдерд│реЗ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рд╣рд╛ рд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рдЧреЛ рд╡реЗрдмрд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдгрд┐ рдЯреНрдпреВрдирд┐рдВрдЧрд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯреАрдХреЛрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЛ.

рдЧреЛ рдпреЗрдереЗ рд╡рд┐рд╢реЗрд╖рддрдГ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ рдХрд╛рд░рдг рддреНрдпрд╛рдд рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рд╕рд╛рдзрдиреЗ рдЖрд╣реЗрдд pprof рдорд╛рдирдХ рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдд.

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдзреЛрд░рдг

рдЪрд▓рд╛ рдЖрдкрд▓реНрдпрд╛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рд╕рд╛рд░рд╛рдВрд╢ рд╕реВрдЪреА рддрдпрд╛рд░ рдХрд░реВрдпрд╛. рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХрд┐рдВрд╡рд╛ рдЕрдВрджрд╛рдЬрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдмрджрд▓ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдЖрдореНрд╣реА рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд╣реА рдбреЗрдЯрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╣реЗ рдХрд░реВ:

  • рдЖрдореНрд╣реА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рд╕реАрдорд╛ (рдЖрд╡рд╢реНрдпрдХрддрд╛) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЛ;
  • рдЖрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдорд╕рд╛рдареА рд╡реНрдпрд╡рд╣рд╛рд░ рд▓реЛрдбрдЪреА рдЧрдгрдирд╛ рдХрд░рддреЛ;
  • рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреА рдХрд░рддреЛ (рдбреЗрдЯрд╛ рддрдпрд╛рд░ рдХрд░рд╛);
  • рдЖрдореНрд╣реА рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЛ;
  • рдЖрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЛ - рд╕рд░реНрд╡ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛ рдЖрд╣реЗрдд рдХрд╛?
  • рдЖрдореНрд╣реА рддреЗ рд╢рд╛рд╕реНрддреНрд░реЛрдХреНрдд рдкрджреНрдзрддреАрдиреЗ рдорд╛рдВрдбрддреЛ, рдЧреГрд╣реАрддрдХ рддрдпрд╛рд░ рдХрд░рддреЛ;
  • рдпрд╛ рдЧреГрд╣рд┐рддрдХрд╛рдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдПрдХ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЛ.

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рд╕рд╛рдзреЗ HTTP рд╕рд░реНрд╡реНрд╣рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдпрд╛ рд▓реЗрдЦрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдЧреЛрд▓рдВрдЧрдордзреНрдпреЗ рдПрдХ рдЫреЛрдЯрд╛ HTTP рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВ. рдпрд╛ рд▓реЗрдЦрд╛рддреАрд▓ рд╕рд░реНрд╡ рдХреЛрдб рдЖрдврд│реВ рд╢рдХрддрд╛рдд рдпреЗрдереЗ.

рд╡рд┐рд╢реНтАНрд▓реЗрд╖рд┐рдд рдХреЗрд▓реЗрд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣рд╛ HTTP рд╕рд░реНрд╡реНрд╣рд░ рдЖрд╣реЗ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА Postgresql рдкреЛрд▓ рдХрд░рддреЛ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░рд┐рдд рдЖрдгрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░реЛрдорд┐рдерд┐рдпрд╕, рдиреЛрдб_рдПрдХреНрд╕рдкреЛрд░реНрдЯрд░ рдЖрдгрд┐ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдЖрд╣реЗ.

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 рд╡рд┐рдирдВрддреА рд╡рд┐рд▓рдВрдм 60ms рд╡рд░ SLO рджрд╛рдЦрд╡рддреЗ. рдУрд│ рджрд░реНрд╢рд╡рд┐рддреЗ рдХреА рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдХрдорд╛рд▓ рдкреНрд░рддрд┐рд╕рд╛рдж рд╡реЗрд│реЗрдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрд╣реЛрдд.

рдЪрд▓рд╛ рдЦрд░реНрдЪрд╛рдЪреА рдмрд╛рдЬреВ рдкрд╛рд╣реВ:

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 10000 рд╡рд┐рдирдВрддреНрдпрд╛ / 50 рд╡рд┐рдирдВрддреНрдпрд╛ рдкреНрд░рддрд┐ рд╕рд░реНрд╡реНрд╣рд░ = 200 рд╕рд░реНрд╡реНрд╣рд░ + 1

рдЖрдореНрд╣реА рдЕрдЬреВрдирд╣реА рд╣реА рдЖрдХрдбреЗрд╡рд╛рд░реА рд╕реБрдзрд╛рд░реВ рд╢рдХрддреЛ.

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 500 рд╡рд┐рдирдВрддреНрдпрд╛

рдЬреЗрд╡реНрд╣рд╛ рд▓реЛрдб рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 500 рд╡рд┐рдирдВрддреНрдпрд╛рдВрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЛ рддреЗрд╡реНрд╣рд╛ рдЖрдгрдЦреА рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯреА рдШрдбреВ рд▓рд╛рдЧрддрд╛рдд:

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдкреБрдиреНрд╣рд╛, рд╡рд░рдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рдЖрд▓реЗрдЦрд╛рдордзреНрдпреЗ рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрддрд╛ рдХреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдб рд░реЗрдХреЙрд░реНрдб рдХрд░рдд рдЖрд╣реЗ. рдЕрд╕реЗ рдирд╕рд▓реНрдпрд╛рд╕, рдЬреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд╛рд▓реВ рдЖрд╣реЗ рддреНрдпрд╛рд╡рд░ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ. рдкреНрд░рддрд┐рд╕рд╛рдж рд╡рд┐рд▓рдВрдм рдЖрд▓реЗрдЦ рд╢реАрд░реНрд╖рд╕реНрдерд╛рдиреА рдЙрдЬрд╡реАрдХрдбреЗ рд╕реНрдерд┐рдд рдЖрд╣реЗ, рд╣реЗ рджрд░реНрд╢рд╡рд┐рддреЗ рдХреА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 500 рд╡рд┐рдирдВрддреНрдпрд╛рдВрдореБрд│реЗ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рд╕ 25-40ms рд╡рд┐рд▓рдВрдм рдЭрд╛рд▓рд╛. рд╡рд░ рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ 99ms SLO рдордзреНрдпреЗ 60 рд╡рд╛ рдкрд░реНрд╕реЗрдВрдЯрд╛рдЗрд▓ рдЕрдЬреВрдирд╣реА рдЫрд╛рди рдмрд╕рддреЛ.

рдЦрд░реНрдЪрд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд:

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 10000 рд╡рд┐рдирдВрддреНрдпрд╛ / 500 рд╡рд┐рдирдВрддреНрдпрд╛ рдкреНрд░рддрд┐ рд╕рд░реНрд╡реНрд╣рд░ = 20 рд╕рд░реНрд╡реНрд╣рд░ + 1

рддрд░реАрд╣реА рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реБрдзрд╛рд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 1000 рд╡рд┐рдирдВрддреНрдпрд╛

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдЙрддреНрддрдо рдкреНрд░рдХреНрд╖реЗрдкрдг! рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджрд░реНрд╢рд╡рд┐рддреЛ рдХреА рддреНрдпрд╛рдиреЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 1000 рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА, рдкрд░рдВрддреБ SLO рджреНрд╡рд╛рд░реЗ рд╡рд┐рд▓рдВрдм рдорд░реНрдпрд╛рджреЗрдЪреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗрд▓реЗ рдЧреЗрд▓реЗ. рд╣реЗ рд╡рд░рдЪреНрдпрд╛ рдЙрдЬрд╡реНрдпрд╛ рдЖрд▓реЗрдЦрд╛рдордзреНрдпреЗ p99 рдУрд│реАрдд рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. p100 рдУрд│ рдЦреВрдк рдЬрд╛рд╕реНрдд рдЕрд╕реВрдирд╣реА, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд▓рдВрдм рдХрдорд╛рд▓ 60ms рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗ. рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╛рдп рдХрд░рддреЛ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧрдордзреНрдпреЗ рдЬрд╛рдК рдпрд╛.

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧрд╕рд╛рдареА, рдЖрдореНрд╣реА рд▓реЛрдб рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 1000 рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рд╕реЗрдЯ рдХрд░рддреЛ, рдирдВрддрд░ рд╡рд╛рдкрд░рд╛ pprof рдЕрдиреБрдкреНрд░рдпреЛрдЧ CPU рд╡реЗрд│ рдХреБрдареЗ рдШрд╛рд▓рд╡рдд рдЖрд╣реЗ рд╣реЗ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдбреЗрдЯрд╛ рдХреЕрдкреНрдЪрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рд╣реЗ HTTP рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рдХрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ pprof, рдЖрдгрд┐ рдирдВрддрд░, рд▓реЛрдб рдЕрдВрддрд░реНрдЧрдд, рдХрд░реНрд▓ рд╡рд╛рдкрд░реВрди рдкрд░рд┐рдгрд╛рдо рдЬрддрди рдХрд░рд╛:

$ 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 рдЪреА рд╡рд┐рд▓рдВрдм рдкрд╛рддрд│реА 60ms рдЪреНрдпрд╛ SLO рд╕рд╣ рд╕рд╛рдорд╛рдиреНрдп рдЭрд╛рд▓реА рдЖрд╣реЗ!

рдХрд┐рдВрдордд рдХрд┐рддреА рдЖрд╣реЗ?

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 10000 рд╡рд┐рдирдВрддреНрдпрд╛ / 1000 рд╡рд┐рдирдВрддреНрдпрд╛ рдкреНрд░рддрд┐ рд╕рд░реНрд╡реНрд╣рд░ = 10 рд╕рд░реНрд╡реНрд╣рд░ + 1

рдЪрд▓рд╛ рддреЗ рдЖрдгрдЦреА рдЪрд╛рдВрдЧрд▓реЗ рдХрд░реВрдпрд╛!

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 2000 рд╡рд┐рдирдВрддреНрдпрд╛

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рд▓реЛрдб рджреБрдкреНрдкрдЯ рдХрд░рдгреЗ рд╕рдорд╛рди рдЧреЛрд╖реНрдЯ рджрд░реНрд╢рд╡рд┐рддреЗ, рд╡рд░рдЪрд╛ рдбрд╛рд╡рд╛ рдЖрд▓реЗрдЦ рджрд░реНрд╢рд╡рд┐рддреЛ рдХреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 2000 рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЛ, p100 60ms рдкреЗрдХреНрд╖рд╛ рдХрдореА рдЖрд╣реЗ, p99 SLO рдЪреЗ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЛ.

рдЦрд░реНрдЪрд╛рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд:

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 10000 рд╡рд┐рдирдВрддреНрдпрд╛ / 2000 рд╡рд┐рдирдВрддреНрдпрд╛ рдкреНрд░рддрд┐ рд╕рд░реНрд╡реНрд╣рд░ = 5 рд╕рд░реНрд╡реНрд╣рд░ + 1

рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж 3000 рд╡рд┐рдирдВрддреНрдпрд╛

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдпреЗрдереЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ 3000ms рдкреЗрдХреНрд╖рд╛ рдХрдореА p99 рд▓реЗрдЯрдиреНрд╕реАрд╕рд╣ 60 рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реВ рд╢рдХрддреЛ. 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 рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдХрдореА p60 рд╕рд╣ 100ms рдкреЗрдХреНрд╖рд╛ рдХрдореА рдЖрд╣реЗ!

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдлреНрд▓реЗрдо рдЖрд▓реЗрдЦ рддрдкрд╛рд╕рд▓реНрдпрд╛рдиреЗ рдЕрд╕реЗ рджрд┐рд╕реВрди рдпреЗрддреЗ рдХреА рдХрдиреЗрдХреНрд╢рди рдпрд╛рдкреБрдвреЗ рд▓рдХреНрд╖рд╛рдд рдпреЗрдд рдирд╛рд╣реА! рдЪрд▓рд╛ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рддрдкрд╛рд╕реВрдпрд╛ pg(*conn).query тАФ рдпреЗрдереЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдд рдЕрд╕рд▓реНрдпрд╛рдЪреЗ рдЖрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрдд рдирд╛рд╣реА.

SRE: рдХрд╛рдордЧрд┐рд░реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг. Go рдордзреАрд▓ рд╕рд╛рдзрд╛ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рд╕реЗрдЯрдЕрдк рдкрджреНрдзрдд

рдирд┐рд╖реНрдХрд░реНрд╖

рдЧреНрд░рд╛рд╣рдХрд╛рдВрдЪреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдЖрдгрд┐ рдЧреИрд░-рдХрд╛рд░реНрдпрдХреНрд╖рдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдд рдЖрд╣реЗрдд рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЖрд╣реЗ. рдЧреНрд░рд╛рд╣рдХрд╛рдВрдЪреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдВрд╕рд╣ рдирд┐рд░реАрдХреНрд╖рдгрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░реВрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рдп рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЖрд╣реЗ рдЖрдгрд┐ рдХрд╛рдп рдирд╛рд╣реА рд╣реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реВ рд╢рдХрддреЗ. Go рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рд╛рдзрдиреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рдЬреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЛрдкреЗ рдЖрдгрд┐ рдкреНрд░рд╡реЗрд╢рдпреЛрдЧреНрдп рдмрдирд╡рддреЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛