최범균 님의 "주니어 백엔드 개발자가 반드시 알아야 할 실무 지식" 책을 정리한 포스팅 입니다.
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 응답 헤더: 서버에서 처리한 압축 알고리즘을 클라이언트에 알림
대기 처리
- 순간적으로 사용자 트래픽이 폭증할 때 대처하는 방식
- ✅ 서버가 감당할 수 있는 양만 받아들이고, 초과된 요청은 대기열에 넣는 방식
- ➡️ 서버를 증설하지 않고도 서비스를 안정적으로 제공할 수 있음
- ➡️ 사용자의 지속적인 새로고침으로 인한 트래픽 폭증 방지 (순번이 뒤로 밀리므로 사용자는 불필요한 새로고침을 자제하게 됨)