도커 없이 멀티프로세스 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 같은 외부 큐 서버가 필요하다는 뜻