SRE: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред Go рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд░ рдЯреНрдпреБрдирд┐рдЩ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдкрд╛рд▓рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЧрд░реНрди рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реЛред

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

рдЧреЛ рдпрд╣рд╛рдБ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рд░рд╛рдореНрд░реЛ рдЫ рдХрд┐рдирднрдиреЗ рдпрд╕рдорд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩ рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫрдиреН pprof рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ред

SRE: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред Go рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рд░рдгрдиреАрддрд┐

рд╣рд╛рдореНрд░реЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рд░рд╛рдВрд╢ рд╕реВрдЪреА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВред рд╣рд╛рдореА рдЕрдиреНрддрд░реНрдЬреНрдЮрд╛рди рд╡рд╛ рдЕрдиреБрдорд╛рдирдорд╛ рдЖрдзрд╛рд░рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдЧрд░реНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛ рдирд┐рд░реНрдгрдпрд╣рд░реВ рдЧрд░реНрди рдХреЗрд╣реА рдбреЗрдЯрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреМрдВред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдпреЛ рдЧрд░реНрдиреЗрдЫреМрдВ:

  • рд╣рд╛рдореА рдЕрдиреБрдХреВрд▓рди рд╕реАрдорд╛рд╣рд░реВ (рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ) рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрдЫреМрдВ;
  • рд╣рд╛рдореА рдкреНрд░рдгрд╛рд▓реАрдХреЛ рд▓рд╛рдЧрд┐ рд▓реЗрдирджреЗрди рднрд╛рд░ рдЧрдгрдирд╛ рдЧрд░реНрдЫреМрдВ;
  • рд╣рд╛рдореА рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫреМрдВ (рдбреЗрдЯрд╛ рд╕рд┐рд░реНрдЬрдирд╛);
  • рд╣рд╛рдореА рдЕрд╡рд▓реЛрдХрди рдЧрд░реНрдЫреМрдВ;
  • рд╣рд╛рдореА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдЫреМрдВ - рдХреЗ рд╕рдмреИ рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдкреВрд░рд╛ рднрдП?
  • рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд░реВрдкрдорд╛ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдЫреМрдВ, рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдмрдирд╛рдЙрдБрдЫреМрдВ;
  • рд╣рд╛рдореА рдпреЛ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рдПрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред

SRE: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред Go рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рд╕рд░рд▓ HTTP рд╕рд░реНрднрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛

рдпрд╕ рд▓реЗрдЦрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА Golang рдорд╛ рд╕рд╛рдиреЛ HTTP рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред рдпрд╕ рд▓реЗрдЦрдмрд╛рдЯ рд╕рдмреИ рдХреЛрдб рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ.

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

SRE: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред Go рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рд╕рд░рд▓реАрдХрд░рдг рдЧрд░реНрди, рд╣рд╛рдореА рддреЗрд░реНрд╕реЛ рдорд╛рдкрди (рд░ рдЧрдгрдирд╛ рд╕рд░рд▓реАрдХрд░рдг) рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рд░ рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕рдБрдЧреИ рддреИрдирд╛рдд рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗрд░ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдЫреМрдВ:

SRE: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред Go рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рд▓рдХреНрд╖реНрдпрд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрджреИ

рдпрд╕ рдЪрд░рдгрдорд╛, рд╣рд╛рдореА рд▓рдХреНрд╖реНрдпрдорд╛ рдирд┐рд░реНрдгрдп рдЧрд░реНрдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрди рдЦреЛрдЬреЗрдХрд╛ рдЫреМрдВ? рд╣рд╛рдореАрд▓реЗ рдХрд╕рд░реА рдерд╛рд╣рд╛ рдкрд╛рдЙрдиреЗ рдЬрдм рдпреЛ рд╕рдорд╛рдкреНрдд рд╣реБрдиреЗ рд╕рдордп рд╣реЛ? рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдЧреНрд░рд╛рд╣рдХрд╣рд░реВ рдЫрдиреН рд░ рд╣рд╛рдореНрд░реЛ рд╕реЗрд╡рд╛рд▓реЗ рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб резреж,режрежреж рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреЗрдЫред

