SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบฅเบฐเบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปƒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ„เป‰เบฒ.

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบงเบ”เบเบฒเป€เบšเบดเปˆเบ‡เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เป‚เบ”เบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”เปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡. เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเปเบฒเบ™เบปเบ”เบงเบดเบ—เบตเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เปƒเบ™เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบฅเบฐเบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ Go webserver เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡.

Go เปเบกเปˆเบ™เบ”เบตเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบกเบตเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเป‰เบฒเบ‡เป‚เบ›เบฃเป„เบŸเบฅเปŒ pprof เปƒเบ™โ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ”โ€‹เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™โ€‹.

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบเบธเบ”เบ—เบฐเบชเบฒเบ”

เปƒเบซเป‰เบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบชเบฐเบซเบผเบธเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเปƒเบŠเป‰เบ‚เปเป‰เบกเบนเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ intuition เบซเบผเบทเบเบฒเบ™เบ„เบฒเบ”เป€เบ”เบปเบฒ. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”:

  • เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ‚เบญเบšเป€เบ‚เบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš (เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™);
  • เบžเบงเบเป€เบฎเบปเบฒเบ„เบดเบ”เป„เบฅเปˆเบเบฒเบ™เป‚เบซเบผเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบ—เบธเบฅเบฐเบเปเบฒเบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบš;
  • เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš (เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™);
  • เบžเบงเบเป€เบฎเบปเบฒเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™;
  • เบžเบงเบเป€เบฎเบปเบฒเบงเบดเป€เบ„เบฒเบฐ - เบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบšเป?
  • เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบกเบฑเบ™เบ‚เบถเป‰เบ™เบ—เบฒเบ‡เบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”, เป€เบฎเบฑเบ”เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™;
  • เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™เบ™เบตเป‰.

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ HTTP Server เบ‡เปˆเบฒเบเบ”เบฒเบ

เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเปƒเบ™ Golang. เบฅเบฐเบซเบฑเบ”เบ—เบฑเบ‡เปเบปเบ”เบˆเบฒเบเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เบ—เบตเปˆเบ™เบตเป‰.

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบ–เบทเบเบงเบดเป€เบ„เบฒเบฐเปเบกเปˆเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP เบ—เบตเปˆเบชเปเบฒเบซเบผเบงเบ” Postgresql เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบต Prometheus, node_exporter เปเบฅเบฐ Grafana เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเปเบฅเบฐเบชเบฐเปเบ”เบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบฅเบฐเบฅเบฐเบšเบปเบš metrics.

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบ‡เปˆเบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ•เบฒเบกเปเบ™เบงเบ™เบญเบ™ (เปเบฅเบฐเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ‡เปˆเบฒเบ) เปเบ•เปˆเบฅเบฐเบšเปเบฅเบดเบเบฒเบ™เปเบฅเบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™:

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ

เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบเปˆเบฝเบงเบเบฑเบšเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ. เบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเบงเบดเป€เบ„เบฒเบฐเบซเบเบฑเบ‡? เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบฎเบนเป‰เป„เบ”เป‰เปเบ™เบงเปƒเบ”เบงเปˆเบฒเป€เบงเบฅเบฒเปƒเบ”เบ—เบตเปˆเบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”? เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ 10 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต.

ะ’ Google SRE Book เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบทเบญเบเปเบฅเบฐเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เป„เบ”เป‰เบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”. เปƒเบซเป‰เป€เบฎเบฑเบ”เปเบšเบšเบ”เบฝเบงเบเบฑเบ™เปเบฅเบฐเบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡:

  • Latency: 99% เบ‚เบญเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ„เบงเบ™เบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 60ms;
  • เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบ: เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ„เบงเบ™เปƒเบŠเป‰เบˆเปเบฒเบ™เบงเบ™เป€เบ‡เบดเบ™เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ„เบดเบ”เบงเปˆเบฒเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบขเปˆเบฒเบ‡เบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™;
  • เบเบฒเบ™เบงเบฒเบ‡เปเบœเบ™เบ„เบงเบฒเบกเบญเบฒเบ”เบชเบฒเบกเบฒเบ”: เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเปเบฅเบฐเป€เบญเบเบฐเบชเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบˆเบฐเบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™, เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡เบ‚เบฐเบซเบ™เบฒเบ”เป‚เบ”เบเบฅเบงเบก, เปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบฅเบฐเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡. เบเบฒเบ™เบŠเปเป‰เบฒเบŠเป‰เบญเบ™ n+1.

