학습일지/부하테스트
[k6] 부하테스트 맛보기
Merge Log
2025. 9. 25. 19:01
부하테스트의 필요성 인식
- 지금 만든 서비스의 모든 API 에 대해 부하 테스트를 할 필요는 없다
- 지금 서비스의 핵심 기능이 무엇이고 이 기능이 우리가 목표한 혹은 앞으로 달성해야할 포인트에 도달하는가를 생각해야한다
- "현재 서버는 어느 정도 사용량을 견딜 수 있는건가?"
- "앞으로 치킨 이벤트가 발생하는게 서버가 견딜 수 있을까?"
- 부하테스트를 해야하는 기능을 찾고 목표를 세우자
- 부하 테스트 목표는 주로 Throughput 과 Latency 를 활용해 설정한다
- "목표 TPS : 2000 TPS"
- "평균 Latency : 800 ms"
병목 지점 파악 후 성능 개선
- 성능 개선을 하기 전에 먼저 병목 지점이 어디인지 파악해야 한다
- 그리고 목표치에 대한 현재 성능 지표를 먼저 뽑아내라
주의사항
- 성능을 측정하기에 앞서 해당 서비스가 어떤 도메인과 어떻게 사용자가 사용하는지를 파악해야 한다
- 만약 한 사람당 평균 1시간 정도 사용하는 서비스인데 3분만 테스트 하는 등의 실제 환경과 일치하지 않는 테스트
- 정확한 결과값을 위해 프로덕션 환경과 비슷하게 테스트 해야한다
- 프로덕션 환경의 데이터들이 포함된 DB 복제본을 떠서 그 DB 로 부하 테스트를 진행하기도 한다
- 프로덕션과 분리된 환경에서 테스트를 해야 한다
실제 테스트 구성

- Ramp-up 방식으로 부하 테스트 진행
- 부하를 서서히 올리면서 시스템이 점진적으로 늘어나는 트래픽을 어떻게 처리하는지 보는 방식
- RDS 에 테스트 데이터 100만건 생성 (게시글)
k6 script
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
// 부하를 생성하는 단계(stages)를 설정
stages: [
// 10분에 걸쳐 vus(virtual users, 가상 유저수)가 50에 도달하도록 설정
{ duration: '10m', target: 50 }
],
};
export default function () {
let random = Math.random();
// ex. 100명 중 5명의 비율로 게시글을 작성
if (random < 0.05) {
const data = { title: '제목', content: '내용' };
http.post('http://{ALB주소}/boards', JSON.stringify(data), {
headers: { 'Content-Type': 'application/json' },
});
} else {
//ex. 100명 중 95명의 비율로 게시글을 조회
http.get('http://{ELB 주소}/boards');
}
// 1초 휴식
sleep(1);
}
- 10분에 걸쳐 점진적으로 최대 50명의 요청
- 요청의 5%는 게시글 생성 API 요청
- 1초 주기로 요청
k6 Ramp-up

실제 모니터링

- 위 모니터링을 보고 대략 해당 서비스는 4RPS 정도 되는구나 라고 확인
- 가용가능한 RPS 를 넘어가면 점점 평균 Latency 시간이 늘어남
왜 4 RPS 가 발생했는지 모니터링으로 확인

- EC2 (애플리케이션 서버) 의 CPU, 메모리
- RDS 의 CPU, 메모리
- 각각 지표를 확인한 결과 4 RPS 지점에서 RDS 의 CPU 사용률이
93.7%라는 것을 알 수 있다