부하 용량 변경 및 인스턴스 유형 변경 후 부하 테스트 진행 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 테스트 세팅 변경 사항

  • 인스턴스 유형 변경
  • 부하량 감소 (서비스 규모에 맞춰)

a. VM 인프라 구성

역할 인스턴스 스펙 설명
FastAPI 서버 n2d-standard-4 (vCPU 4개, 메모리 16GB) GCS에서 이미지 30~50개 다운로드 처리
K6 서버 e2-medium (vCPU 2개, 메모리 4GB) 테스트 트래픽 생성기

b. FastAPI 서버 코드 요약

@app.get("/images")
def get_images(file_names: List[str] = Query(...)):
    for file_name in file_names:
        blob = bucket.blob(f"test-images/{file_name}")
        _ = blob.download_as_bytes()  # GCS에서 이미지 다운로드
    return JSONResponse(status_code=200, content={"message": f"이미지 {len(file_names)}장 로딩 완료"})
  • 요청당 30~50장의 이미지 다운로드
  • 실패 시 즉시 500 응답 반환

c. K6 부하 테스트 스크립트

export const options = {
  vus: 30,             // 동시 가상 유저 수
  duration: '10m',     // 테스트 시간
};

function getRandomImageList() {
  const total = Math.floor(Math.random() * 21) + 30; // 30~50개
  ...
}

export default function () {
  const query = getRandomImageList();
  const res = http.get(`${BASE_URL}/images?${query}`);
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(Math.random() * 2 + 3);
}

2. 테스트 결과 요약

  • 평균 응답 시간(P95): 약 3.3초

  • 요청 성공률: 100%

    지표 수치
    P95 응답 시간 약 3.3초
    실패율 0%

3. 회고

  • 이미지를 한 장씩 다운로드하기 때문에 순차 진행으로 인한 지연 시간이 길다. → 병렬 다운로드로 속도 개선하자
  • 버킷과 연결하는 세션 객체를 매 연결마다 생성하고 있어 지연이 발생한다(인증 및 연결 과정) → 클라이언트 세션 객체를 통해 GCS 버킷 객체를 서버에서 미래 만들어두고 재사용하는 방식으로 속도 개선하자