Latency เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เปเบ•เปˆเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ. เป€เบกเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ 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

เบเบฒเบ™เบชเบฑเบ‡เป€เบเบ”

เบเบฒเบ™เป‚เบซเบผเบ”เบ—เบธเบฅเบฐเบเบณเบˆเบฐเบ–เบทเบเบ™เบณเปƒเบŠเป‰เปƒเบ™เป€เบงเบฅเบฒเปเบฅเปˆเบ™. เบ™เบญเบเป€เบซเบ™เบทเบญเป„เบ›เบˆเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ (เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป, latency เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡) เปเบฅเบฐเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™ (เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, CPU, IOPS) metrics, เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ profileing เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบกเบตเบšเบฑเบ™เบซเบฒเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒ CPU.

เบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ›เบฃเป„เบŸเบฅเปŒ

Profiling เปเบกเปˆเบ™เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบซเบฑเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเป€เบงเบฅเบฒ CPU เป„เบ›เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ. เบกเบฑเบ™เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เบงเปˆเบฒเบšเปˆเบญเบ™เปƒเบ”เปเบฅเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”:

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบตเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบเปˆเบฝเบงเบเบฑเบš CPU เบ—เบตเปˆเป€เบชเบเป€เบงเบฅเบฒเปเบฅเบฐเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”. Go (pprof) เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป‚เบ›เบฃเป„เบŸเบฅเปŒเปเบฅเบฐเบชเบฐเปเบ”เบ‡เบžเบฒเบšเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ›เบฑเบ™เบเบฒเบŸเป„เบŸเป‚เบ”เบเปƒเบŠเป‰เบŠเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบท. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบฅเบฐเบ„เบนเปˆเบกเบทเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ•เปเปˆเบกเบฒเปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบก.

เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹, เบเบฒเบ™โ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เบเบฒเบ™โ€‹, เบเบฒเบ™โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹.

เปƒเบซเป‰เป€เบฎเบฑเบ”เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”, เบชเบฑเบ‡เป€เบเบ”เปเบฅเบฐเบงเบดเป€เบ„เบฒเบฐเบˆเบปเบ™เบเปˆเบงเบฒเบžเบงเบเป€เบฎเบปเบฒเบžเปเปƒเบˆเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบเป€เบญเบปเบฒเบกเบนเบ™เบ„เปˆเบฒเบเบฒเบ™เป‚เบซเบผเบ”เบ•เปˆเปเบฒเป‚เบ”เบเบ•เบปเบ™เป€เบญเบ‡เป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบฑเบ‡เป€เบเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”. เปƒเบ™เปเบ•เปˆเบฅเบฐเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เป‚เบซเบผเบ”เบ”เป‰เบงเบเบ›เบฑเบ”เปƒเบˆเบเบฒเบ™เบ›เบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™, เป€เบฅเบทเบญเบเบ”เป‰เบงเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡. เปเบ•เปˆเบฅเบฐเปเบฅเปˆเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบซเบผเบ”เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ”เป‰เบงเบเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ›เบฑเบš: make load-test LOAD_TEST_RATE=X.

50 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบชเบญเบ‡เบเบฒเบŸเป€เบ—เบดเบ‡. เป€เบšเบทเป‰เบญเบ‡เบŠเป‰เบฒเบเป€เบ—เบดเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ 50 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต (เบกเบฑเบ™เบ„เบดเบ”) เปเบฅเบฐเป€เบšเบทเป‰เบญเบ‡เบ‚เบงเบฒเป€เบ—เบดเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป. เบ—เบฑเบ‡เบชเบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบŠเปˆเบงเบเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เปเบฅเบฐเบงเบดเป€เบ„เบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเปƒเบ™เบ‚เบญเบšเป€เบ‚เบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบซเบผเบทเบšเปเปˆ. เป€เบชเบฑเป‰เบ™เบชเบตเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡ HTTP Request Latency เบชเบฐเปเบ”เบ‡ SLO เบ—เบตเปˆ 60ms. เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบขเบนเปˆเบ•เปเปˆเบฒเบเบงเปˆเบฒเป€เบงเบฅเบฒเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ”เป‰เบฒเบ™เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบ:

