Returnz 부하 테스트

강혜성·2023년 4월 5일
0

분산처리

목록 보기
15/18

부하 테스트를 진행한다.

locust file

import time
from locust import HttpUser, task, between
import json
import random

game_room_list = [
    {
        "roomId" : "e47b2a75-003f-4420-bdaa-eed369f121b4",
        "gamerId" : 1329
    },
    {
        "roomId": "71cf2f67-0dbd-4540-b1bb-dcfe7468e2c3",
        "gamerId": 1330
    },
    {
        "roomId": "fd7906a9-1c6c-414a-9ae6-cdd1130bd60b",
        "gamerId": 1331
    }, 
    {
        "roomId": "941e133b-536d-4d45-817b-3fd1152dce5e",
        "gamerId": 1332
    },
    {
        "roomId": "33609155-5960-4686-98b0-36ecde8ba1e4",
        "gamerId": 1333
    },
    {
        "roomId": "706bd11b-a91f-469b-af7c-86872e8e2123",
        "gamerId": 1334
    },
    {
        "roomId": "13819427-6f64-45f0-9218-655604194b73",
        "gamerId": 1335
    },
    {
        "roomId": "62b7d4bd-4fe0-4ebc-adc3-9fb8ca20bf2e",
        "gamerId": 1336
    },
    {
        "roomId": "b0795412-4675-4b9b-8b0b-f51ed38892f7",
        "gamerId": 1337
    },
    {
        "roomId": "be8fe367-f0ae-4f57-8abd-f635f9def5da",
        "gamerId": 1338
    },
    {
        "roomId": "63eedc5e-4b42-49d4-942a-66188a7303b7",
        "gamerId": 1339
    },
    {
        "roomId": "7c0ca297-1305-4cb2-9788-780fffb18dab",
        "gamerId": 1340
    },
    {
        "roomId": "10c9a2d2-7355-4146-b5d4-5add9d617f41",
        "gamerId": 1341
    },
    {
        "roomId": "906fa5b2-233d-45f7-a5c4-083feafb8023",
        "gamerId": 1342
    },
    {
        "roomId": "0066ffb9-4862-45e0-9de2-2de1177a709d",
        "gamerId": 1343
    },
    {
        "roomId": "159c630a-f1ee-46f1-907f-b1313238e576",
        "gamerId": 1344
    }

]

class QuickstartUser(HttpUser):
    wait_time = between(3, 5)

    # 닉네임 조회 Task
    @task
    def chat_room(self):
        self.client.get("/")
        self.client.post("/api/members/login", json={"username":"moon5@naver.com", "password":"ssafy123!"})
      
    # 게임 생성 Task
    @task
    def game_create(self):
        self.client.get("/")
        self.client.post("/api/games/init", json={"theme":"COVID",
        "turnPerTime":"DAY",
        "startTime":0,
        "totalTurn":10,
        "memberIdList":[1]})
        

    # 게임 진행 Task
    @task
    def game_progress(self):
        list_index = random.randrange(0, len(game_room_list))
        self.client.get("/")
        self.client.post("/api/games/game", json={json.dumps(game_room_list[list_index])})
  • 게임방을 미리 생성해둔 채로 진행.

  • 닉네임 조회, 게임 생성, 게임 조회를 수행하도록 함.

  • 게임방 생성을 계속해서 해줘야 하므로, 한번의 테스트로 Insight를 얻을 수 있도록 Number of Users, spawn rate를 조정

  • 게임 방 진행시 가져오는 Data가 많고, DB에서 탐색해야 하는 데이터도 많기 때문에 RPS가 낮고, 응답 시간 또한 낮을 거라 판단.
  • 게이방 처음 진입 시, 대량의 데이터를 한번에 가져오기 때문에, 초기 Response Times 95%가 비선형적으로 증가한다고 판단.

부하 테스트 결과

  • Total Request per Second를 분석하면 제일 작은 RPS는 10.3 이였다.
  • 최대 RSP는 약 15이다.
  • Failure는 닉네임 조회, 로그인, 메인 화면 진입시에 발생했다.
  • Response time 50th percentile은 16 ~ 18사이로 균등하다
  • Response time 95th percentile은 꾸준히 증가한다. (3200ms ~ 34000ms)
  • Response Time 95th percentile이 줄어들다 증가하는 구간의Number of Users는 33이다.
  • 해당 경우의 Response Time 95th percentile은 4600ms이다.

분석 결과

  • 게임 진행 시 처리해야 하는 데이터가 많기 때문에 응답시간이 어느정도 낮다는 걸 고려한 결과 최대 처리할 수 있는 유저의 수는 33명이라 가정한다.
  • locust에서는 3, 5초 사이로 Task를 수행하도록 설정했지만, 실제 게임에서는 이보다 긴 1분 이내에서 Task가 수행되기때문에 테스트 보다 안정적일 것이라 생각한다.

0개의 댓글