1. K6
- K6 ๋ ํ์ฅ ๊ฐ๋ฅํ ์คํ ์์ค ๋ถํ ํ ์คํธ ๋๊ตฌ์ด๋ค.
- K6 ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ธํ๋ผ ์์ ์ฑ, ์ฑ๋ฅ์ ํ ์คํธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํ๋ ฅ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ง์ํ๋ค.
(1) Use Case
K6 ์ฌ์ฉ์๋ ๊ฐ๋ฐ์, QA ์์ง๋์ด, SRE ๋ฑ์ด ๋์์ด๋ค.
- ๋ถํ ๋ฐ ์ฑ๋ฅ ํ ์คํธ : spike, stress, soak test ์ ๊ฐ์ ๊ณ ๋ถํ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ง์ํ๋ค.
- ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ํ ์คํธ : K6 ๋ธ๋ผ์ฐ์ API ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์ฑ๋ฅ ํ ์คํธ ์คํ ๋ฐ ๋ฉํธ๋ฆญ์ ์์งํด ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํ์ ํ ์ ์๋ค.
- ์ฑ๋ฅ ๋ฐ ์ข ํฉ ๋ชจ๋ํฐ๋ง : ์ต์ํ์ ๋ถํ๋ก ์์ฃผ ํ ์คํธ ์คํ์ด ๊ฐ๋ฅํ๊ณ K6 ์คํฌ๋ฆฝํธ ์คํ์ ์ง์ํ๋ Grafana Cloud ์ข ํฉ ๋ชจ๋ํฐ๋ง์ ์ฌ์ฉํ ์ ์๋ค.
- ์ฑ๋ฅ ํ ์คํธ ์๋ํ : CI/CD ๋ฐ ์๋ํ ๋๊ตฌ์ ์ํํ๊ฒ ํตํฉ๋์ด ์ฑ๋ฅ ํ ์คํธ ์๋ํ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ง์ํ๋ค.
- ์นด์ค์ค ๋ฐ ๋ณต์๋ ฅ ํ ์คํธ : ์นด์ค์ค ์คํ์ ์ผ๋ถ๋ก ํธ๋ํฝ์ ์๋ฎฌ๋ ์ด์ ํ๊ฑฐ๋, ํ ์คํธ์์ ํธ๋ฆฌ๊ฑฐ, ๋ค์ํ ์ ํ์ ๊ฒฐํจ์ ์ฃผ์ ํ ์ ์๋ค.
- ์ธํ๋ผ ํ ์คํธ : k6 ์๋ก์ด ํ๋กํ ์ฝ์ ๋ํ ์ง์ ์ถ๊ฐํ๊ฑฐ๋ ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํด ์ธํ๋ผ ๋ด ๊ฐ๋ณ ์์คํ ์ ์ง์ ํ ์คํธํ ์ ์๋ค.
2. Installation
- K6 ๋ linux, mac, window ๋ฅผ ์ง์ํ๋ค.
- Docker ์ปจํ ์ด๋๋ก ์คํํ ์ ์๋ค.
(1) Fedora/CentOS
sudo dnf install <https://dl.k6.io/rpm/repo.rpm>
sudo dnf install k6
(2) Mac OS
brew install k6
(3) Docker
docker pull grafana/k6
3. K6 ์คํํ๊ธฐ
(1) script.js ํ์ผ ์์ฑ ๋ฐ ๊ธฐ๋ณธ ์ฝ๋ ์์ฑ
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
http.get('<https://test.k6.io>');
sleep(1);
}
(2) k6 ์ปค๋งจ๋ ์คํ
- ์ต์ ์ฌ์ ์ ๋ฐฉ๋ฒ (e.g. vuser, duration) : https://k6.io/blog/learning-js-through-load-testing/#task-1-override-options
$ k6 run script.js
docker run --rm -i grafana/k6 run - <script.js
(3) ์คํ ๊ฒฐ๊ณผ (ํ์ค ์ถ๋ ฅ)
- ๋ฉํธ๋ฆญ ์ ๋ณด : https://grafana.com/docs/k6/latest/using-k6/metrics/reference/

- data_received : ์ ๋ฌ ๋ฐ์ ๋ฐ์ดํฐ ์
- data_sent : ์ ๋ฌ๋ ๋ฐ์ดํฐ ์
- http_req_blocked : ์์ฒญ์ ์์ํ๊ธฐ ์ ๋ธ๋ก๋ ์๊ฐ
- http_req_connecting : ์๊ฒฉ ํธ์คํธ์ TCP connection ์ ์๋ฆฝํ๊ธฐ ์ํ ์๊ฐ
- http_req_duration : ์์ฒญ์ ์ํ ์ด ์๊ฐ(http_req_sending + http_req_waiting + http_req_receiving)
- http_req_failed : ์ค์ ๋ ์๋ต ์ฝ๋ฐฑ์ ๋ฐ๋ฅธ ์คํจํ ์์ฒญ์ ๋น์จ
- http_req_receiving : ์๊ฒฉ ํธ์คํธ์์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ด๋ค.
- http_req_tls_handshaking : ์๊ฒฉ ํธ์คํธ์ TLS ์ธ์ ํธ๋์ ฐ์ดํน์ ์์๋ ์๊ฐ
- http_req_waiting : ์๊ฒฉ ํธ์คํธ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ (TTFB)
- http_reqs : k6๊ฐ ์์ฑํ ์ด HTTP ์์ฒญ ์
- iteration_duration : setup ๋ฐ teardown ์ ์์๋ ์๊ฐ์ ํฌํจํ์ฌ ํ๋์ ์ ์ฒด ๋ฐ๋ณต์ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ
- iterations : VU๊ฐ JS ์คํฌ๋ฆฝํธ(๊ธฐ๋ณธ ํจ์)๋ฅผ ์คํํ ์ด ํ์
- vus : ํ์ฌ ํ์ฑ๋ VUser ์
- vus_max : ๊ฐ๋ฅํ ์ต๋ VUser ์
(4) ์คํ ๊ฒฐ๊ณผ ์ถ๋ ฅํ๊ธฐ
- —out ์ต์ ์ ํตํด ์ํ๋ ๋์ ์ง์ ์ด ๊ฐ๋ฅํ๋ค.
k6 run \\
--out json=test.json \\
script01.json
{
"metric": "vus",
"type": "Point",
"data": {
"time": "2024-12-04T16:28:24.627428+09:00",
"value": 1,
"tags": {}
}
}
{
"type": "Metric",
"data": {
"name": "vus_max",
"type": "gauge",
"contains": "default",
"thresholds": [],
"submetrics": null
},
"metric": "vus_max"
}
{
"metric": "vus_max",
"type": "Point",
"data": {
"time": "2024-12-04T16:28:24.627428+09:00",
"value": 1,
"tags": {}
}
}
...
Reference
'๐ backend > test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| docker -compose ๊ธฐ๋ฐ ๋ก์ปฌ DB ๋ชจ๋ํฐ๋ง ๊ตฌ์ถ(mysqld-exporter + prometheus + grafana) (0) | 2025.01.25 |
|---|---|
| Testcontainers ์ฝ์ง1 : ํ ์คํธ ์ปจํ ์ด๋ ์ฌ์ฌ์ฉ (0) | 2025.01.13 |
| nGrinder tutorial (0) | 2024.03.19 |
| pinpoint simple summary (0) | 2024.03.08 |