10000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต / 50 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ = 200 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ + 1

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบ•เบปเบงเป€เบฅเบเบ™เบตเป‰.

500 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต

เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเป€เบฅเบตเปˆเบกเป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบกเบทเปˆเบญเบเบฒเบ™เป‚เบซเบผเบ”เป„เบ”เป‰เป€เบ–เบดเบ‡ 500 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต:

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เปƒเบ™เบเบฒเบŸเบŠเป‰เบฒเบเป€เบ—เบดเบ‡เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเปเบฒเบฅเบฑเบ‡เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป‚เบซเบผเบ”เบ›เบปเบเบเบฐเบ•เบด. เบ–เป‰เบฒเบšเปเปˆเปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบต, เบกเบตเบšเบฑเบ™เบซเบฒเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบเปเบฒเบฅเบฑเบ‡เปเบฅเปˆเบ™เบขเบนเปˆ. เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบฒเบ™เบ•เบญเบšเบชเบฐ เปœเบญเบ‡ เบ—เบตเปˆเบขเบนเปˆเบ”เป‰เบฒเบ™เบ‚เบงเบฒเป€เบ—เบดเบ‡, เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒ 500 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบตเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบŠเบฑเบเบŠเป‰เบฒ 25-40ms. เป€เบ›เบตเป€เบŠเบฑเบ™เบ—เบต 99 เบเบฑเบ‡เบžเปเบ”เบตเบเบฑเบš 60ms SLO เบ—เบตเปˆเป€เบฅเบทเบญเบเป„เบงเป‰เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบ:

10000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต / 500 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ = 20 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ + 1

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เป„เบ”เป‰.

1000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ! เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบกเบฑเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ 1000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต, เปเบ•เปˆเบ‚เบญเบšเป€เบ‚เบ”เบˆเปเบฒเบเบฑเบ” latency เป„เบ”เป‰เบ–เบทเบเบฅเบฐเป€เบกเบตเบ”เป‚เบ”เบ SLO. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เป€เบชเบฑเป‰เบ™ p99 เปƒเบ™เป€เบชเบฑเป‰เบ™เบเบฃเบฒเบŸเบ‚เบงเบฒเป€เบ—เบดเบ‡. เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเป€เบชเบฑเป‰เบ™ p100 เปเบกเปˆเบ™เบชเบนเบ‡เบเบงเปˆเบฒเบซเบผเบฒเบ, เบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เปเบกเปˆเบ™เบชเบนเบ‡เบเบงเปˆเบฒเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡ 60ms. เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ profileing เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป€เบฎเบฑเบ”เป„เบ”เป‰.

เบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ›เบฃเป„เบŸเบฅเปŒ

เบชเปเบฒเบฅเบฑเบš profileing, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป‚เบซเบผเบ”เป€เบ›เบฑเบ™ 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 เบขเบนเปˆเปƒเบช เปเบฅเบฐเป€เบ—เบปเปˆเบฒเปƒเบ”. เบˆเบฒเบเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบˆเบฒเบ Brendan Gregg:

