Foundry
성능 최적화
심화

부하 테스트와 용량 산정

서버가 몇 대 필요한지 숫자로 답하는 방법

부하를 올리며 처리량이 더 안 오르는 포화점을 찾습니다. 운영 용량은 그 지점이 아니라 여유를 둔 값으로 잡습니다.

부하 테스트와 용량 산정

테스트 종류

부하를 올리면 어느 지점까지는 처리량이 늘고 그 뒤로는 지연만 늘어난다 처리량 부하 여기가 한계 한계 전에는 부하를 올리면 처리량이 함께 오른다 한계 뒤에는 처리량이 안 오르고 지연만 길어진다 그 지점을 찾는 것이 시험의 목적이다. 터질 때까지 올려야 보인다
종류목적
스모크최소 부하로 시나리오와 계측이 동작하는지 확인
부하예상 평시와 피크 부하에서 지표 충족 여부 확인
스트레스한계점과 그때의 실패 양상 파악
스파이크급증 트래픽에 대한 회복력 확인
내구장시간 유지 시 자원 누수와 성능 저하 확인

용량 산정 예

DAU 100,000, 1인당 요청 20건 -> 일 200만 요청
평균 RPS = 2,000,000 / 86,400 = 약 23
피크 배수 5배 가정 -> 목표 약 120 RPS
1대 실측 60 RPS (p99 목표 내) -> 2대 + 여유 1대

무엇이 먼저 한계에 닿나

용량은 서버 대수가 아니라 가장 먼저 막히는 자리로 정해집니다.

자리한계의 모양
DB 연결자리를 기다리며 응답 시간이 계단처럼 뛴다
CPU사용률이 붙고 지연이 완만히 오른다
외부 API우리 쪽 지표는 여유로운데 느리다
커넥션 풀이나 스레드 수처리량이 어느 선에서 평평해진다

셋째를 자주 놓칩니다. 우리 서버를 늘려도 상대가 못 받으면 아무것도 나아지지 않습니다.

평균이 아니라 몰리는 순간으로 잡는다

하루 평균으로 잡으면 가장 필요한 시간에 부족합니다.

하루 요청을 86400 으로 나눈 값은 실제 필요량이 아니다
몰리는 시간의 초당 요청을 기준으로 잡는다
거기에 여유를 둔다. 여유가 없으면 한 대가 빠질 때 나머지가 넘친다

셋째가 대수를 정합니다. 세 대로 딱 맞으면 한 대가 빠질 때 남은 둘이 1.5배를 받습니다. 그것을 견디는지가 실제 기준입니다.

실무 포인트

  • 목표는 RPS 단독이 아니라 지연 조건과 함께 정한다. 지연 기준 없는 처리량 수치는 의미가 없다
  • 캐시가 비어 있는 상태와 채워진 상태를 나눠 측정한다. 워밍된 상태만 재면 배포 직후를 놓친다
  • 부하를 계단식으로 올려 지표가 꺾이는 지점을 찾고, 그때 포화된 자원(CPU, 커넥션, 디스크)을 기록한다
  • 테스트 환경은 운영과 같은 사양, 데이터 규모여야 한다. 데이터가 적으면 인덱스 문제가 드러나지 않는다
면접에서 이렇게 나옵니다

Q.부하 테스트 종류를 나누고 각각 언제 수행하나요?

목적이 다르므로 언제 하는지도 다릅니다.

종류무엇을 보나언제
부하 테스트예상 트래픽에서 지연과 오류율이 목표 안인가배포 전, 정기적으로
스트레스 테스트어디서 무너지고 어떻게 무너지나용량 산정 때
스파이크 테스트갑자기 몰릴 때 견디고 회복하나이벤트나 오픈 전
내구 테스트오래 돌릴 때 새는 것이 있나큰 변경 뒤
용량 테스트목표 지연을 지키는 최대 처리량은 얼마인가증설 계획 때

둘째의 "어떻게" 가 핵심입니다. 한계를 넘었을 때 느려지기만 하는지, 오류를 돌려주는지, 아니면 통째로 죽는지가 완전히 다릅니다. 죽는 구조면 한계에 닿기 전에 막아야 합니다.

넷째는 짧은 테스트로는 절대 안 보입니다. 메모리 누수, 커넥션 누수, 디스크 채움은 시간이 지나야 드러납니다. 큰 변경 뒤에는 몇 시간짜리를 한 번 돌리는 것이 값이 큽니다.

흔한 실수: 부하 테스트만 하고 끝내는 것. 목표 트래픽에서 통과했다는 것은 그 지점까지만 안다는 뜻이고, 여유가 얼마나 남았는지는 모릅니다. 한계를 한 번은 찾아 둬야 증설 시점을 정할 수 있습니다.

Q.서버 대수를 산정하는 과정을 설명해주세요

