반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 버전관리
- 컴퓨터과학
- 빅데이터
- 웹개발
- springboot
- 프로그래밍
- 네트워크보안
- Yes
- 알고리즘
- 자바스크립트
- 디자인패턴
- 딥러닝
- 컴퓨터비전
- 파이썬
- 데이터과학
- 소프트웨어
- 머신러닝
- 인공지능
- 데이터베이스
- 프로그래밍언어
- 클라우드컴퓨팅
- 데이터구조
- 데이터분석
- 네트워크
- 컴퓨터공학
- 소프트웨어공학
- I'm Sorry
- 사이버보안
- 자료구조
- 보안
Archives
- Today
- Total
스택큐힙리스트
실전 튜닝 Q&A: 요청 지연 파악부터 CDN-비용, 인덱스 설계까지 한 방에! 본문
반응형
1. 요청 처리 시간, 무엇을 어떻게 잴까?
- 구간별 타이머
- Micrometer Timer를 메소드·API 호출마다 삽입하면 총 시간뿐 아니라 외부 API 호출, DB 쿼리, 비즈니스 로직 을 세부 구간으로 나눠서 계측할 수 있다. 예시는 timer.record(() -> ... ) 한 줄이면 끝!
- HTTP 필터/AOP로 시작 타임스탬프를 MDC(Logback) 에 넣어 요청-응답 로그를 한줄로 남기면 Kibana, Grafana 등에서 “slow-query” 대시보드가 자동 완성된다.
- 분산 트레이싱(OpenTelemetry)를 함께 쓰면 외부 마이크로서비스까지 hop-by-hop 지연을 눈으로 확인할 수 있어 SLA 협상 근거가 명확해진다.
2. “끊긴 DB 커넥션”이 풀 안에서 살아있는 이유
네트워크 장비가 TCP idle 세션을 자르더라도 소켓은 FIN 패킷을 받지 않을 때 애플리케이션이 모른다. 커넥션 풀(HikariCP 등)은
- maxLifetime·idleTimeout에 따라 주기적으로 house-keeper 스레드로 ping/validation을 돌려 죽은 커넥션을 제거하고
- connectionTestQuery·validationTimeout 으로 borrow 시점 검사도 지원한다.
팁
- DB ↔ Firewall의 idle timeout < maxLifetime 가 되도록 설정
- 중요한 배포 직후엔 softEvictConnections() 호출로 낡은 커넥션을 즉시 갈아치운다.
3. “캐시가 아직 안 찼는데 왜 청소해야 하죠?”
- 메모리 압박 : 오래된 키가 많으면 GC pause·메모리 파편화로 응답 지연이 커진다. Redis는 메모리가 가득 차기 직전에 샘플링 LRU로 키를 찾는데, 이미 full 상태에서 evict 모드가 돌면 처리량이 최대 15-20 %까지 떨어질 수 있다
- 권장 : TTL 혹은 LFU 정책으로 “사용 빈도↓ + 낡은 데이터”를 미리 털어내고, maxmemory-samples 를 3~5 로 유지해 CPU 오버헤드를 줄인다.
4. CDN 비용이 ‘생각보다’ 저렴한 이유
항목 | CloudFront (한국 Edge) | S3 (서울 리전) |
Origin → Edge 전송 | 무료 아마존 웹 서비스 | – |
Edge → Internet (다음 9 TB) | $0.114/GB 아마존 웹 서비스 | (동급 구간에서) 보통 $0.15 안팎 |
저장 비용 | 없음 – 캐시된 객체는 eviction 시 자동 삭제, 별도 스토리지 과금 없음 Server Fault | 스토리지 요금 별도 부과 |
즉 동일 서울 리전에서 S3만 단독으로 외부 전송하는 것보다 CloudFront를 앞단에 두면 첫 1 TB 무료 + 전송 단가 할인 + 글로벌 캐싱 세 가지 모두 이득이다. 해외 이용자가 한 번 요청해서 캐시가 생성돼도, 객체 자체에는 저장료가 없으니 ‘유령 캐시’ 비용 걱정은 버려도 된다.
5. 필터 후에도 정렬이 느리다? 👉 복합 인덱스 설계
WHERE 절 필터링 뒤에도 레코드가 수만 건이라면 정렬 컬럼을 인덱스 끝에 포함해 두 번 스캔을 피한다.
-- 예: status 로 필터 후 updated_at DESC 정렬
CREATE INDEX idx_status_updated
ON orders(status, updated_at DESC);
- 왼쪽 고정(prefix) 규칙을 지켜야 쿼리 플래너가 filesort 를 생략하고 인덱스만으로 정렬한다
- SELECT 항목이 모두 인덱스 컬럼이면 “Index Only Scan(= 커버링 인덱스)”가 되어 디스크-I/O가 완전히 사라진다.
6. 블루-그린 배포 때 DB 커넥션 수는 2배여야 할까?
- 스위치 전 Blue + Green 두 개의 애플리케이션이 동시에 살아있으므로, 이론상 DB 연결 합계가 평소의 두 배가 될 수 있다.
- 그러나 AWS RDS 기준으로 복제 슬롯·연결 수 자체가 리소스를 잡아먹어 랙을 유발할 수 있으므로
- Green 쪽 풀 크기를 30-50 % 수준으로 제한
- 혹은 RDS Proxy / PgBouncer 같은 멀티플렉서로 “논리-연결 >> 물리-연결” 구조를 만들면 DB max_connections를 굳이 2배로 늘리지 않아도 된다.
📌 정리
- Micrometer & 분산 트레이싱으로 구간-별 지연을 실시간 가시화
- 커넥션 풀은 validation/keep-alive 로 죽은 세션 자동 정리
- 캐시는 TTL+LFU 로 메모리·GC 부하를 예방
- CloudFront는 전송 단가·저장료 모두 절약, “서울→서울” 조합에서도 유리
- 필터 + 정렬 쿼리는 복합 인덱스로 한 번에 해결
- 블루-그린 배포 시 DB 연결은 “풀 조정 or Proxy”로 리소스를 균형 있게 분배
반응형
'개발' 카테고리의 다른 글
Index Skip Scan 완전 정복: 선두 칼럼이 없어도 인덱스를 타는 마법 (2) | 2025.07.11 |
---|---|
Index Skip Scan과 Covering Index를 활용한 초고속 페이징 쿼리 패턴 (0) | 2025.07.11 |
Redis로 읽기 부하 줄이기 – 캐시 전략 실전 가이드 (5) | 2025.07.11 |
JVM GC 종류 완전 정리 + 실전 튜닝 가이드 (2) | 2025.07.11 |
Record vs Lombok vs AutoValue 비교 분석 (1) | 2025.07.11 |
Comments