k6

๋“ค์–ด๊ฐ€๋ฉฐ

๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฒˆ์— ์ธํ”„๋ผ๊ณต๋ฐฉ์„ ์ˆ˜๊ฐ•ํ•˜๋ฉด์„œ ์ œ์ผ ์žฌ๋ฏธ๊ฐ€ ๋А๊ปด์ง€๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์ˆ˜์—…์—์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ ํˆด์„ ์•ˆ๋‚ดํ•ด์คฌ์ง€๋งŒ ๋ฏธ์…˜์€ k6๋กœ ์ง„ํ–‰ํ•˜๊ธธ ์ฃผ๋ฌธ๋ฐ›์•˜๋‹ค. ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ๋Š” โ€˜์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธโ€™๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์–ด๋–ค ํˆด์ด๋“  ์ƒ๊ด€์ด ์—†๋‹ค๊ณ  ํ•˜์…จ๋Š”๋ฐ k6๋กœ ์„ ์ •์ด ๋˜์—ˆ๋‹ค.

๊ณต์‹ document๋ฅผ ์ญ‰ ์‚ดํŽด๋ณด์•˜๋Š”๋ฐ, ์ •๋ฆฌ๊ฐ€ ๋ฌด์ฒ™ ์ž˜ ๋˜์–ด ์žˆ์—ˆ๊ณ  ๊ตฌ๋…์ž ์ˆ˜๋„ ์ ์ง€๋งŒ ๊ณต์‹ ์œ ํˆฌ๋ธŒ ์ฑ„๋„๋„ ์šด์˜์ค‘์ด๋ผ์„œ ์ข€ ์‹ ๋ขฐ๊ฐ€ ๊ฐ”๋‹ค. ๊ทธ๋ฆฌ๊ณ  git action๊ณผ ์—ฐ๋™๋„ ๊ฐ€๋Šฅํ•ด์„œ ์ด์ œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋Š” ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ git action์„ ์ด์šฉํ•  ๊ณ„ํš์ด์—ˆ๋˜ ๋‚˜์—๊ฒŒ ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ ํˆด์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ณต์‹ ๋ฌธ์„œ์— ๋‹ค ๋‚˜์™€์žˆ๋Š” ์„ค์น˜๋‚˜ ๊ฐœ๋…๊ณผ ๊ฐ™์€ ์“ธ๋ฐ์—†๋Š” ๊ฒƒ์„ ๋นผ๊ณ  ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.(์‚ฌ์‹ค ๋‹ค๋ฅธ ํฌ์ŠคํŒ…๋“ค๋„ ๊ทธ๋Ÿฐ ๋งฅ๋ฝ์—์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ๊ธด ํ•˜๋‹ค)

k6๋ฅผ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค.

  • ใ„ฑ) ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๋ชฉํ‘œ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ

  • ใ„ด) ์ž‘์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ CLI ํ˜น์€ k6 cloud ๋ฅผ ํ†ตํ•ด์„œ run

  • ใ„ท) ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ฅธ ์„œ๋ฒ„์˜ capacity ํŒŒ์•…

๊ทธ๋ž˜์„œ k6๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” โ€˜ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธโ€™๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•˜๋Š”์ง€ ์•Œ๊ณ , ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ž‘๋™ ์‹œํ‚ค๋Š”์ง€ ์•Œ๊ณ , k6๊ฐ€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋กœ ์ฃผ๋Š” ๊ฒฐ๊ณผ์ง€๊ฐ€ ๊ฐ ํ•ญ๋ชฉ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€๋งŒ ์ดํ•ดํ•˜๋ฉด ํฐ ํ‹€์—์„œ ๋‹ค ํŒŒ์•…ํ•œ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ •๋ฆฌ๋„ ์ด ํ•ญ๋ชฉ๋Œ€๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

1. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•

์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๋‹ค. ๊ฐ„๋‹จํžˆ lending ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ์— ๋Œ€ํ•œ smoke test์ด๋‹ค.

import http from 'k6/http';
import {check, sleep} from 'k6';

export let options = {
    vus: 1,
    duration: '10s',

    thresholds: {
        http_req_duration: ['p(99)<1500'],
    },
};

const BASE_URL = 'https://fistkim.kro.kr';

export default () => {

    // lending page
    let homeUrl = `${BASE_URL}`;
    let lendingPageResponse = http.get(homeUrl);
    check(lendingPageResponse, {
        'lending page running': (response) => response.status === 200
    });
};

๋ชจ๋“  ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ export default function์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ํ•จ์ˆ˜๊ฐ€ ํ…Œ์ŠคํŠธ ๋™์•ˆ ๋ฌดํ•œํžˆ ์‹คํ–‰๋œ๋‹ค. ๋ฌดํ•œํžˆ ์‹คํ–‰๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์‹คํ–‰=>์ข…๋ฃŒ=>์‹คํ–‰=>์ข…๋ฃŒ ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ ์ด ๋กœ์ง์„ vus ๊ฐ๊ฐ์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค.

option์€ ์ด ์ „์ฒด ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๊ฐ–๊ฒŒ๋˜๋Š” ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ configuration๊ณผ ๊ฐ™๋‹ค. ํ˜„์žฌ ์Šคํฌ๋ฆฝํŠธ์˜ option์„ ํ•ด์„ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๊ฐ€์ƒ์˜ ์‚ฌ์šฉ์ž๋Š” 1๋ช…

  • 10์ดˆ ๋™์•ˆ ์ง„ํ–‰

  • ๋ชจ๋“  ์š”์ฒญ์˜ 99ํผ์„ผํŠธ ์ด์ƒ์˜ โ€˜์†Œ์š”์‹œ๊ฐ„โ€™์ด 1500ms ์ด๋‚ด์— ๋“ค์–ด์•ผ ํ•œ๋‹ค

http_req_duration Total time for the request. Itโ€™s equal to http_req_sending + http_req_waiting + http_req_receiving (i.e. how long did the remote server take to process the request and respond, without the initial DNS lookup/connection times)

check๋Š” ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ํ™•์ธํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ง€๊ธˆ์€ ๋‹จ์ง€ http status code๋งŒ์„ ํ™•์ธํ–ˆ๋Š”๋ฐ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ json ๋ฐ์ดํ„ฐ ๋‚ด์— ์›ํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ํ™•์ธ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์œ„ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ทธ๋Œ€๋กœ option๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด load test, stress test๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๋ž˜๋Š” load test, stress test์˜ option ์˜ˆ์‹œ์ด๋‹ค.

load test

export let options = {
    stages: [
        { duration: '5s', target: 100 },
        { duration: '20s', target: 100 },
        { duration: '5s', target: 0 },
    ],

    thresholds: {
        http_req_duration: ['p(99)<1500'],
    },
};

stress test

export let options = {
    stages: [
        { duration: '5s', target: 100 },
        { duration: '10s', target: 100 },
        { duration: '5s', target: 200 },
        { duration: '10s', target: 200 },
        { duration: '5s', target: 300 },
        { duration: '10s', target: 300 },
        { duration: '5s', target: 0 },
    ],
    thresholds: {
        http_req_duration: ['p(99)<1500'],
    },
};

๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. target์ด vus์˜ ์ˆ˜๋‹ค. ์ด์ „ duration๊ณผ target์ด ์ผ์น˜ํ•˜๋ฉด, ๊ทธ ๊ฐ€์ƒ์˜ ์ธ์› ๊ทธ๋Œ€๋กœ๋กœ ์ •ํ•ด์ง„ duration๋™์•ˆ ์š”์ฒญ์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ „ duration์— ๋น„ํ•ด์„œ target์ด ์ƒ์Šนํ•˜๊ฑฐ๋‚˜ ํ•˜๋ฝํ•˜๋ฉด ๋ณ€ํ™”๋Ÿ‰ ๋งŒํผ ์ •ํ•ด์ง„ duration๋™์•ˆ ๊ฐ€์ƒ์˜ ์ธ์› ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๊ฒ ๋‹ค(์ƒ์Šน ๋˜๋Š” ํ•˜๋ฝ)๋Š” ์˜๋ฏธ์ด๋‹ค.