เปเบเบ™ X เปเบกเปˆเบ™เบ›เบฐเบŠเบฒเบเบญเบ™เบ‚เปเป‰เบกเบนเบ™ stack, เบˆเบฑเบ”เบฎเบฝเบ‡เบ•เบฒเบกเบ•เบปเบงเบญเบฑเบเบชเบญเบ™ (เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เป€เบงเบฅเบฒ), เปเบเบ™ Y เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡ stack, เบ™เบฑเบšเบˆเบฒเบเบชเบนเบ™เบขเบนเปˆ [เป€เบ—เบดเบ‡]. เปเบ•เปˆเบฅเบฐเบชเบตเปˆเบซเบฅเปˆเบฝเบกเป€เบ›เบฑเบ™เบเบญเบš stack. เบ‚เบญเบšเบเบงเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เบกเบฑเบ™เบกเบฑเบเบˆเบฐเบกเบตเบขเบนเปˆเปƒเบ™ stacks เบซเบผเบฒเบ. เบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™ CPU, เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เป€เบ”เบฑเบเบ™เป‰เบญเบ. เบชเบตเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบšเปเปˆเบกเบตเบ„เบงเบฒเบก เปเบฒเบ เบซเบเบฑเบ‡, เปเบ•เปˆเบ–เบทเบเป€เบฅเบทเบญเบเปเบšเบšเบชเบธเปˆเบกเป€เบžเบทเปˆเบญเปเบเบเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ‚เบญเบ‡เบเบญเบš.

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ - hypothesis

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบš, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบธเบกเปƒเบชเปˆเบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบŠเบญเบเบซเบฒ CPU เบ—เบตเปˆเป€เบชเบเป€เบงเบฅเบฒ. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบŠเบญเบเบซเบฒเปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปƒเบซเบเปˆเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบˆเปˆเบฒเบเบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เปเบฅเบฐเป€เบญเบปเบฒเบžเบงเบเบกเบฑเบ™เบญเบญเบ. เบ”เบต, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเป‚เบ›เบฃเป„เบŸเบฅเปŒเบ™เบฑเป‰เบ™เป€เบ›เบตเบ”เป€เบœเบตเบเปƒเบซเป‰เป€เบซเบฑเบ™เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบงเปˆเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเปƒเบ™เป‚เบ›เป€เบŠเบ”เป€เบŠเบตเบ‚เบญเบ‡เบกเบฑเบ™, เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบซเบผเบฒเบเบ„เบฑเป‰เบ‡, เปเบฅเบฐเบ—เปˆเบฒเบ™เบเบฑเบ‡เบˆเบฐเบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบ—เบปเบ”เบชเบญเบšเบ„เบทเบ™เปƒเบซเบกเปˆเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบเป‰เป€เบ›เบปเป‰เบฒเบซเบกเบฒเบ.

เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡ Brendan Gregg, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบญเปˆเบฒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฒเบเป€เบ—เบดเบ‡เบฅเบปเบ‡เบฅเบธเปˆเบก. เปเบ•เปˆเบฅเบฐเป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบเบญเบš stack (เบเบฒเบ™เป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™). เป€เบชเบฑเป‰เบ™เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบˆเบธเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™, เบžเปเปˆเปเบกเปˆเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ” (เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เบเบฒเบ™เป‚เบ—เบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบกเบตเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ stack เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ). เปเบ–เบงเบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบฅเป‰เบง:

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบงเบฒเบ‡เบ•เบปเบงเบเบฐเบžเบดเบšเปƒเบชเปˆเบŠเบทเปˆเบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เปƒเบ™เบเบฒเบŸ, เป€เบงเบฅเบฒเบ—เบฑเบ‡เปเบปเบ”เบ—เบตเปˆเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ stack เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ”เบตเบšเบฑเบเบˆเบฐเบ–เบทเบเบชเบฐเปเบ”เบ‡. เบŸเบฑเบ‡เบŠเบฑเบ™ HTTPServe เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ 65% เบ‚เบญเบ‡เป€เบงเบฅเบฒ, เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบงเบฅเบฒเปเบฅเปˆเบ™เบญเบทเปˆเบ™เป† runtime.mcall, mstart ะธ gc, เป„เบ”เป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบ–เบดเบ‡เบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป€เบงเบฅเบฒ. เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบกเปˆเบงเบ™: 5% เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก DNS:

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบŠเบญเบเบซเบฒเป€เบ›เบฑเบ™เบ‚เบญเบ‡ Postgresql. เปƒเบซเป‰เบ„เบฅเบดเบเปƒเบชเปˆ FindByAge:

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เป‚เบ„เบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒ, เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบกเบตเบชเบฒเบกเปเบซเบผเปˆเบ‡เบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบฅเปˆเบฒเบŠเป‰เบฒ: เบเบฒเบ™เป€เบ›เบตเบ”เปเบฅเบฐเบ›เบดเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป DNS, เป€เบ›เบตเบ”เปเบฅเบฐเบ›เบดเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบŠเป‰เป€เบงเบฅเบฒเบ›เบฐเบกเบฒเบ™ 13% เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบชเบปเบกเบกเบธเบ”เบ•เบดเบ–เบฒเบ™: เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ„เบทเบ™เปƒเบซเบกเปˆเป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เบฅเบงเบกเบเบฑเบ™เบ„เบงเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP เบ”เบฝเบง, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบœเปˆเบฒเบ™เบ—เบตเปˆเบชเบนเบ‡เบ‚เบถเป‰เบ™เปเบฅเบฐ latency เบ•เปˆเปเบฒ..

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบ - เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบฅเบญเบ‡โ€‹

