초기 부하 테스트 진행 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 테스트 세팅
a. VM 인프라 구성
역할 | 인스턴스 스펙 | 설명 |
---|---|---|
FastAPI 서버 | e2-medium (vCPU 1~2 (공유 코어 1개), RAM 4GB) |
GCS에서 이미지 70~100개 다운로드 처리 |
K6 서버 | n2-standard-4 (vCPU 4, RAM 16GB) |
테스트 트래픽 생성기 |
b. Cloud Storage 구성
- 버킷 이름:
my-bucket1008
- 경로:
test-images/image_001.jpg ~ image_100.jpg
- 스펙: Standard Tier (전송 성능 최적화됨)
c. 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)}장 로딩 완료"})
- 요청당 70~100장의 이미지 다운로드
- 실패 시 즉시 500 응답 반환
d. K6 부하 테스트 스크립트
export const options = {
vus: 30, // 동시 가상 유저 수
duration: '10m', // 테스트 시간
};
function getRandomImageList() {
const total = Math.floor(Math.random() * 31) + 70; // 70~100개
...
}
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): 약
4.9초
-
요청 성공률:
100%
지표 수치 P95 응답 시간 약 4.9초 실패율 0%
3. 회고
- 사진 처리량이 우리 서비스의 예상 요청 규모에 비해 커서 현실성 있는 예측이 어려움
- 부하 테스트 이후, 테스크별 cpu, gpu 리소스 사용량 테스트 결과 부하 테스트에 사용한 fast api 인스턴스는 충분치 않다는 판단을 하게 되어 적정 인스턴스로 교체 후, 재테스트 요함
- 처리 속도가 너무 느리기 때문에 요청 규모와 인스턴스 유형을 변경하고 처리 속도 재확인한 후, 여전히 지연 시간이 길면 병목 개선 방안 탐색 요함
- k6 서버는 인스턴스 스펙이 과했음을 알게 되어 vCPU2, mem 4gb의 인스턴스로 교체 요함