╨Т 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 рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдврд┐рд▓рд╛рдЗ рднрдПрдХреЛ рджреЗрдЦрд╛рдЙрдБрджреИред 99 рдФрдВ рдкреНрд░рддрд┐рд╢рдд рдЕрдЭреИ рдкрдирд┐ рдорд╛рдерд┐ рдЫрд╛рдирд┐рдПрдХреЛ 60ms SLO рдорд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдлрд┐рдЯ рд╣реБрдиреНрдЫред

рд▓рд╛рдЧрддрдХреЛ рд╣рд┐рд╕рд╛рдмрд▓реЗ:

10000 рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб / 500 рдЕрдиреБрд░реЛрдз рдкреНрд░рддрд┐ рд╕рд░реНрднрд░ = 20 рд╕рд░реНрднрд░ + 1

рд╕рдмреИ рдЕрдЭреИ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб 1000 рдЕрдиреБрд░реЛрдз

SRE: рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдгред Go рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рдХреНрд╖реЗрдкрдг! рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рджреЗрдЦрд╛рдЙрдБрдЫ рдХрд┐ рдпрд╕рд▓реЗ рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб 1000 рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдпреЛ, рддрд░ рд╡рд┐рд▓рдореНрдмрддрд╛ рд╕реАрдорд╛ SLO рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рдЩреНрдШрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдпрд╕рд▓рд╛рдИ рд╢реАрд░реНрд╖ рджрд╛рдпрд╛рдБ рдЧреНрд░рд╛рдлрдорд╛ рд▓рд╛рдЗрди p99 рдорд╛ рджреЗрдЦреНрди рд╕рдХрд┐рдиреНрдЫред p100 рд▓рд╛рдЗрди рдзреЗрд░реИ рдЙрдЪреНрдЪ рдЫ рднрдиреНрдиреЗ рддрдереНрдпрдХреЛ рдмрд╛рд╡рдЬреБрдж, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдврд┐рд▓рд╛рдЗрд╣рд░реВ рдЕрдзрд┐рдХрддрдо 60ms рднрдиреНрджрд╛ рдмрдвреА рдЫрдиреНред рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓реЗ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреЗ рдЧрд░реНрдЫ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩрдорд╛ рдбреБрдмреМрдВред

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

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рд▓реЛрдбрд▓рд╛рдИ рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдб резрежрежреж рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ, рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН 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 рдорд╛ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдзрд┐

рдЕрдЭреИ рдкрдирд┐ рем% рд╕рдордп рдЬрдбрд╛рди рд╕реНрдерд╛рдкрдирд╛рдорд╛ рдЦрд░реНрдЪ рд╣реБрдиреНрдЫред рдкреВрд▓ рд╕реЗрдЯрдЕрдкрд▓реЗ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрди рд╕реБрдзрд╛рд░ рдЧрд░реЗрдХреЛ рдЫ, рддрд░ рддрдкрд╛рдИрд▓реЗ рдЕрдЭреИ рдкрдирд┐ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдирдпрд╛рдБ рдЬрдбрд╛рдирд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдХрд╛рдо рдЬрд╛рд░реА рд░рд╛рдЦреЗрдХреЛ рдЫред

рдкрд░рд┐рдХрд▓реНрдкрдирд╛: рдЬрдбрд╛рдирд╣рд░реВ, рдкреВрд▓рдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рдмрд╛рд╡рдЬреБрдж, рдЕрдЭреИ рдкрдирд┐ рдЫреЛрдбрд┐рдПрдХреЛ рдЫ рд░ рд╕рдлрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд░рд┐рд╕реЗрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдкреЛрдЦрд░реА рдЖрдХрд╛рд░рдорд╛ рдкреЗрдиреНрдбрд┐рдЩ рдЬрдбрд╛рдирд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╕реЗрдЯ рдЧрд░реНрдирд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓реЗ рдЬрдбрд╛рди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЦрд░реНрдЪ рдЧрд░реЗрдХреЛ рд╕рдордпрд▓рд╛рдИ рдХрдо рдЧрд░реЗрд░ рд╡рд┐рд▓рдореНрдмрддрд╛рдорд╛ рдорджреНрджрдд рдЧрд░реНрдиреБрдкрд░реНрдЫред.

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрджреИ - рдкреНрд░рдпреЛрдЧ

рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИ MaxIdleCons рдкреВрд▓ рд╕рд╛рдЗрдЬ рдмрд░рд╛рдмрд░ (рдпреЛ рдкрдирд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдпрд╣рд╛рдБ):

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди