카테고리 없음

[주니어 백엔드 개발자가 반드시 알아야 할 실무 지식] 2. 느려진 서비스, 어디부터 봐야 할까

noahkim_ 2025. 8. 21. 01:13

최범균 님의 "주니어 백엔드 개발자가 반드시 알아야 할 실무 지식" 책을 정리한 포스팅 입니다.

 

1. 처리량과 응답 시간

응답 시간 (Response Time)

  • 사용자의 요청을 처리하는데 걸리는 시간

 

구성
  • API 요청: 서버 연결, 서버에 데이터 전송
  • 서버 실행
  • API 응답: FFTB(첫번쨰 바이트 도착), FFLB(마지막 바이트 도착)

 

처리량 (Throughput)

  • 단위 시간 당 시스템이 처리하는 작업량
  • TPS: 초당 트랜잭션 수
  • RPS: 초당 요청 수

 

2. 서버 성능 개선 기초

병목 지점

  • 시스템이 수용할 수 있는 최대 TPS를 초과하는 트래픽이 유입될 경우 발생
  • ➡️ 오래 걸리는 작업 식별하기 (주로 DB나 외부 API 연동에서 발생함)

 

DB 커넥션 풀

  • 커넥션 풀은 커넥션을 미리 생성해서 보관함
  • ⚠️ 커넥션 생성 및 종료는 0.5~1초 정도 소요됨
  • ‼️ 병목 지점

 

설정) max/min size

더보기
  • 크기를 늘리면 처리량을 늘릴 수 있음
  • ✅ 너무 크면 성능 저하 (DB CPU 부하 등)
  •  너무 작으면 대기시간이 길어져 응답 지연 발생
  • ➡️ 적절한 수로 설정하는 것 중요
  • ➡️ 평균 응답 시간과 전체 TPS 및 DB 서버 스펙 고려
  • ➡️ 트래픽 패턴에 따라 유동적으로 운영 (자동 스케일링)

 

설정) connection timeout

더보기
  • 커넥션을 얻을때까지 대기할 수 있는 최대 시간
  • ✅ 최악의 경우, 응답시간이 최대 시간까지 길어질 수 있음
  • ➡️ 가능한 짧게 설정해야 함

 

설정) idle timeout

더보기
  • 안쓰는 커넥션 유효기간
  •  이 커넥션이 마지막으로 사용된 이후 얼마나 사용 안되었는지
  • ✅ 풀에 있는 커넥션이 일정 시간 이상 사용되지 않으면 DB와의 연결이 끊길 수 있음
  • ➡️ 이를 방지하기 위해 풀은 커넥션의 최대 유휴 시간을 지정하게 해줌

 

설정) max lifetime

더보기
  • 커넥션 최대 유효 시간
  •  이 커넥션이 생성된 지 얼마나 지났는지

 

가비지 컬렉터

  • 더이상 사용하지 않는 객체를 찾아서 힙 메모리에서 정리해줌
  • ✅ JVM이 자동으로 실행 (힙 메모리 사용량이 일정 비율 초과, 일정 주기)
  • ➡️ 메모리를 직접 관리해야 하는 부담을 줄여줌
  • ➡️ 보안 이슈를 줄여줌
  • ⚠️ 가비지 컬렉터가 실행되는 동안 애플리케이션 실행이 일시 중지됨 (Stop-The-World)
  • ⚠️ 메모리 크기가 커질수록 GC 실행 시간이 길어짐
  • ➡️ 대량 데이터를 한 번에 메모리에 올리지 않기 (스트림 활용)

 

응답 데이터 압축

  • 전송 데이터 크기가 커질수록 응답 시간이 길어짐
  • ✅ 서버는 네트워크 속드는 제어할 수 없지만, 전송하는 데이터의 크기는 제어할 수 있음
  • ➡️ 응답 데이터를 압축해서 전송하기 (텍스트 데이터 - HTML, CSS, JS, JSON)
  • ⚠️ 방화벽이 압축 설정을 해제할 수 있음

 

HTTP) Header

더보기
  • Accept-Encoding 요청 헤더: 클라이언트가 처리할 수 있는 압축 알고리즘을 서버에 알림
  • Content-Encoding 응답 헤더: 서버에서 처리한 압축 알고리즘을 클라이언트에 알림

 

대기 처리

  • 순간적으로 사용자 트래픽이 폭증할 때 대처하는 방식
  • ✅ 서버가 감당할 수 있는 양만 받아들이고, 초과된 요청은 대기열에 넣는 방식
  • ➡️ 서버를 증설하지 않고도 서비스를 안정적으로 제공할 수 있음
  • ➡️ 사용자의 지속적인 새로고침으로 인한 트래픽 폭증 방지 (순번이 뒤로 밀리므로 사용자는 불필요한 새로고침을 자제하게 됨)