Load Test (with K6) - 3sam5oh/webtoon-search-service GitHub Wiki
Note
์์คํ ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํด ์์คํ ์ ์๋ต ์๊ฐ, ์ฒ๋ฆฌ๋, ์์ ์ฑ ๋ฑ์ ์ธก์ ํ๋ ํ ์คํธ
ํญ๋ชฉ | ์ค๋ช |
---|---|
์ฑ๋ฅ ๋ณ๋ชฉ์ ํ์ | ์์คํ ์ด ๋์ ํธ๋ํฝ์์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํค๋ ๋ถ๋ถ์ ๋ฐ๊ฒฌํ ์ ์๋ค |
์์ ์ฑ ํ์ธ | ํน์ ๋ถํ ์กฐ๊ฑด์์ ์์คํ ์ด ์์ ์ ์ผ๋ก ๋์ํ๋์ง ํ์ธํ ์ ์๋ค |
์ฉ๋ ๊ณํ | ์์คํ ์ด ์์๋๋ ์ฌ์ฉ์ ์๋ฅผ ์ผ๋ง๋ ์ ์ฒ๋ฆฌํ ์ ์๋์ง ์์ธกํ์ฌ ํ์ํ ๋ฆฌ์์ค๋ฅผ ๊ณํํ ์ ์๋ค |
์ฑ๋ฅ ๊ธฐ์ค ๊ฒ์ฆ | ์์คํ ์ด ์ค์ ๋ ์ฑ๋ฅ ๊ธฐ์ค์ ์ถฉ์กฑํ๋์ง ํ์ธํ ์ ์๋ค |
ํญ๋ชฉ | ์ค๋ช |
---|---|
Virtual Users (๊ฐ์ ์ฌ์ฉ์) | ํ ์คํธ ์ ์ค์ ์ฌ์ฉ์์ฒ๋ผ ์์คํ ์ ์ ๊ทผํ๋ ์๋ฎฌ๋ ์ด์ ๋ ์ฌ์ฉ์๋ค |
Transactions (ํธ๋์ญ์ ) | ์ฌ์ฉ์ ์์ ์ ์ ์ํ๋ ๋จ์๋ก, ํ๋์ ํธ๋์ญ์ ์ ํ๋ ์ด์์ HTTP ์์ฒญ์ ํฌํจํ ์ ์๋ค |
Throughput (์ฒ๋ฆฌ๋) | ์์คํ ์ด ์ผ์ ์๊ฐ ๋์ ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ์ ์ |
Response Time (์๋ต ์๊ฐ) | ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ |
Concurrent Users (๋์ ์ฌ์ฉ์) | ๋์์ ์์คํ ์ ์ ๊ทผํ์ฌ ์์ ์ ์ํํ๋ ์ฌ์ฉ์ ์ |
- ์๋ต ์๊ฐ(Response Time):
- ๊ฐ ์์ฒญ์ ์๋ต ์๊ฐ
- ํ๊ท ์๋ต ์๊ฐ
- ์ต๋ ๋ฐ ์ต์ ์๋ต ์๊ฐ
- ์ฒ๋ฆฌ๋(Throughput):
- ์ด๋น ์ฒ๋ฆฌ๋๋ ์์ฒญ ์
- ์ด๋น ์ ์ก๋๋ ๋ฐ์ดํฐ ์
- ์๋ฌ ๋น์จ(Error Rate):
- ์์ฒญ ์ค ์คํจํ ๋น์จ
- ์๋ฌ ์ฝ๋ ๋ฐ ์์ธ ๋ถ์
- ์์ ์ฌ์ฉ๋ฅ (Resource Utilization):
- CPU ์ฌ์ฉ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
- ๋์คํฌ I/O
- ๋คํธ์ํฌ ๋์ญํญ ์ฌ์ฉ๋
- ๋์ ์ฌ์ฉ์ ์(Concurrent Users):
- ํ
์คํธ ์ค ๋์์ ํ๋ํ๋ ์ฌ์ฉ์ ์
- ์ฌ์ฉ์ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ๋ณํ
- ์ฑ๋ฅ ๋ณ๋ชฉ ํ์(Bottlenecks):
- ์๋ต ์๊ฐ์ด ๊ธ๊ฒฉํ ์ฆ๊ฐํ๋ ์ง์
- ์์ ์ฌ์ฉ๋์ด ๊ธ์ฆํ๋ ์ง์
ํญ๋ชฉ | ์ค๋ช |
---|---|
ํ ์คํธ ์๋๋ฆฌ์ค ์ ์ | ์ค์ ์ฌ์ฉ ํจํด์ ๋ฐ์ํ ์๋๋ฆฌ์ค๋ฅผ ์์ฑํ์ฌ ํ์ค์ฑ ์๋ ํ ์คํธ๋ฅผ ์ํ |
๋ฐ์ดํฐ ์ค๋น | ํ ์คํธ์ ํ์ํ ๋ฐ์ดํฐ๋ ์ถฉ๋ถํ ์ค๋น๋์ด์ผ ํ๋ฉฐ, ์ค๋ณต ๋ฐ์ดํฐ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์ง |
ํ๊ฒฝ ์ผ์น | ํ ์คํธ ํ๊ฒฝ์ด ์ค์ ์ด์ ํ๊ฒฝ๊ณผ ์ต๋ํ ์ ์ฌํด์ผ ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค |
๋ชจ๋ํฐ๋ง | ํ ์คํธ ๋์ ์์คํ ์ ์์ ์ฌ์ฉ๋์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ฌ ๋ณ๋ชฉ ํ์์ ํ์ |
๋จ๊ณ์ ๋ถํ ์ฆ๊ฐ | ๋ถํ๋ฅผ ์ ์ง์ ์ผ๋ก ์ฆ๊ฐ์์ผ ์ฑ๋ฅ ํ๊ณ๋ฅผ ํ์ |
ํญ๋ชฉ | ์ค๋ช | VUs/์ฒ๋ฆฌ๋ | ๊ธฐ๊ฐ | ์๊ธฐ |
---|---|---|---|---|
Smoke Test | ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ๋์ง, ์์คํ ์ด ์ต์ํ์ ๋ถํ์์ ์ ์ ํ๊ฒ ์๋ํ๋์ง ๊ฒ์ฆ | ๋ฎ์ (2~20๋ช ) | ์งง์ (30์ด~3๋ถ) | ๊ด๋ จ ์์คํ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ. ๊ธฐ๋ฅ ๋ก์ง, ๊ธฐ์ค ๋ฉํธ๋ฆญ ๋ฐ ํธ์ฐจ๋ฅผ ํ์ธ |
AverageLoad Test | ์์๋๋ ์ ์ ์กฐ๊ฑด์์ ์์คํ ์ ์ฑ๋ฅ์ ํ๊ฐ | ํ๊ท | ์ค๊ฐ (5-60๋ถ) | ์์คํ ์ด ํ๊ท ์ ์ธ ์ฌ์ฉ์ผ๋ก ์ฑ๋ฅ์ ์ ์งํ๋์ง ํ์ธํ๊ธฐ ์ํด ์์ฃผ ํ์ธ |
Stress Test | ๋ถํ๊ฐ ์์ ํ๊ท ์ ์ด๊ณผํ ๋ ์์คํ ์ด ํ๊ณ์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ํ๊ฐ | ๋์ (ํ๊ท ์ด์) | ์ค๊ฐ (5-60๋ถ) | ์์คํ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ํ์ธํ๊ธฐ ์ํด ํ๊ท ์ด์์ ๋ถํ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ |
Soak Test | ์ฅ๊ธฐ๊ฐ์ ๊ฑธ์ณ ์์คํ ์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ํ๊ฐ | ํ๊ท | ๊ธธ๊ฒ (์ค๋ ์๊ฐ) | ์ฅ๊ธฐ๊ฐ ์ฐ์ ์ฌ์ฉ ์ ์์คํ ์ ๊ฒ์ ์ํด ๋ณ๊ฒฝํ ํ |
Spike Test | ๊ฐ์์ค๋ฝ๊ณ ์งง์ ์๊ฐ ๋์ ํ๋์ด ํฌ๊ฒ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ ์์คํ ์ ๋์๊ณผ ์์กด์ ๊ฒ์ฆ | ๋งค์ฐ ๋์ | ์งง์ (๋ช ๋ถ) | ์์คํ ์ด ์์ฆ๋ณ ์ด๋ฒคํธ์ ๋๋นํ๊ฑฐ๋ ํธ๋ํฝ์ด ์์ฃผ ํญ์ฃผํ๋ ๊ฒฝ์ฐ |
Breakpoint Test | ์์คํ ์ ์ฉ๋ ํ๊ณ๋ฅผ ํ์ ํ๊ธฐ ์ํด ์ ์ฐจ์ ์ผ๋ก ๋ถํ๋ฅผ ์ฆ๊ฐ | ์ค๋จ๋ ๋๊น์ง ์ฆ๊ฐ | ํ์ํ ๊ธฐ๊ฐ ๋์ | ์์คํ ์ ์ํ์ ์ฐพ๊ธฐ ์ํด ๋ช ๋ฒ์ด๋ |
1. K6 ์ค์น
2. script ์์ฑ
test.js
import http from "k6/http";
const BASE_URL = __ENV.BASE_URL || "http://localhost:3333";
export default function () {
let restrictions = {
maxCaloriesPerSlice: 500,
mustBeVegetarian: false,
excludedIngredients: ["pepperoni"],
excludedTools: ["knife"],
maxNumberOfToppings: 6,
minNumberOfToppings: 2,
};
let res = http.post(`${BASE_URL}/api/pizza`, JSON.stringify(restrictions), {
headers: {
"Content-Type": "application/json",
"X-User-ID": 23423,
},
});
console.log(`${res.json().pizza.name} (${res.json().pizza.ingredients.length} ingredients)`);
}
3. script ์คํ
k6 run test.js
4. ๊ฒฐ๊ณผ ํ์ธ
/\ |โพโพ| /โพโพ/ /โพโพ/
/\ / \ | |/ / / /
/ \/ \ | ( / โพโพ\
/ \ | |\ \ | (โพ) |
/ __________ \ |__| \__\ \_____/ .io
execution: local
script: test.js
output: -
scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
* default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)
INFO[0000] The Big Pugliese (5 ingredients) source=console
data_received..................: 686 B 483 B/s
data_sent......................: 323 B 227 B/s
http_req_blocked...............: avg=1.22ms min=1.22ms med=1.22ms max=1.22ms p(90)=1.22ms p(95)=1.22ms
http_req_connecting............: avg=223ยตs min=223ยตs med=223ยตs max=223ยตs p(90)=223ยตs p(95)=223ยตs
http_req_duration..............: avg=417.43ms min=417.43ms med=417.43ms max=417.43ms p(90)=417.43ms p(95)=417.43ms
{ expected_response:true }...: avg=417.43ms min=417.43ms med=417.43ms max=417.43ms p(90)=417.43ms p(95)=417.43ms
http_req_failed................: 0.00% โ 0 โ 1
http_req_receiving.............: avg=212ยตs min=212ยตs med=212ยตs max=212ยตs p(90)=212ยตs p(95)=212ยตs
http_req_sending...............: avg=72ยตs min=72ยตs med=72ยตs max=72ยตs p(90)=72ยตs p(95)=72ยตs
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=417.15ms min=417.15ms med=417.15ms max=417.15ms p(90)=417.15ms p(95)=417.15ms
http_reqs......................: 1 0.703775/s
iteration_duration.............: avg=1.42s min=1.42s med=1.42s max=1.42s p(90)=1.42s p(95)=1.42s
iterations.....................: 1 0.703775/s
vus............................: 1 min=1 max=1
vus_max........................: 1 min=1 max=1
running (00m01.4s), 0/1 VUs, 1 complete and 0 interrupted iterations
default โ [======================================] 1 VUs 00m01.4s/10m0s 1/1 iters, 1 per VU
5. ์ธก์ ํญ๋ชฉ ๋ถ์
ํญ๋ชฉ | ์ค๋ช |
---|---|
http_reqs |
์์ฒญ ์(์์ฒญ ๋น์จ)๋ฅผ ์ธก์ |
http_req_failed |
์ค๋ฅ์จ(์ค๋ฅ)์ ์ธก์ |
http_req_duration |
์๋ต ์๊ฐ(๋๊ธฐ ์๊ฐ)์ ์ธก์ |
vus |
๊ฐ์ ์ฌ์ฉ์ ์(ํธ๋ํฝ)๋ฅผ ์ธก์ |
๋ฑ์ ์งํ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ ์์ธํ ์ฌํญ์ ๋ฉํธ๋ฆญ ๊ด๋ จ ๋ฌธ์์์ ํ์ธ
- ํ๋ก์ ํธ์ ๊ด๋ จ๋ ์ค์ ์ ๋ณด ํ์, ์ด๋ค ๊ฒ์ ํ ์คํธ๋ฅผ ํ ์ง์ ๋ํ ๊ตฌ์ฒด์ ์ธ ํธ๋ฌ๋ธ ์ํ ์ ๊ธฐ๋กํ๋ ๊ฒ์ด ๋ ์ ํฉํ ๊ฒ ๊ฐ์
- ํ๋ก์ ํธ์ ๊ด๋ จ๋ ์ค์ ์ ๋ณด ํ์, SLI์ ๋ง์ฐฌ๊ฐ์ง
- ํ๋ก์ ํธ์ ๊ด๋ จ๋ ์ค์ ์ ๋ณด ํ์ (ํฌ๊ฒ ๊ณ ๋ ค ์ฌํญ์ ์๋ ๊ฒ ๊ฐ์)