á áœááºážáá±á¬ááºáááºááá¯ááºážááŒá¬ážá áááºááŒá¬ááŒááºážááŸáá·áº áá»áááºááŸáááŒááºážááẠáá±á¬ááºáááºáá»á¬ážá¡ááœáẠá áœááºážáá±á¬ááºáááºááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºááŒá±á¬ááºáž á¡áááºááŒá¯ááẠá¡á áœááºážáááºáá±á¬áááááá¬áá áºáá¯ááŒá áºáááºá
áááá¹áá¶áááºážáá» áá»ááºážáááºá ááºážáááºááŒááºáž á ááºážáááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážáá»ááŒááºážááŒáá·áº áááá¯ááááºáá áºáá¯ááŸá ááááºááá¯á·ááŸá¯áá»á¬ážááᯠá á áºáá±ážáááºá¡ááœáẠá áœááºážáá±á¬ááºáááºááá¯ááºážááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá Go webserver ááᯠááá°áá¬á¡ááŒá Ạá¡áá¯á¶ážááŒá¯á á áœááºážáá±á¬ááºáááºááœá²ááŒááºážá áááºááŒá¬ááŒááºážááŸáá·áº áá»áááºááŸáááŒááºážááá¯ááºáᬠáá±áá¯áá»áá»ááºážáááºáááºážááᯠá€áá±á¬ááºážáá«ážááœáẠáá±á¬áºááŒáá¬ážáá«áááºá
áá°á·ááœáẠáááá¯ááá¯ááºáá±ážáááááá¬áá»á¬áž áá«ááŸááá±á¬ááŒá±á¬áá·áº Go ááẠá¡áá°ážáá±á¬ááºážááœááºáá«áááºá pprof
á
á¶á
á¬ááŒáá·áºááá¯ááºááœááºá
áááºážáá»á°áá¬
áá»áœááºá¯ááºááá¯á·áááœá²á·á ááºážáá¯á¶ááá¯ááºáá¬ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœáẠá¡áá»ááºážáá»á¯ááºá á¬áááºážáá áºáᯠáááºáá®ážááŒáá«á áá¯á·á ááá¯ážááœááºážááááŒááºááŸá¯ ááá¯á·ááá¯áẠááŸááºážáááŸá¯á¡áá±á«áºá¡ááŒá±áá¶á ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááŒá¯áá¯ááºááá·áºá¡á á¬áž áá¯á¶ážááŒááºáá»ááºáá»á¬ážáá»ááẠáá±áá¬á¡áá»áá¯á·ááᯠá¡áá¯á¶ážááŒá¯ááẠááŒáá¯ážá á¬ážáá«áááºá áá«ááá¯áá¯ááºááá¯á·á
- áá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááẠáááºááááááºáá»á¬áž (ááá¯á¡ááºáá»ááºáá»á¬áž) ááᯠáá¯á¶ážááŒááºáá«áááºá
- áá»áœááºá¯ááºááá¯á·ááẠá áá áºá¡ááœáẠááœá±áá±ážááœá±áá°áááºááᯠááœááºáá»ááºáá«áááºá
- áá»áœááºá¯ááºááá¯á·ááẠá ááºážáááºááŸá¯ááŒá¯áá¯ááºááŒááºáž (áá±áá¬áááºáá®ážááŒááºáž)á
- áá«ááá¯á·á á±á¬áá·áºááŒáá·áº;
- áá»áœááºá¯ááºááá¯á· ááœá²ááŒááºážá áááºááŒá¬áá« - ááá¯á¡ááºáá»ááºáá»á¬ážá¡á¬ážáá¯á¶áž ááŒáá·áºáá®áá«ááá¬ážá
- á¡á²áá«ááᯠáááá¹áá¶áááºážáá» áááºááŸááºááŒá®áž á¡áá°á¡ááá áºáᯠáááºáá®ážáá«á
- á€áá°ááá»ááºááᯠá ááºážáááºááẠáá»áœááºá¯ááºááá¯á·ááẠá ááºážáááºááŸá¯áá áºáᯠááŒá¯áá¯ááºáá«áááºá
ááá¯ážááŸááºážáá±á¬ HTTP áá¬áá¬áááá¯áá¬
á€áá±á¬ááºážáá«ážá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠGolang ááŸá HTTP áá¬áá¬áááºááᯠá¡áá¯á¶ážááŒá¯áá«áááºá á€áá±á¬ááºážáá«ážááŸáá¯ááºá¡á¬ážáá¯á¶ážááᯠááœá±á·ááá¯ááºáááºá
ááœá²ááŒááºážá áááºááŒá¬áá¬ážááá·áº á¡ááá®áá±ážááŸááºážááẠáá±á¬ááºážááá¯áá»ááºáá áºáá¯á á®á¡ááœáẠPostgresql ááᯠá á áºáááºážáá±á¬ááºáá°ááá·áº HTTP áá¬áá¬áá áºáá¯ááŒá áºáááºá ááá¯á·á¡ááŒááºá á¡ááá®áá±ážááŸááºážááŸáá·áºá áá áºáááºááá áºáá»á¬ážááá¯á á¯áá±á¬ááºážááŒááºážááŸáá·áºááŒááááºá¡ááœáẠPrometheusá node_exporter ááŸáá·áº Grafana ááŸááááºá
ááá¯ážááŸááºážá á±áááºá á¡áá»á¬ážááá¯áẠá¡ááá¯ááºážá¡áᬠ(ááŸáá·áº ááœááºáá»ááºááŸá¯áá»á¬ážááᯠááá¯ážááŸááºážá¡á±á¬ááºááŒá¯áá¯ááºáááº) áááºáá±á¬ááºááŸá¯ááŸáá·áº áá±áá¬áá±á·á áºáá áºáá¯á á®ááᯠá¡áá°ááᜠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºáᯠáá»áœááºá¯ááºááá¯á· áá°ááá«áááº-
áááºážááá¯ááºáá»á¬ážáááºááŸááºááŒááºážá
á€á¡ááá·áºááœáẠáá»áœááºá¯ááºááá¯á·ááẠáááºážááá¯ááºááᯠáá¯á¶ážááŒááºáááºá áá¬ááá¯ááœá²ááŒááºážá áááºááŒá¬ááá¯á·ááŒáá¯ážá á¬ážáá±áá¬áá²á áá¯ááºáá¯á¶ážáá»áááºáá±á¬ááºáá±á¬á¡áá« áá»áœááºá¯ááºááá¯á· áááºááá¯á·ááááá¯ááºáááºáááºážá á€áá±á¬ááºážáá«ážááœááºá áá»áœááºá¯ááºááá¯á·ááœáẠáá±á¬ááºáááºáá»á¬ážááŸáááŒá±á¬ááºážááŸáá·áº áá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯ááẠáá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠáá,ááá ááᯠáá¯ááºáá±á¬ááºáá±ážáááºáᯠá áááºáá°ážááŒáá·áºáá«áááºá
Ð
- Latency- áá±á¬ááºážááá¯ááŸá¯ 99% ááẠ60ms áááºáááºážá ááŒá®ážááá·áºáááºá
- áá¯ááºáá»á ááááº- áááºáá±á¬ááºááŸá¯ááẠáá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºá áœá¬ ááŒá áºááá¯ááºáááºáᯠáá»áœááºá¯ááºááá¯á·áááºááá·áº á¡áááºážáá¯á¶áž ááœá±ááá¬áááᯠáá¯á¶ážá áœá²ááá·áºáááºá áá®ááá¯áá¯ááºááá¯á·á áá»áœááºá¯ááºááá¯á·ááẠáááºážááŒá±á¬ááºážááᯠáá»á²á·ááœááºáááºá
- á
áœááºážáá±á¬ááºááẠá¡á
á®á¡á
ááºááœá²ááŒááºáž- á¡ááá®áá±ážááŸááºážá á¡ááá¯ááºážá¡áá¬áááºáá»áŸ áá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºááᯠáá¬ážáááºááŒá®áž ááŸááºáááºážáááºááẠááá¯á¡ááºáááºá á¡áá¯á¶ážá
á¯á¶ á¡ááá¯ááºážá¡áᬠáá¯ááºáá±á¬ááºáá»áẠá¡áá«á¡áááºá ááŸáá·áº áááŠáž áááºáá¯ááºáááºááá¯ážááŸáá·áº á
á®áá¶áá±á¬ááºááœááºáá±ážááŸá¯ ááá¯á¡ááºáá»ááºáá»á¬áž ááŒáá·áºáá®ááẠááŒá
áºáááºáááºáá»áŸ ááá¯á¡ááºáááº
á¡áááºááẠn+1 .
Latency ááᯠááœá²ááŒááºážá áááºááŒá¬ááŒááºážá¡ááŒáẠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááẠááá¯á¡ááºááá¯ááºáá±á¬áºáááºáž áá¯ááºááœáŸáá·áºááŸá¯á¡á¬áž ááŸááºážááŸááºážáááºážáááºáž ááœá²ááŒááºážá áááºááŒá¬ááẠááá¯á¡ááºáá«áááºá SRE SLO áá¯ááºáááºážá ááºááᯠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá« ááŸá±á¬áá·áºááŸá±ážááŸá¯áá±á¬ááºážááá¯áá»ááºááẠáá¯ááºáá á¹á ááºážááá¯ááºááŸááºá០ááá¯ááºá á¬ážááŒá¯ááá·áº áá±á¬ááºááẠááá¯á·ááá¯áẠáá¯ááºáááºážáá¶á០áá¬áá«áááºá áá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯ááẠáááºááá·áºáááºáááºáá»á¬ážááá«áá² á¡á ááááºážá á€áá¬áááºááᯠááŒáá·áºáááºážáá±ážáááºááŒá áºáááºá
á ááºážáááºááŸá¯áááºáááºážáá»ááºááᯠáááºááŸááºááŒááºážá
á ááºážáááºááŸá¯áááºáááºážáá»ááºáá¡áá°á¡áá®ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áá áá áºááœáẠááá¯ááºážáá¬ááá·áºáááºááᯠáá¬ážááŸáááá¯ááºáááºááŒá áºáááºá ááœá²ááŒááºážá áááºááŒá¬áááºá¡ááœááºá áááºáááºáá±á¬ááºááŸá¯á á áœááºážáá±á¬ááºáááºááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážááᯠáá¯ááºáá±ážáááºááŒá áºáááºá
ááœá±ááœáŸá²áá±ážáá«áááºá
áá®áááºáááºážáá»ááºá áá¯á¶ážáááºá
$ 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
á á±á¬ááºá·ááŒááºá·
Runtime ááœáẠá¡áá±á¬ááºážá¡áááºáááºááᯠá¡áá¯á¶ážáá»áá«áááºá á¡ááá®áá±ážááŸááºáž (áá±á¬ááºážááá¯ááŸá¯á¡áá±á¡ááœááºá áá¯á¶á·ááŒááºááŸá¯ááŒá¬áá»áááº) ááŸáá·áº áááºáááºááŸá¯á áá Ạ(áááºááá¯áá®á CPUá IOPS) áááºááá áºáá»á¬ážá¡ááŒááºá áááºážááœáẠááŒá¿áá¬áá»á¬ážááŸáá·áº CPU á¡áá»áááºááᯠáááºáá²á·ááá¯á·áá¯á¶ážá áœá²áá±áááºááᯠáá¬ážáááºááẠá¡ááá®áá±ážááŸááºážáááá¯ááá¯ááºááᯠáá¯ááºáá±á¬ááºáá±ážáááºááŒá áºáááºá
á á¬áááºážááœááºážááŒááºážá
áááá¯ááá¯ááºážááẠá¡ááºááá®áá±ážááŸááºážáá áºáá¯áááºáááºáá±áá»áááºááœáẠCPU á¡áá»áááºááœá¬ážáá±ááá·áºáá±áá¬ááᯠááŒááºááá¯ááºá á±ááá·áº ááá¯ááºážáá¬ááŸá¯á¡áá»áá¯ážá¡á á¬ážáá áºáá¯ááŒá áºáááºá áááºážááẠááá·áºá¡á¬áž áááºááá·áºáá±áá¬ááŸáá·áº áááá¯áááºáá¬á¡áá»áááºáááºáá»áŸ áá¯á¶ážá áœá²áááºááᯠá¡ááá¡áá» áá¯á¶ážááŒááºááá¯ááºá á±áááº-
ááŒá¯ááºážáá®ážáá±áá±á¬ CPU á¡áá»áááºááŸáá·áº áááá¯á¡ááºáá±á¬ á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáá±ááŒááºážááᯠááá¯ážááœááºážááááŒááºááá¯ááºá á±áááºá¡ááœáẠá€áá±áá¬ááᯠááœá²ááŒááºážá áááºááŒá¬áá¬ááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá Go (pprof) ááẠáááá¯ááá¯ááºáá»á¬ážááᯠáááºáá®ážááá¯ááºááŒá®áž áááºážááá¯á·ááᯠá á¶áááááá¬á¡á á¯á¶á¡áááºááᯠá¡áá¯á¶ážááŒá¯á áá®ážáá±á¬ááºááááºáá áºáá»á¬ážá¡ááŒá ẠááŒááºáá±á¬ááºááá¯ááºáááºá áá±á¬ááºážáá«ážááœáẠáááºážááá¯á·á á¡áá¯á¶ážááŒá¯ááŸá¯ááŸáá·áº áááºáááºááŸá¯áááºážááœáŸááºá¡ááŒá±á¬ááºáž áá±á¬ááºááá¯ááºážááœáẠááŒá±á¬ááŒáá«áááºá
á á®áááºááŒááºážá áá±á·áá¬ááŒááºážá ááœá²ááŒááºážá áááºááŒá¬ááŒááºážá
á
ááºážáááºááŸá¯áá
áºáá¯áá¯ááºááŒáá·áºáá¡á±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá
áœááºážáá±á¬ááºáááºááᯠáá»á±áááºáááºá¡áá áá¯ááºáá±á¬ááºáá«á á
á±á¬áá·áºááŒáá·áºáá±á·áá¬ááŒá®áž ááœá²ááŒááºážá
áááºááŒá¬áá«áááºá áááá¡ááŒáááºáá±á·áá¬ááœá±á·ááŸááá»ááºáá»á¬ážáááŸáááẠáááºážááá¯á¡áá¯á¶ážááŒá¯ááẠááá¯ááºáááºá
á®ážáááºážáááá·áºáá±á¬áááºááá¯ážááᯠááœá±ážáá»ááºááŒáá«á
áá¯á·á áá±á¬ááºá¡ááá·áºáá
áºáá¯á
á®ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááœá²ááŒá¬ážááŸá¯á¡áá»áá¯á·ááŒáá·áº ááœá±ážáá»ááºáá¬ážáá±á¬ á¡ááá¯ááºážá¡áá¬áá
áºáá¯á¡áá á¡ááá¯ááºážá¡áá¬áá
áºáá¯ááŒáá·áº áááºááᯠááá¯ážáá±ážáááºááŒá
áºáááºá áá±á¬ááºážááá¯ááŸá¯á¡áá±á¡ááœááºááᯠáá»áááºááŸááá¬ážáá±á¬ áááºá
ááºážáááºááŸá¯áá
áºáá¯á
á®ááᯠáá¯ááºáá±á¬ááºáááº- make load-test LOAD_TEST_RATE=X
.
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠá á
ááááºáááºážááááºááŸá áºáá¯ááᯠá¡á¬áá¯á¶á áá¯ááºáá«á áá»áœááºá¯ááºááá¯á·á áá»áŸá±á¬ááºááœáŸá¬ááẠáá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ50 ááᯠáá¯ááºáá±á¬ááºááŒá±á¬ááºáž áááºáááºá¡áá±á«áºá០ááŒáááŒá®áž áá¬áááºá¡áá±á«áºáá±á¬áá·áºááẠáá±á¬ááºážááá¯áá»ááºáá áºáá¯á á®á ááŒá¬áá»áááºááᯠááŒááááºá ááá·áºáááºáá»ááºáá»á¬áž ááŸá áºáá¯á áá¯á¶ážááẠáá»áœááºá¯ááºááá¯á·á á áœááºážáá±á¬ááºááẠáááºááááááºáá»á¬ážá¡ááœááºážááœáẠááŸááá±áááºááŒá áºá á± áááŸááááºááᯠááŒáá·áºááŸá¯ ááœá²ááŒááºážá áááºááŒá¬ááẠáá°áá®áá±ážáá«áááºá ááááºáá±á«áºááœáẠá¡áá®áá±á¬ááºáá»ááºáž HTTP Request Latency 60ms ááœáẠSLO ááá¯ááŒááááºá ááá¯ááºážá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á áá¯á¶á·ááŒááºááŸá¯á¡áá»á¬ážáá¯á¶ážá¡áá»áááºá¡á±á¬ááºááœáẠáá±á¬ááºážááœááºááŒá±á¬ááºáž ááŒááááºá
áá¯ááºáá»á ááááºááᯠááŒáá·áºáá¡á±á¬ááºá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ10000 / áá¬áá¬áá áºáá¯áá»áŸáẠáá±á¬ááºážááá¯áá»áẠ50 áᯠ= áá¬áᬠ200 + 1
áá®ááááºážááááºážááᯠááŒáŸáá·áºáááºááá¯ááºáá«áá±ážáááºá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠá á
load ááẠáá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯ááŸá¯ 500 ááá¯á·áá±á¬ááºááŸááá±á¬á¡áá«ááœáẠááá¯ááá¯á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá±á¬á¡áá¬áá»á¬áž á áááºááŒá áºáá±á«áºáá¬áááº-
ááááºá áááºáááºá¡áá±á«áºáá¯á¶ážááááºááœáẠá¡ááá®áá±ážááŸááºážááẠáá¯á¶ááŸááºáááºá¡á¬ážááᯠááŸááºáááºážáááºáá¬ážáááºááᯠááœá±á·ááá¯ááºáááºá ááá¯ááá¯á·ááá¯ááºáá«áá á¡ááá®áá±ážááŸááºážááá¯áááºáááºáá±ááá·áºáá¬áá¬ááœáẠááŒá¿áá¬ááŸááá±áá«áááºá áá¯á¶á·ááŒááºááŸá¯ latency ááááºááẠáá¬áááºá¡áá±á«áºááœáẠáááºááŸáááŒá®áž áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ500 ááẠáá¯á¶á·ááŒááºááŸá¯ááŸá±á¬áá·áºááŸá±ážááŸá¯ááᯠ25-40ms ááŒá áºáá±á«áºá á±ááŒá±á¬ááºážááŒááá¬ážáááºá 99th percentile ááẠá¡áááºáá±á¬áºááŒáá« ááœá±ážáá»ááºáá¬ážáá±á¬ 60ms SLO ááŸáá·áº á¡á¶áááºááœááºáá»ááŒá áºáá±áá²ááŒá áºáááºá
áá¯ááºáá»á ááááºáá ááºážáááºážáá»ááºáá»á¬ážá:
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ10000 / áá¬áá¬áá áºáá¯áá»áŸáẠáá±á¬ááºážááá¯áá»áẠ500 áᯠ= áá¬áᬠ20 + 1
á¡áá¬á¡á¬ážáá¯á¶áž ááá¯ážáááºááá¯ááºáá±ážáááºá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠá á
ááŒá®ážá áœá¬áá±á¬ áá áºááœáŸááºááŸá¯á á¡ááá®áá±ážááŸááºážááẠáá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ1000 ááᯠáá¯ááºáá±á¬ááºááŒá±á¬ááºážááŒááá±á¬áºáááºáž latency ááá·áºáááºáá»ááºááᯠSLO á០áá»áá¯ážáá±á¬ááºáá²á·áááºá áááºážááᯠá¡áá±á«áºáá¬áááºááááºááœáẠá á¬ááŒá±á¬ááºáž p99 ááœááºááœá±á·ááá¯ááºáá«áááºá p100 ááá¯ááºážááẠáá»á¬ážá áœá¬ááŒáá·áºáá¬ážáá±á¬áºáááºáž á¡ááŸááºááááºááŸá±á¬áá·áºááŸá±ážááŸá¯ááẠá¡áá»á¬ážáá¯á¶áž 60ms ááẠááá¯áá»á¬ážáááºá á¡ááá®áá±ážááŸááºáž á¡ááŸááºáááẠáá¯ááºáá±á¬ááºáááºáá»á¬ážááᯠááááŸáááẠáááá¯ááá¯ááºážááœá²ááŒááºážááœáẠá á°ážá ááºážááŒáá·áºááŒáá«á áá¯á·á
á á¬áááºážááœááºážááŒááºážá
áááá¯ááá¯ááºááŒá¯áá¯ááºáááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáááºááᯠáá
áºá
áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ1000 ááá¯á· áááºááŸááºááŒá®ážáá±á¬áẠá¡áá¯á¶ážááŒá¯áááºá pprof
á¡ááá®áá±ážááŸááºážááẠCPU á¡áá»áááºááᯠáááºááá·áºáá±áá¬ááœáẠáá¯á¶ážá
áœá²áááºááᯠááááŸáááẠá¡áá»ááºá¡áááºáá»á¬ážááᯠáááºážáá°áááºá HTTP á¡áá¯á¶ážááŸááºááᯠá¡áááºááœááºážááŒááºážááŒáá·áº áááºážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá pprof
ááŒá®ážáá±á¬ááºá load á¡á±á¬ááºááœááºá 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
ááááºááẠá¡ááá®áá±ážááŸááºážááẠCPU á¡áá»áááºááᯠáááºááá·áºáá±áá¬ááŸáá·áº áááºáá»áŸáá¯á¶ážá
áœá²áááºááᯠááŒááááºá áá±á¬áºááŒáá»ááºááá±
X áááºááá¯ážááẠá¡áá¹ááá¬á ááºááŒáá·áº á á®áá¬ážáá±á¬ á áááºááºáááá¯ááá¯ááºáá°áŠážáá± (ááá¯á¡áá»áááºááá¯ááºáá«)á Y áááºááá¯ážááẠ[ááááº) á០áá¯áááŸáá±ááœááºááá·áº stack áá¡ááááºá¡áááºááá¯ááŒááááºá á áá¯áá¶áá áºáá¯á á®ááẠstack frame áá áºáá¯ááŒá áºáááºá áá±á¬ááºááá¯áá»ááºáá±á áááºážááẠstacks ááœáẠáááŒá¬ááááá¯áááᯠááŸááá±áá±áá±ááŒá áºáááºá CPU ááœáẠááááºáááºážááœáẠáá¯ááºáá±á¬ááºáá±áááºáá»á¬ážá ááŸáá·áº á¡á±á¬ááºáá±á¬áºááŒáá« á¡áá¬áá»á¬ážááẠááá±áž á¡á áááºá¡ááá¯ááºážáá»á¬áž ááŒá áºáááºá á¡áá±á¬ááºáá»á¬ážááẠá¡áá»á¬ážá¡á¬ážááŒáá·áº áá¬á០á¡áááá¹áá«ááºáááŸááá±á¬áºáááºáž áááááºáá»á¬ážááᯠááœá²ááŒá¬ážá á±ááẠáá»áááºážááŒáá·áº ááœá±ážáá»ááºáááºá
ááœá²ááŒááºážá áááºááŒá¬-áá°ááá»ááº
áá»áááºááŸáááŒááºážá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááŒá¯ááºážáá®ážáá±áá±á¬ CPU á¡áá»áááºáá»á¬ážááᯠááŸá¬ááœá±ááẠá¡á¬áá¯á¶á áá¯ááºáá«áááºá á¡áá¯á¶ážááááºáá±á¬ á¡áá¯á¶ážá ááááºá á¡ááŒá®ážáá¯á¶ážáááºážááŒá áºáá»á¬ážááᯠááŸá¬ááœá±ááŒá®áž áááºážááá¯á·ááᯠáááºááŸá¬ážáá«áááºá áá±á¬ááºážááŒá®á áááºážáááá¯ááá¯ááºážááẠá¡ááá®áá±ážááŸááºážááááá¯áááºáá¬á¡áá»áááºááᯠá¡ááá¡áá»áá¯á¶ážá áœá²ááá·áºáá±áá¬ááœáẠá¡ááœááºáááá»á áœá¬áá±á¬áºááŒáá±á¬ááŒá±á¬áá·áºá áááºááẠáááºážááᯠá¡ááŒáááºáá»á¬ážá áœá¬ááŒá¯áá¯ááºááááºááŒá áºááŒá®áž á¡ááá®áá±ážááŸááºážá¡áááºážá¡ááŒá áºáá¯ááºááá¯ááŒá±á¬ááºážáá²áááºá á ááºážáááºááŸá¯áá»á¬ážááᯠááŒááºáááºáá¯ááºáá±á¬ááºáááºááŸáá·áº á áœááºážáá±á¬ááºáááºááẠáá áºááŸááºááá¯á·áá»ááºážáááºáá±áááºááᯠááœá±á·ááŒááºááááºááŒá áºáááºá
Brendan Gregg áá¡ááŒá¶ááŒá¯áá»ááºáá»á¬ážá¡ááá¯ááºážá áá»áœááºá¯ááºááá¯á·ááẠááá¬ážááᯠá¡áá±á«áºááŸá¡á±á¬ááºááŒá±á¡áááááºáá«áááºá á á¬ááŒá±á¬ááºážáá áºáá¯á á®ááẠstack frame (function call) ááá¯ááŒááááºá áááá á¬ááŒá±á¬ááºážááẠáááá¯ááááºáá²ááá¯á· áááºááá·áºá¡ááŸááºááŒá áºááŒá®ážá á¡ááŒá¬ážáá±á«áºááá¯ááŸá¯á¡á¬ážáá¯á¶ážá áááºáááŒá áºááẠ(áá áºáááºážá¡á¬ážááŒáá·áºá á¡ááŒá¬ážáá±á«áºááá¯ááŸá¯á¡á¬ážáá¯á¶ážááẠáááºážááá¯á·á stack ááœáẠááŸááá±áááº)á áá±á¬ááºáá áºááŒá±á¬ááºážá ááœá²ááŒá¬ážáá±ááŒá®
á¡áááºá áááºááẠááááºáá±á«áºááœáẠáá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯áá¡áááºáá±á«áºááœáẠáá¬áá¬ááᯠááœáŸá±á·áá¬ážáá«áá á¡ááŸá¬ážááŸá¬ááŒááºáá±á
ááºá¡ááœááºáž á
ááááºáá±á«áºááŸá á
á¯á
á¯áá±á«ááºážá¡áá»áááºááᯠááŒááá«áááºá HTTPServe áá¯ááºáá±á¬ááºáá»ááºááẠááá¯á¡áá»áááºá 65%á á¡ááŒá¬áž runtime áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž ááŸááá±áá«áááºá runtime.mcall
, mstart
О gc
áá»ááºáá²á·á¡áá»áááºááœá±ááᯠáá°áááºá áá»á±á¬áºááœáŸááºá
áá¬á¡áá»ááº- DNS áá±ážááŒááºážááŸá¯áá»á¬ážááœáẠá
á¯á
á¯áá±á«ááºážá¡áá»áááºá 5% ááᯠá¡áá¯á¶ážááŒá¯áááº-
áááá¯ááááºááŸá¬ááœá±áá±á¬ááááºá
á¬áá»á¬ážááẠPostgresql ááŸáá·áºáááºááá¯ááºáááºá ááá¯ááŸáááºáá«á FindByAge
:
á áááºáááºá á¬ážá áá¬ááŸá¬á áááá¯ááááºááẠá¡ááŒá±áá¶á¡á¬ážááŒáá·áº ááŸá±á¬áá·áºááŸá±ážááŸá¯áá»á¬ážááᯠáá±á«ááºážááá·áºááá·áº á¡ááá áááºážááŒá áºáá¯á¶ážááẠááŒá áºáááº- áá»áááºáááºááŸá¯áá»á¬ážááᯠá¡ááœáá·áºá¡ááááºá áá±áá¬áá±á¬ááºážáá¶ááŒááºážááŸáá·áº áá±áá¬áá±á·á áºááá¯á· áá»áááºáááºááŒááºážááá¯á·ááᯠááŒááá¬ážáááºá DNS áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá á¡ááœáá·áºá¡ááááºáá»áááºáááºááŸá¯áá»á¬ážááẠá á¯á á¯áá±á«ááºážáá¯ááºáá±á¬ááºáá»áááºá 13% ááá·áºáá°ááŒá±á¬ááºáž ááááºáááŒááááºá
áá°ááá»ááº- áá±á«ááºážá ááºážááŒááºážááᯠá¡áá¯á¶ážááŒá¯á áá»áááºáááºááŸá¯áá»á¬ážááᯠááŒááºáááºá¡áá¯á¶ážááŒá¯ááŒááºážááẠHTTP áá±á¬ááºážááá¯áá»ááºáá áºáá¯áááºážá á¡áá»áááºááᯠáá»áŸá±á¬á·áá»ááá·áºááŒá®áž áá¯ááºááœáŸáá·áºááŸá¯ááá¯ááá¯ááŒáá·áºáá¬ážááŒááºážááŸáá·áº latency áááºážáá«ážááŒááºážááá¯á·ááᯠááœáá·áºááŒá¯áá±ážáá«áááºá.
á¡ááá®áá±ážááŸááºážááᯠáááºááŸááºááŒááºáž - á ááºážáááºááŸá¯
áá»áœááºá¯ááºááá¯á·ááẠá¡áááºážá¡ááŒá
áºáá¯ááºááᯠá¡ááºááááºáá¯ááºáááºá áá±á¬ááºážááá¯áá»ááºáá
áºáá¯á
á®á¡ááœáẠPostgresql ááá¯á·áá»áááºáááºááŸá¯ááᯠáááºááŸá¬ážááẠááŒáá¯ážá
á¬ážáá«á áááááœá±ážáá»ááºááŸá¯ááŸá¬ á¡áá¯á¶ážááŒá¯áááºááŒá
áºáááºá
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
if err != nil {
return nil, err
}
á á®áááºááŒááºážá áá±á·áá¬ááŒááºážá ááœá²ááŒááºážá áááºááŒá¬ááŒááºážá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ1000 ááŒáá·áº á ááºážáááºááŸá¯ááᯠááŒááºáááºá áááºááŒá®ážáá±á¬ááºá p99 á latency á¡ááá·áºáá»á¬ážááẠ60ms ááŸááá±á¬ SLO ááŒáá·áº áá¯á¶ááŸááºááá¯á· ááŒááºááœá¬ážááŒá±á¬ááºáž áááºááŸá¬ážáá«áááºá
áá¯ááºáá»á ááááºá áááºáá±á¬ááºáá²á
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ10000 / áá¬áá¬áá áºáá¯áá»áŸáẠáá±á¬ááºážááá¯áá»áẠ1000 áᯠ= áá¬áᬠ10 + 1
ááá¯áá±á¬ááºážá¡á±á¬áẠáá¯ááºááŒáá¡á±á¬ááºá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠá á
áááºááá¯ááŸá áºáááá¯ážááŒááºážá áá°áá®áá±á¬á¡áá¬ááá¯ááŒááááºá áááºáááºá¡áá±á«áºááá¯ááºážááááºááœáẠá¡ááá®áá±ážááŸááºážááẠáá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ2000 ááá¯áá¯ááºáá±á¬ááºááá¯ááºáááºá p100 ááẠ60ms áááºáááºážáááºá p99 ááẠSLO ááá¯áá»á±áááºá á±áááºá
áá¯ááºáá»á ááááºáá ááºážáááºážáá»ááºáá»á¬ážá:
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ10000 / áá¬áá¬áá áºáá¯áá»áŸáẠáá±á¬ááºážááá¯áá»áẠ2000 áᯠ= áá¬áᬠ5 + 1
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠá á
á€áá±áá¬ááœáẠá¡ááá®áá±ážááŸááºážááẠ3000ms áááºáááºážáá±á¬ p99 latency ááŒáá·áº áá±á¬ááºážááá¯áá»áẠ60 ááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá SLO ááẠáá»áá¯ážáá±á¬ááºááŒááºážáááŸááá«á áá¯ááºáá»á ááááºááᯠá¡á±á¬ááºáá«á¡ááá¯ááºáž áááºáá¶áá«áááºá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠ10000 / áá¬áá¬áá áºáá¯áá»áŸáẠáá±á¬ááºážááá¯áá»áẠ3000 ááŸá¯ááºáž = áá¬áᬠ4 áᯠ+ 1 (á á¬áá±ážááá¬á á á¯á ááºážáá¬ážáá«áááºá á¡áá®ážá ááºáá¯á¶áž áá¬áá¬ááŒááºáá°)
áá±á¬ááºááẠááœá²ááŒááºážá áááºááŒá¬ááŒáá·áºáá¡á±á¬ááºá
ááœá²ááŒááºážá áááºááŒá¬-áá°ááá»ááº
áá»áœááºá¯ááºááá¯á·ááẠá¡ááá®áá±ážááŸááºážááᯠá¡ááŸá¬ážááŸá¬ááŒááºážáááááºáá»á¬ážááᯠáá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯ááŸá¯ 3000 ááŒáá·áº á á¯áá±á¬ááºážááŒááááº-
á¡áá»áááºá 6% ááᯠáá»áááºáááºááŸá¯áá°áá±á¬ááºááẠáá¯á¶ážá áœá²áá±áá±ážáááºá áá±áá°ážáááºááᯠá áá áºááá·áºááœááºážááŒááºážááẠá áœááºážáá±á¬ááºááẠááá¯ááá¯áá±á¬ááºážááœááºáá¬áá±á¬áºáááºáž á¡ááá®áá±ážááŸááºážááẠáá±áá¬áá±á·á áºááá¯á· áá»áááºáááºááŸá¯á¡áá áºáá»á¬áž áááºáá®ážááŒááºážááœáẠáááºáááºáá¯ááºáá±á¬ááºáá±ááŒá±á¬ááºáž áááºááœá±á·ááŒááºááá¯ááºáá±ážáááºá
áá°ááá»ááº- áá±áá°ážáááºáá áºáá¯ááŸááá±áá±á¬áºáááºáž áá»áááºáááºááŸá¯áá»á¬ážááᯠááŒá¯ááºáá»ááŒá®áž ááá·áºááŸááºážáá±áá±ážáá±á¬ááŒá±á¬áá·áº á¡ááºááºáá®áá±ážááŸááºážá០áááºážááá¯á·ááᯠááŒááºáááºáááºááŸááºááẠááá¯á¡ááºáá«áááºá áá±áá°ážáááºá¡ááœááºá¡á á¬ážááá¯á· ááá¯ááºážáá¶á·áá¬ážááá·áº áá»áááºáááºááŸá¯á¡áá±á¡ááœááºááᯠáááºááŸááºááŒááºážááẠá¡ááá®áá±ážááŸááºážá០áá»áááºáááºááŸá¯áááºáá®ážáá¬ááœáẠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá»áááºááᯠáá»áŸá±á¬á·áá»ááŒááºážááŒáá·áº latency ááᯠáá°áá®áá±ážááá·áºáááºá.
á¡ááá®áá±ážááŸááºážááᯠáááºááŸááºááŒááºáž - á ááºážáááºááŸá¯
ááá·áºááœááºážááẠááŒáá¯ážá
á¬ážáá±áá«áááºá
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
return nil, err
}
á á®áááºááŒááºážá áá±á·áá¬ááŒááºážá ááœá²ááŒááºážá áááºááŒá¬ááŒááºážá
áá áºá áá¹ááá·áºáá»áŸáẠáá±á¬ááºážááá¯áá»áẠá á
p99 ááẠ60ms áááºáááºážááŒá®áž p100 áááááá¬áá¬áááºážáááºá
áá®ážáá±á¬ááºááááºááᯠá
á
áºáá±ážááŒááºáž áá»áááºáááºááŸá¯ááŸá¬ áááá¬áááºááŸá¬ážáá±á¬á·áááºááá¯ááºááŒá±á¬ááºáž ááŒááááºá áá±á¬ááºáááºá¡áá±ážá
áááºá
á
áºáá±ážááŒáá·áºáá¡á±á¬áẠpg(*conn).query
â á€áá±áá¬ááœáẠáá»áááºáááºááŸá¯ááá¯áááºáž áá»áœááºá¯ááºááá¯á·áááááá¬ážáááá«á
áá±á¬ááºáá»ááº
áá±á¬ááºáááºáá»áŸá±á¬áºááá·áºáá»ááºáá»á¬ážááŸáá·áº áá¯ááºáááºážáá±á¬ááºáá¬ááá¯ááºáá±á¬ ááá¯á¡ááºáá»ááºáá»á¬ážááᯠááŒáá·áºáá®ááŒá±á¬ááºáž áá¬ážáááºáááºá¡ááœáẠá áœááºážáá±á¬ááºáááºááá¯ááºážááŒá¬ážá áááºááŒá¬ááŸá¯ááẠá¡áá±ážááŒá®ážáá«áááºá áá±á¬ááºáááºáá»áŸá±á¬áºááá·áºáá»ááºáá»á¬ážááŸáá·áº á á°ážá ááºážáá±á·áá¬ááŸá¯áá»á¬ážááᯠááŸáá¯ááºážááŸááºááŒááºážááŒáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŒááºážááẠáááºáá¶ááá¯ááºá áá¬ááŸáá·áº áááºááá·áºá¡áá¬ááẠáááºáá¶ááá¯ááºáááºááᯠáá¯á¶ážááŒááºááẠáá°áá®áá±ážáá«áááºá Go ááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááá¯ážááŸááºážááœááºáá°á áœá¬ áá¯á¶ážááá¯ááºá á±ááẠá á¶á á¬ááŒáá·áºááá¯ááºááœáẠáááºáá±á¬ááºáá¬ážáá±á¬ á¡á áœááºážáááºáá±á¬áááááá¬áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá
source: www.habr.com