เบžเบงเบเป€เบฎเบปเบฒเบ›เบฑเบšเบ›เบธเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡, เบžเบฐเบเบฒเบเบฒเบกเป€เบญเบปเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš Postgresql เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป. เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ เบชเบฐเบ™เบธเบเป€เบเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒ เปƒเบซเป‰เบ•เบฑเป‰เบ‡เบกเบฑเบ™เบ‚เบถเป‰เบ™ เบเบฒเบ™เบฅเบงเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเปƒเบŠเป‰ sql driver เบชเปเบฒเบฅเบฑเบšเป„เบ›:

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

if err != nil {
   return nil, err
}

เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹, เบเบฒเบ™โ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เบเบฒเบ™โ€‹, เบเบฒเบ™โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบเบฑเบš 1000 เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ•เปเปˆโ€‹เบงเบดโ€‹เบ™เบฒโ€‹เบ—เบตโ€‹, เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เปเบˆเป‰เบ‡โ€‹เบงเปˆเบฒโ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบเบฒเบ™ latency เบ‚เบญเบ‡ p99 เป„เบ”เป‰โ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ›โ€‹เบšเปˆเบญเบ™โ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เบ”เป‰เบงเบ SLO เบ‚เบญเบ‡ 60msโ€‹!

เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปเบกเปˆเบ™เบซเบเบฑเบ‡?

10000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต / 1000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ = 10 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ + 1

เปƒเบซเป‰เป€เบฎเบฑเบ”เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒ!

2000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบเบฒเบ™เป‚เบซเบผเบ”เบชเบญเบ‡เป€เบ—เบปเปˆเบฒเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™, เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡เป€เบ—เบดเบ‡เบŠเป‰เบฒเบเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป 2000 เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต, p100 เบ•เปˆเปเบฒเบเบงเปˆเบฒ 60ms, p99 เบžเปเปƒเบˆ SLO.

เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบ:

10000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต / 2000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ = 5 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ + 1

3000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบ—เบตเปˆเบ™เบตเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™ 3000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบกเบต p99 latency เบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 60ms. SLO เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบฅเบฐเป€เบกเบตเบ”, เปเบฅเบฐเบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปเบกเปˆเบ™เบเบญเบกเบฎเบฑเบšเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

10000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบงเบดเบ™เบฒเบ—เบต / เบ•เปเปˆ 3000 เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ = 4 เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ + 1 (เบœเบนเป‰เบ‚เบฝเบ™เป„เบ”เป‰เบชเบฐเบซเบผเบธเบš, เบ›เบฐเบกเบฒเบ™ เบ™เบฑเบเปเบ›)

เปƒเบซเป‰เบฅเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบฎเบญเบšเบญเบทเปˆเบ™.

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ - hypothesis

เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป€เบเบฑเบšโ€‹เบเปเบฒโ€‹เปเบฅเบฐโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เบœเบปเบ™โ€‹เบ‚เบญเบ‡ debugging เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ—เบตเปˆ 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

เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบŸ flame เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบกเปˆเบ™เบšเปเปˆเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™! เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก pg(*conn).query โ€” เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบเบฑเบ‡โ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบชเบฑเบ‡โ€‹เป€เบเบ”โ€‹เป€เบซเบฑเบ™โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบชเป‰เบฒเบ‡โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ‚เบถเป‰เบ™โ€‹เบขเบนเปˆโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹.

SRE: เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เบงเบดเบ—เบตเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเบ‡เปˆเบฒเบเป†เปƒเบ™ Go

เบชเบฐเบซเบฅเบธเบš

เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™เบ•เปเปˆเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ„เบงเบฒเบกเบ„เบฒเบ”เบซเบงเบฑเบ‡เบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เปเบกเปˆเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป‚เบ”เบเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบเบฒเบ™เบชเบฑเบ‡เป€เบเบ”เบเบฒเบ™เบเบฑเบšเบ„เบงเบฒเบกเบ„เบฒเบ”เบซเบงเบฑเบ‡เบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเบเปเบฒเบ™เบปเบ”เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™. Go เปƒเบซเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster