Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • rsocket
  • til
  • Android
  • Docker
  • 안드로이드
  • SQL
  • 문자열
  • 코딩테스트
  • 다이나믹 프로그래밍
  • enum
  • Wil
  • 코틀린 인 액션
  • spring
  • 에라토스테네스의 체
  • kibana
  • 우아한테크코스
  • kotlin
  • 내림차순
  • MariaDB
  • 프리코스
  • webflux
  • ec2
  • 코틀린
  • java
  • grafana
  • 프로그래머스
  • 파이썬
  • 백준
  • elasticsearch
  • 레포지토리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20230622] K6 성능 테스트 시나리오 작성
TIL

[TIL - 20230622] K6 성능 테스트 시나리오 작성

2023. 6. 23. 02:10

 

💻문제점

흠 여러 명이 후원하는 것에 대해 K6로 성능 테스트를 하려고 했는데 401 오류가 떴다. token이 필요한 API라 access_token을 요청 헤더에 넣어주긴 해야하는데... k6 테스트할 때에는 어떻게 하지?

 

우선 k6의 라이프 사이클에 대해 알아보면, 크게 4가지 라이프 사이클이 있다.

각 단계에 대한 설명은 여기를 참고

// 1. init code

export function setup() {
  // 2. setup code
}

export default function (data) {
  // 3. VU code
}

export function teardown(data) {
  // 4. teardown code
}

 

토큰은 3단계 시나리오를 실행하기 전에 2단계에서 설정을 해주어야 할 것 같다.


🔍해결

계속 로그인해서 토큰을 응답 헤더에서 가져오는 부분이 문제가 있었는데, 요청 url이 http가 아니라 https 여서 안 됐던 것이었다...ㅠㅠ 깨달으면 비로소 보이는 것....,,,,,, 이 외에도 이런저런 문제가 있었지만,, 블로그 적는 걸 까먹어서 지금은 다 날아갔다.

 

그리고 계속 테스트가 fail이 뜨길래 뭐가 문제지 했더니 test6한테 충분한 포인트가 없어서..ㅎㅎ

 

test6에게 2백만 포인트를 넣어주고, test7에게 후원하는 걸로 테스트를 수행했다.

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

export const options = {
    vus: 50, //가상 사용자 수
    duration: '20s'
};

const USERID = `test6`;
const PASSWORD = '1234';
const BASE_URL = '요청 url';

const signup = {
    userId: USERID,
    password: PASSWORD,
    nickname: USERID
};

const login = {
    userId: USERID,
    password: PASSWORD,
};

export function setup() {
    const loginRes = http.post(`${BASE_URL}/members/login`, JSON.stringify(login), {
        headers: {
            'Content-Type': 'application/json'
        }
    });

    const authToken = loginRes.headers['Access_token'];
    check(authToken, {'login in successfully': () => authToken !== ''});

    return authToken;
}

const payload = {
    streamer: 'forTest7',
    points: 100,
    message: 'testMessage',
};

const myTrend = new Trend('response time') //커스텀 메트릭

export default (authToken) => {
    const res = http.post(`${BASE_URL}/points/spend`, JSON.stringify(payload), {
        headers: {
            Access_Token: `${authToken}`,
            'Content-Type': 'application/json'
        },
    });
    myTrend.add(res.timings.duration); //커스텀 메트릭
    check(res, {"scenario status is 200": (res) => res.status === 200});
    sleep(1);
};

 

총 요청은 (로그인 요청 + 후원 요청) 이다. 1001번 이니까, 후원 요청은 1000번 수행되고, 100 포인트씩 후원했으므로 test7은 십만 포인트를 가져야한다. 과연 db도 잘 반영됐을지?

동시성 문제 없이 잘 반영이 되었다..!

 

test6은 현재 가상 사용자를 이용해서 모든 사용자들이 test6의 로우를 수정하다보니 동시성 문제가 있는데, 실제 서비스에서는 자기 자신밖에 수정하지 못하기 때문에 문제는 없을 것 같다...!

 

이번에는 가상 사용자 3000명, duration은 30s로 설정했다.

 

근데 생각해보니,, 3천명이 동시에 후원할 일은 현실에서 드물 것 같다... 

조금 더 현실적인 수를 생각해보자면 300~500명 정도?

 

내일 Grafana도 켜서 확인해봐야겠다.

 

728x90

'TIL' 카테고리의 다른 글

[TIL - 20230628] 후원 비관적 락 -> Redis 분산 락 변경 (동시성)  (0) 2023.06.29
[TIL - 20230623] rsocket 채팅창에 후원 내역 띄우기  (0) 2023.06.24
[TIL - 20230621] Webflux R2DBC 후원 동시성 문제 해결  (0) 2023.06.22
[TIL - 20230620] Webflux CORS  (0) 2023.06.21
[TIL - 20230616]  (0) 2023.06.17
    'TIL' 카테고리의 다른 글
    • [TIL - 20230628] 후원 비관적 락 -> Redis 분산 락 변경 (동시성)
    • [TIL - 20230623] rsocket 채팅창에 후원 내역 띄우기
    • [TIL - 20230621] Webflux R2DBC 후원 동시성 문제 해결
    • [TIL - 20230620] Webflux CORS
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바