평균이 아니라 몰리는 순간에서 시작합니다.

  1. 몰리는 시간대의 초당 요청을 구합니다. 하루 요청을 86400 으로 나눈 값은 실제 필요량이 아닙니다. 대개 몰리는 시간이 하루 요청의 큰 몫을 가져갑니다.
  2. 서버 한 대의 처리량을 잽니다. 목표 지연을 지키면서 낼 수 있는 초당 요청입니다. 최대 처리량이 아니라 목표 지연 안에서의 처리량입니다.
  3. 나눕니다. 필요 대수 = 몰리는 초당 요청 / 대당 처리량.
  4. 여유를 더합니다. 한 대가 빠져도 남은 대수가 받을 수 있어야 합니다.
  5. 뒤쪽 한계를 확인합니다. DB 연결 수, 외부 API 한도가 대수를 곱한 만큼 늘어납니다.

4번이 대수를 실제로 정합니다. 세 대로 딱 맞으면 한 대가 빠질 때 남은 둘이 1.5배를 받습니다. 그걸 견디는지가 진짜 기준입니다.

5번을 자주 놓칩니다. 서버 10대에 커넥션 풀 50이면 DB 는 500개의 연결을 받습니다. 우리 쪽을 늘려서 뒤쪽을 무너뜨리는 것이 증설 사고의 흔한 모양입니다.

흔한 실수: 대당 처리량을 최대치로 잡는 것. 최대 처리량 지점은 이미 지연이 나빠진 구간입니다. 목표 지연을 지키는 지점으로 잡아야 계산이 현실과 맞습니다.

Q.부하 테스트 결과에서 병목 자원을 어떻게 판단하나요?

지표가 같이 오르는지 따로 노는지를 봅니다.

관찰병목 후보
CPU 사용률이 붙고 지연이 완만히 오른다CPU
CPU 는 한가한데 지연만 오른다기다림. DB, 외부 호출, 락
처리량이 어느 선에서 평평해진다개수 상한. 커넥션 풀, 스레드 수
지연이 계단처럼 뛴다자리 대기. 풀에서 자리를 기다린다
우리 쪽은 전부 여유로운데 느리다외부 의존

둘째와 다섯째를 구분하는 것이 중요합니다. 둘 다 CPU 가 한가한데, 하나는 우리 DB 고 하나는 남의 API 입니다. 대응이 완전히 다릅니다.

부하를 단계적으로 올리면서 처리량과 지연을 같이 그리면 무릎이 보입니다. 처리량이 더 안 오르는데 지연만 오르기 시작하는 지점이 한계입니다. 그 지점 직전의 자원 지표를 보면 무엇이 먼저 찼는지 드러납니다.

동시 사용자 수를 늘려도 처리량이 그대로면, 병목이 우리 서버 바깥에 있을 가능성이 큽니다. 부하 생성기 자신이 한계일 수도 있으므로 그것도 의심해야 합니다.

흔한 실수: 평균 지연만 보는 것. 평균은 멀쩡한데 상위 구간이 무너지는 경우가 많고, 사용자가 겪는 것은 그 상위 구간입니다.

Q.테스트 환경과 운영 환경 차이 때문에 놓치기 쉬운 문제는?

가장 크게 어긋나는 것은 데이터입니다.

차이놓치는 문제
데이터 양이 적다색인 없이도 빨라서 느린 질의를 못 잡는다
데이터 분포가 고르다쏠린 키, 특정 사용자의 큰 목록이 없다
캐시가 데워져 있다실제 적중률보다 좋게 나온다
외부를 가짜로 대체상대가 느려질 때의 동작을 못 본다
사양과 대수가 다르다계산이 그대로 안 옮겨진다
한 지역에서만 시험실제 사용자의 네트워크 지연이 빠진다

첫 줄과 둘째 줄이 압도적입니다. 운영에서 느린 질의는 대개 데이터가 쌓였거나 한 사용자가 유난히 많은 데이터를 가졌기 때문인데, 깨끗한 시험 데이터로는 절대 안 보입니다.

캐시도 조심해야 합니다. 같은 요청을 반복해 던지면 적중률이 100%에 가까워져 실제보다 훨씬 좋은 숫자가 나옵니다. 키를 실제 분포와 비슷하게 흩어야 의미가 있습니다.

외부 의존을 가짜로 바꿀 때는 지연도 같이 흉내 내야 합니다. 즉시 응답하는 가짜를 두면 타임아웃과 재시도 경로가 한 번도 안 돌아 본 채 배포됩니다.

흔한 실수: 시험 통과를 운영 안전으로 읽는 것. 통과한 것은 그 데이터와 그 구성에서 통과한 것입니다. 차이를 목록으로 적어 두고, 그중 무엇을 못 본 채 배포하는지 알고 넘어가는 편이 낫습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

더 깊이 공부하기

읽었으면 문제로 확인해보세요

성능 최적화 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.