광고 차단 프로그램이 감지되었습니다

이 사이트는 광고 수익을 통해 무료로 콘텐츠와 서비스를 제공하고 있습니다.

더 나은 서비스를 위해 광고 차단 프로그램을 비활성화 해주세요.

광고 차단 해제 방법 보기
Loading...

홈서버가 과연 10만 명을 견딜까? Locust 부하테스트로 확인한 충격적 결과

홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img

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배 증가, 동시 연결 처리 능력 대폭 향상

홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img

2차: 스케일아웃 및 nginx 로드밸런싱 구축배경: 단일 서버 한계 돌파를 위한 수평 확장 필요

# nginx upstream 설정 추가
upstream license_api_backend {
    server 127.0.0.1:8991;           # 메인 서버
    server 보조서버 아이피:8991;     # 보조 서버
}

효과:

처리 용량 2배 증가 (메인 + 보조 서버)

단일 장애점(SPOF) 제거로 가용성 향상

부하 분산으로 안정성 확보

홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img

 

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 병목 완전 해소

대규모 동시 연결 처리 가능

시스템 전체 처리량 향상

홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img

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 효율성 향상

완전한 비동기 스택 구축

홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img

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 연결 안정성 확보

 

홈서버 locust로 10만유저 초당1천명 테스트기에 대한 img

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차의 과정을 통해 시스템 전반의 병목을 제거하고 확장 기반을 마련한 것도 의미가 있었습니다.

기술적 교훈:

성능 문제의 근본 원인 파악이 가장 중요

점진적 최적화를 통한 체계적 접근

모니터링과 로그 분석의 중요성

단순한 설정 하나가 전체 성능을 좌우할 수 있음

결론: 홈서버 환경에서도 대기업급 성능을 달성할 수 있음을 입증한 성공적인 스케일아웃 사례입니다! 🚀

 

목차
목차를 불러오는 중...

댓글

Loading...

댓글 로딩 중...

구글 검색