뭐가 좋을까?
현재 나의 fastapi 앱은 Gunicorn 으로 uvicorn 워커 2개를 실행시키고 있다.
https://fastapi.tiangolo.com/deployment/server-workers/
공식문서를 정리해보면,
Gunicorn은 WSGI standard로 서버를 실행시키기 때문에 비동기 처리 방식인 fastapi와는 잘 맞지 않는다.
Uvicorn 은 ASGI standard를 사용하기 때문에 fastapi와 적합하지만, 단일 프로세스라는 한계가 있다.
Gunicorn 으로 Uvicorn 워커를 여러개 사용하면 WSGI 멀티 프로세스 환경을 구성할 수 있다.
Uvicorn 역시 설정을 통해 여러 프로세스를 동시에 실행시킬 수 있지만, Gunicorn 보다 프로세스 매니징에서 한계가 있다. 단지 띄우는 것이 목적이라면 사용할 수 있겠으나, 프로세스를 관리하기에 용이하지 않다.
Gunicorn 으로 Uvicorn 워커를 여러개 사용하면 멀티 코어 환경에서 멀티 프로세스를 병렬로 처리하는 데 이점이 있다.
https://fastapi.tiangolo.com/deployment/docker/
쿠버네티스, ECS 같은 컨테이너 오케스트레이션 서비스를 사용한다면 프로세스 매니저(Gunicorn) 대신 해당 서비스를 사용하여 단일 프로세스 컨테이너를 여러 replication 으로 관리하는 것이 좋다.
https://github.com/tiangolo/fastapi/discussions/9760
단일 프로세스로 여러 컨테이너를 띄우는 것이 scale-out 에 유리하다. (하나의 컨테이너가 4개의 프로세스라면, 스케일 아웃의 단위가 4프로세스로 커져 불리하다.)
성능이 더 궁금한데 이 부분은 추후에 성능 테스트를 해보아야 알 것 같다.
https://docs.gunicorn.org/en/stable/design.html#how-many-workers
(2 x num_cores) + 1
vCPU vs core
https://learn.microsoft.com/ko-kr/azure/virtual-machines/acu
현대 CPU는 하이퍼 스레드 기술을 적용하여 하나의 코어가 2개의 스레드를 동시에 처리할 수 있음
따라서 VM 의 사양을 꼼꼼하게 보고 선택해야함