본문 바로가기
카테고리 없음

성능이 떨어지는 경우 어떻게 판단할까

by Alohawaii 2026. 3. 19.

서비스 성능 저하는 단순히 "느리다"가 아니라, 지표 기반으로 판단해야 합니다.

핵심은 정량적인 수치 + 병목 구간 파악입니다.

 


1. 주요 성능 판단 지표

① 응답 시간(Latency)

  • API 응답 속도
  • 페이지 로딩 시간

기준 예시

  • 100ms 이하: 매우 빠름
  • 300~500ms: 일반적인 수준
  • 1초 이상: 사용자 체감 느림

②처리량(Throughput)

  • 초당 처리 요청 수(TPS, RPS)

  • 100 TPS -> 정상
  • 20 TPS로 감소 -> 성능 저하 의심

③에러율(Error Rate)

  • 5xx 에러 증가
  • 타임아웃 발생

-> 서버 과부하 또는 장애 가능성

 


④리소스 사용률

  • CPU 사용률
  • 메모리 사용량
  • GC 발생 빈도
  • 스레드 수

특히

  • CPU 90% 이상 지속 -> 병목 가능성
  • 메모리 부족 -> GC 증가 -> 성능 저하

성능 저하 판단 방법

 

1. 기준과 비교

정상 상태의 성능 기준을 먼저 정의

평균 응답시간: 200ms
TPS: 150
에러율: 0.1%

-> 현재 값과 비교하여 이상 여부 판단

 


2. 병목 구간 분석

성능 문제는 대부분 특정 구간에서 발생합니다.

 

주요 병목 포인트

  • DB 쿼리
  • 외부 API 호출
  • 네트워크 지연
  • 락(Lock) 경합
  • 스레드 부족

3. 모니터링 도구 활용

대표적인 도구

  • Prometheus
  • Grafana
  • New Relic

이 도구들을 활용하여 요청 시간 분포, 트랜잭션 흐름, DB 쿼리 시간등을 확인합니다.


4. 로그 및 트레이싱 분석

  • Slow Query 로그
  • 애플리케이션 로그
  • 분산 트레이싱

-> 어떤 API, 어떤 로직이 느린지 식별한다.


성능 저하의 대표적인 징후

  • 응답 시간이 점점 증가
  • 특정 시간대에만 느려짐(트래픽 증가)
  • CPU/메모리 급증
  • 타임아웃 발생
  • DB 쿼리 지연

핵심 접근 방법

"느리다" -> 지표 확인 -> 병목 구간 찾기 -> 원인 분석

 

먼저 응답 시간, TPS, 에러율 같은 핵심 지표를 확인하고, 정상 상태의 기준 값과 비교하여 이상 여부를 판단합니다. 예를 들어 응답 시간이 증가하거나 TPS가 감소하고, 에러율이 올라가면 성능 저하로 볼 수 있습니다.

 

이후에는 CPU, 메모리, 스레드 같은 리소스 사용량을 확인하고, APM이나 로그를 통해 DB 쿼리, 외부 API 호출, 네트워크 등 병목 구간을 분석합니다. 즉, 성능 문제는 지표 확인 -> 병목 식별 -> 원인 분석 순서로 접근합니다.

 


소스 레벨에서 성능 저하를 판단하는 방법

인프라 지표(CPU, TPS 등)가 아니라 코드 레벨에서 성능 문제를 판단할 때는 "어디서 시간이 쓰이고 있는지"를 파악하는 것이 핵심입니다.

 

1. 실행 시간 측정(가장 기본)

특정 로직의 실행 시간을 직접 측정합니다.

long start = System.currentTimeMillis();

// 비즈니스 로직 실행

long end = System.currentTimeMillis();
System.out.println("실행시간: " + (end - start));

-> 어떤 메서드가 느린지 1차적으로 확인 가능


2. 로그 기반 분석

단순 시간 측정 + 로그를 함께 활용

log.info("A 시작");
// 로직
log.info("A 종료");

-> 요청 흐름에서 어느 구간이 느린지 파악


3. 프로파일링

코드 단위에서 가장 정확한 방법

 

대표 도구

  • VisualVM
  • YourKit

확인 포인트

  • 메서드별 실행 시간
  • 호출 횟수
  • CPU 사용률
  • 메모리 할당

-> 핫스팟(가장 오래 걸리는 코드) 찾기


4. 코드 레벨 병목 패턴

① 반복문 안의 비효율

for(...) {
	db.select(); // 반복문마다 DB 호출
}

-> N+1 문제 발생


②불필요한 객체 생성

for(...) {
	new Object(); // 반복 생성
}