도커 없이 멀티프로세스 cgroup 사용 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 구성 요소

  • fastapi_server.py: 요청을 받아 Redis에 task 등록
  • worker.py: Redis 큐에서 task를 받아 처리
    • 큐를 계속 확인하다가 큐에 요청이 있으면 꺼내서 처리하는 구조
  • Redis: 메시지 브로커 역할 (별도 프로세스 필요)
# 1. cgroup 생성 및 제한 설정
sudo cgcreate -g cpu,memory:/worker_1
sudo cgset -r cpu.cfs_quota_us=150000 worker_1    # 1.5 core
sudo cgset -r memory.limit_in_bytes=1G worker_1

# 2. 서버 실행 (리소스 제한 없음)
python fastapi_server.py

# 3. 워커 실행 (리소스 제한 적용)
cgexec -g cpu,memory:/worker_1 python worker.py

# 4. Redis 실행 (백그라운드에서 실행 필요)
redis-server &

2. 큐는 왜 Redis를 써야 하나?

  • Python의 queue.Queue()메모리 기반 객체라서 다른 프로세스 간 공유 불가
  • Redis는 서버 프로세스이자 네트워크 접근 가능한 메시지 큐로, FastAPI ↔ 워커 간 통신 허브 역할 수행
  • 따라서 "큐도 별도 프로세스로 띄워야 한다"는 말은 곧 Redis 같은 외부 큐 서버가 필요하다는 뜻