1차
1차: Uvicorn Worker 4개로 확장배경: 기본 단일 워커로는 동시 연결 처리에 한계 발생
# 기존: 단일 프로세스 uvicorn main:app --host 0.0.0.0 --port 8000 # 개선: 멀티 프로세스 uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
효과: CPU 멀티코어 활용으로 처리 능력 4배 증가, 동시 연결 처리 능력 대폭 향상
2차: 스케일아웃 및 nginx 로드밸런싱 구축배경: 단일 서버 한계 돌파를 위한 수평 확장 필요
# nginx upstream 설정 추가 upstream license_api_backend { server 127.0.0.1:8991; # 메인 서버 server 보조서버 아이피:8991; # 보조 서버 }
효과:
처리 용량 2배 증가 (메인 + 보조 서버)
단일 장애점(SPOF) 제거로 가용성 향상
부하 분산으로 안정성 확보
3차: 양쪽 서버 모두 Worker 8개로 통일배경: 서버 간 성능 불균형 해소 및 최적화
# 메인/보조 서버 모두 동일 설정 uvicorn main:app --workers 8 --host 0.0.0.0 --port 8000
효과:
총 16개 워커 활용 (8 × 2서버)
페일오버 시에도 일관된 성능 제공
서버별 성능 차이로 인한 병목 해소
4차: nginx worker_connections 4K → 16만 대폭 확장배경: nginx 레벨에서 동시 연결 수 제한 발견
# nginx.conf 수정 events { worker_connections 16384; # 기존 4096에서 4배 증가 use epoll; multi_accept on; }
효과:
nginx 병목 완전 해소
대규모 동시 연결 처리 가능
시스템 전체 처리량 향상
5차
5차: Docker ulimits 추가 & Redis 비동기화배경: OS 레벨 제한과 I/O 블로킹 문제 해결
# docker-compose.yml services: fastapi: ulimits: nofile: soft: 65536 hard: 65536
# 동기 → 비동기 Redis 전환 # 기존: import redis import aioredis r = await aioredis.from_url("redis://host:port/0")
효과:
파일 디스크립터 제한으로 인한 연결 거부 방지
Redis I/O 블로킹 제거로 CPU 효율성 향상
완전한 비동기 스택 구축
6차: Uvicorn backlog 2048 & nginx 페일오버 구조배경: 연결 대기 큐 포화 문제가 근본 원인으로 판명
# 핵심 해결책: backlog 확장 uvicorn main:app --workers 8 --backlog 2048
# 페일오버 구조 도입 upstream license_api_backend { server 127.0.0.1:8991 max_fails=3 fail_timeout=30s; server 보조서버 아이피 backup; # 백업 서버 }
효과:
연결 타임아웃 문제 완전 해결 (가장 중요!)
고가용성(HA) 아키텍처 구축
nginx → FastAPI 연결 안정성 확보
7차: 페일오버 → least_conn 로드밸런싱 변경배경: 0% 실패율 달성했으나 응답시간 스파이크 발생
# 개선된 로드밸런싱 upstream license_api_backend { least_conn; # 연결 수 기반 지능적 분산 server 127.0.0.1:8991 max_fails=3 fail_timeout=30s; server 보조서버 max_fails=3 fail_timeout=30s; # backup 제거 }
효과:
응답시간 스파이크 85% 감소 (120초 → 20초)
보조 서버 완전 활용 (0% → 20% CPU 사용)
더 일관된 사용자 경험 제공
추가로 20만유저 초당1천 테스트
최종 달성 성과
압도적인 성능 지표
✅ 100,000 동시 사용자
✅ 평균 647.6 RPS (600-800 범위)
✅ 0% 실패율
✅ 안정적인 처리량 유지
핵심 깨달음:
사실상 6차의 --backlog 2048 설정만으로도 문제 해결이 가능했을 정도로, 근본 원인은 연결 처리 큐의 한계였습니다. 하지만 1-5차의 과정을 통해 시스템 전반의 병목을 제거하고 확장 기반을 마련한 것도 의미가 있었습니다.
기술적 교훈:
성능 문제의 근본 원인 파악이 가장 중요
점진적 최적화를 통한 체계적 접근
모니터링과 로그 분석의 중요성
단순한 설정 하나가 전체 성능을 좌우할 수 있음
결론: 홈서버 환경에서도 대기업급 성능을 달성할 수 있음을 입증한 성공적인 스케일아웃 사례입니다! 🚀
댓글
댓글 로딩 중...