์œ„ ์˜ˆ์‹œ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ lending page์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ์ด์ง€๋งŒ, ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ธ์›Œ์„œ โ€˜๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ์ •๋ณด๋ฅผ ์ƒ์„ฑโ€™ํ•˜๋Š” ๊ฒƒ๋„ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ๊ธฐ์กด ๊ณ„์ •์ •๋ณด๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ํ† ํฐ์„ ์ด์šฉํ•ด ์ธ์ฆ์„ ํ†ต๊ณผํ•˜์—ฌ ์›ํ•˜๋Š” object๋ฅผ post ์š”์ฒญํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

import http from 'k6/http';
import {check, sleep} from 'k6';

export let options = {
    vus: 1,
    duration: '10s',

    thresholds: {
        http_req_duration: ['p(99)<1500'],
    },
};

const BASE_URL = 'https://fistkim.kro.kr';
const USERNAME = 'fistkim101@gmail.com';
const PASSWORD = '12qw';

export default () => {

    // login
    let loginUrl = `${BASE_URL}/login/token`;
    let loginPayload = JSON.stringify({
        email: USERNAME,
        password: PASSWORD,
    });
    let loginParams = {
        headers: {
            'Content-Type': 'application/json',
        },
    };
    let loginResponse = http.post(loginUrl, loginPayload, loginParams);
    check(loginResponse, {
        'logged in successfully': (response) => response.json('accessToken') !== '',
    });

    // create line
    let createLineUrl = `${BASE_URL}/lines`;
    let lineRandomNumber = Math.random().toString().split('.')[1];
    let createLinePayload = JSON.stringify({
        name: `testLine-${lineRandomNumber}`,
        color: "grey darken-4",
        upStationId: 1,
        downStationId: 2,
        distance: 10,
    });
    let createLineParams = {
        headers: {
            'Authorization': `Bearer ${loginResponse.json('accessToken')}`,
            'Content-Type': 'application/json',
        },
    };
    let createLinesResponse = http.post(createLineUrl, createLinePayload, createLineParams);
    check(createLinesResponse, {
        'created Line successfully': (response) => response.status === 201,
    });
};

k6 ๊ณต์‹๋ฌธ์„œ ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค์–‘ํ•˜๊ณ  ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ํ…Œ์ŠคํŠธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘๋™ ๋ฐฉ๋ฒ•

1) k6๋ฅผ ์„ค์น˜ํ•ด๋‘” ์ƒํƒœ์—์„œ ์ปค๋งจ๋“œ๋ผ์ธ์„ ์ด์šฉํ•ด์„œ ์ค€๋น„ํ•ด๋‘” .js ํŒŒ์ผ์„ ์‹คํ–‰

$ k6 run smoke.js

2) k6 cloud๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰

js ํŒŒ์ผ๋ณ„๋กœ ์‹œ๊ฐํ™”ํ•ด์„œ ๋ชฉ๋ก์ด ๋ณด์—ฌ์ง€๊ณ , ๊ฐ js ํŒŒ์ผ ๋งˆ๋‹ค ์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ๊ทธ๋ž˜ํ”„๋กœ ๋ณด์—ฌ์ง„๋‹ค

์›ํ•˜๋Š” ๋กœ์ง์„ Configure ์— ๋“ค์–ด๊ฐ€์„œ ์ž‘์„ฑํ•œ๋‹ค

๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ ์—ญ์‹œ ์•„์ฃผ ๋ณด๊ธฐ์ข‹๊ฒŒ ๊ทธ๋ž˜ํ”„๋กœ ๋ณด์—ฌ์ค€๋‹ค. ์ด๊ฑด ๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ํ•ด๋ณธ stress test ์ด๋‹ค

3) git action์„ ์ด์šฉํ•ด์„œ ์‹คํ–‰

์‚ฌ์šฉ๋ฒ•์€ ์—ฌ๊ธฐ ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๋‚ด๊ฐ€ git action์— ์‚ฌ์šฉํ•œ ci ๋กœ์ง์ด๋‹ค. ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์™€ ๋ณ„๊ฐœ๋กœ ์ƒˆ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ push ๋˜๋„๋ก ์˜์กด์„ฑ์„ ์—ฐ๊ฒฐ์ง“์ง€ ์•Š์•˜๋‹ค.

  load_test:
    runs-on: ubuntu-latest
    needs: [ test, docker_image_build_and_push ]
    name: Run k6 test
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Run k6 local test
        uses: k6io/action@v0.1
        with:
          filename: ./test-script/lending/smoke.js

