2021년 5월 9일 일요일

Django + ASGI + Docker 적용하기.

 Django + ASGI + Docker 적용하기.

지금까지 Django wsgi + uWSGI 를 사용하다가 장고 3.0 버전에서 ASGI 서버를 지원하게 되면서 그것에 대해 코드 적용 및 발생 하는 이슈에 대해서 적을까 합니다.

1. Gunicorn worker hanging issue

docker 내부에서 gunicorn 사용할때 worker가 가동되는데 그 워커의 tmp directory가  /tmp 로 docker 내부에 있는 overlay 스토리지 타입으로 되어있어서,  docker 내에서 gunicorn worker 가동시 blocking 걸릴수도 있음. 따라서 gunicron 의 worker tmp directory path를 세팅해줌으로써 worker 가 hanging 걸리는 이슈 해결

gunicorn --worker-tmp-dir /dev/shm .... 

2. uvicorn --relaod 사용시 high cpu usage

uvicorn high cpu 의 경우 reload 사용시 모든 폴더 및 파일을 watching 하고 있어서 이슈가 발생.
reload-dir을 어플리케이션 directory 로 세팅해주면  high cpu usage 이슈는 해결됨.
기존에 45% 까지 사용하던 CPU Usage가 25%까지 줄어들었음.

uvicorn --reload-dir /app

3. too slow response

Application 의 경우는 Django 3.1 을 사용해서 Async view만 적용 되어, ORM 쪽은 async 로직이 아직 적용 안되어있는 상태

따라서 DJANGO_ALLOW_ASYNC_UNSAFE 세팅 필요. settings.py에 해당 라인 추가

os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"

그리고 지금 Application의 경우 graphql을 사용하고 있는데, 거기에 제공하는 playgorund를 통해 테스트 진행.
그리고 gunicorn에서 static file에 대해서 serving 이슈가 있어서 json 파일만 서빙하도록 수정하고 기존에 playground는 postman에서 사용하도록 변경함.

REFERENCES

https://stackoverflow.com/questions/58942398/docker-running-a-flask-app-via-gunicorn-worker-timeouts-poor-performance?rq=1

https://pythonspeed.com/articles/gunicorn-in-docker/

https://github.com/encode/uvicorn/issues/1031#issuecomment-835622513




댓글 없음:

댓글 쓰기