클라이언트에서 비동기적으로 동화책 커버 일러스트와 여러 페이지의 일러스트들을 동시에 호출하지만 응답 속도가 3분 이상으로 너무 느린 문제 상황이 있었다.
FastAPI에서 비동기적으로 응답하도록 설정했지만, 하나의 작업자에서만 실행되어 동기적으로 작업하는 것이 문제였다.
기존에는 ASGI 서버인 uvicorn을 사용하여 네트워크 I/O 처리를 최적화하였다.
uvicorn main:app --reload
main
은 Python 파일을 의미하고, app
은 FastAPI 인스턴스를 나타낸다.
--reload
는 개발 중 코드 변경을 감지하고 서버를 자동으로 재시작하는 기능이다.
하지만, uvicorn은 하나의 작업자에서만 실행되는 한계가 있다. 그래서 병렬처리를 위해서 WSGI 서버인 gunicorn을 적용하였다.
gunicorn과 uvicorn을 함께 사용하면, FastAPI 애플리케이션을 여러 작업자로 분산하여 처리하고, 동시에 다수의 HTTP 요청을 빠르게 처리할 수 있다.
gunicorn main:app -w 8 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
-w
는 사용할 워커의 개수이다. 8개는 서버의 cpu의 코어 수를 확인하여 설정하였다.
-k
는 사용할 워커의 종류이다. 여기서는 uvicorn 워커를 사용하겠다는 의미이다.
--bind 0.0.0.0:8000
에서 0.0.0.0
은 IP인데 외부에서 접근 가능하도록 배포한다는 의미이고, 8000
은 port이다.
타임아웃 오류가 나서 default 30초에서 10분으로 타임아웃 시간을 늘려주었다.
[2023-09-18 00:54:47 +0900] [97794] [CRITICAL] WORKER TIMEOUT (pid:97798)
gunicorn main:app -w 8 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 --timeout 600
gunicorn 적용 후, 3분 이상에서 30초 정도로 응답 속도가 개선되었다.