์ฃผ์˜ํ•ด์•ผ ํ•  ๊ฒƒ์€ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ์— ๋ฌด๊ด€ํ•˜๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ฑ๊ณตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒƒ ์ž์ฒด๋Š” ์„ฑ๊ณตํ–ˆ๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ๋‚ด์šฉ์ ์œผ๋กœ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋”ฐ๋ผ ์‹œํ–‰ ๋˜์—ˆ์„๋•Œ ์‹คํŒจํ–ˆ๋Š”์ง€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€, ์ ˆ๋ฐ˜์ •๋„ ์„ฑ๊ณตํ–ˆ๋Š”์ง€๋Š” git action ์ž…์žฅ์—์„œ๋Š” ์ƒ๊ด€์ด ํฌ๊ฒŒ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋ฉด์— ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํŒจํ•˜์˜€๋‹ค๋Š” ๊ฒƒ์ด ๋ณด์ด๊ณ , ๋ฉ”์ผ๋กœ ์•Œ๋žŒ๊นŒ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ผ€์ด์Šค๋Š” ๋‚ด๊ฐ€ .jsํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž˜๋ชป์„ค์ •ํ•ด์„œ ์•„์˜ˆ k6 test๋ฅผ ์‹คํ–‰ํ•˜์ง€๋„ ๋ชปํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

3. k6 ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ถ„์„

CLI๋ฅผ ํ†ตํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ metrics๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๊ณต์‹๋ฌธ์„œ ์— ์ž์„ธํ•˜๊ฒŒ ๋‚˜์™€์žˆ๋Š”๋ฐ, ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ์ง€ํ‘œ๋“ค์˜ ์ด๋ฆ„๋งŒ ๋ด๋„ ๋Œ€๋žต์ ์œผ๋กœ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์žˆ๊ธด ํ•˜๋‹ค. ๋‚˜์ค‘์— ์‹ค๋ฌด์— ๋‚ด๊ฐ€ ์ ์šฉํ•œ๋‹ค๋ฉด ์ค‘์š”ํ•˜๊ฒŒ ๋ณผ ๊ฒƒ ๊ฐ™์€ ์ง€ํ‘œ๋Š” http_req_duration๊ณผ http_reqs์ด๋‹ค. http_req_duration์„ ํ†ตํ•ด์„œ๋Š” ํ‰๊ท ์ ์œผ๋กœ ํ•œ๋ฒˆ์˜ ์š”์ฒญ๋‹น ์–ผ๋งˆ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ , http_reqs๋ฅผ ํ†ตํ•ด์„œ๋Š” ํ‰๊ท ์ ์ธ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ์ง€ํ‘œํ™” ํ•ด์„œ ๋ชฉํ‘œ์™€์˜ ๊ฐญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฃผ์˜ ํ•ด์•ผํ•  ์ ์€ http_reqs๋Š” ์ด request ๊ฐฏ์ˆ˜๋ผ๋Š” ์‚ฌ์‹ค์ด๋‹ค. โ€˜๋กœ๊ทธ์ธ->ํšŒ์›๊ฐ€์ž…โ€™ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•œ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด http_reqs๋Š” 2 ์ด๋‹ค.

์ด ๋ถ€๋ถ„์— ๊ด€ํ•ด์„œ๋Š” ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ํฌ์ŠคํŒ…์—๋„ ์จ๋‘์—ˆ์ง€๋งŒ ๋‚ด ๊ธฐ์ค€์— ์ •๋ง ์™„๋ฒฝํžˆ ์„ค๋ช…๋œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐพ์•„์„œ ์—ฌ๊ธฐ๋„ ๋ง๋ถ™์ธ๋‹ค.

๊ฒฐ๊ตญ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ ๋ชฉํ‘œ๋Š” Throughput ๊ณผ Latency ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด ๋‚ด์šฉ์— ๊ด€ํ•ด์„œ ์นœ์ ˆํžˆ ์„ค๋ช…๋œ ๋ธ”๋กœ๊ทธ ๋ฅผ ์ฐพ์•˜๋‹ค. ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋Œ€ํ•œ ํฌ์ธํŠธ๊นŒ์ง€ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์–ด์„œ ์ •๋ง ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

Last updated