Gunicorn은 평소에 쓰던 WSGI( Web Server Gateway Interface )이다. WSGI의 종류에는 uWSGI, Gunicorn 등등 많지만, 그 중에서도 가볍고 더 빠른 gunicorn을 사용하게 되었다.
Procfile에 쓰여져 있는 프로세스 Gunicorn 명령어에서 못 보던 옵션을 보았다. 바로 --threads 이다.
blog.winterjung.dev/2018/04/08/flask-concurrency-test
위 링크에 따르면 "Django 앱을 Gunicorn으로 실행하고 CPU bound 작업을 위한다면 -w 옵션 (number of worker processes)을, IO bound 작업을 위한다면 --threads 옵션 (number of worker threads)을 신경쓰면서 기본적으로 -k 옵션 (worker class)을 gevent 등의 async worker로 설정하는 것을 추천한다"고 한다.
-w는 worker의 개수를 결정하며 독립적인 프로세스로 django 앱이 실행된다.
--threads는 각 워커마다 가질 thread 개수를 결정한다.
만약 -w 4 --threads 4 옵션을 사용했다면 한번에 16개의 IO를 처리할 수 있다.
Thread란?
스레드(thread)는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.
프로세스(process)란?
프로세스(process)는 단순히 실행중인 프로그램(program)이라고 할 수 있습니다. 즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다. 이러한 프로세는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성됩니다.
[참고] www.tcpschool.com/java/java_thread_concept
Thread란?
스레드(thread)는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.
프로세스(process)란?
프로세스(process)는 단순히 실행중인 프로그램(program)이라고 할 수 있습니다. 즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다. 이러한 프로세는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성됩니다.
cpu bound 작업은 물리적 코어 수, IO bound 작업은 논리적 코어 수에 의존한다.
만약 물리적 코어가 2개인 머신에서 cpu bound 작업을 처리할 때 -w를 2로 주나 4로 주나 유의미한 차이는 없으며 오히려 오버헤드가 발생한다.
공식적인 문서에서 권장하는 워커와 스레드 개수는 2 * $NUM_CPU + 1이다.
Celery를 사용한다면
celery는 메시지 패싱 방식의 분산 비동기 작업 큐로 pdf 변환, audio render등의 오랜 시간이 걸리는 작업들을 백그라운드에서 비동기적으로 처리한다.
유저한테 처리 결과를 즉시 반환할 필요가 없을 때 사용할 수 있지만 이 역시 뷰 함수의 처리가 다 끝날 때 까지 다른 클라이언트의 요청은 처리되지 않는다.
'Development > Django' 카테고리의 다른 글
[Django] User Model 확장 (1) - 4가지 방법 (0) | 2021.02.23 |
---|---|
[Django] Web Socket (0) | 2021.02.09 |
[Django] URL 패턴 - 정규식과 path() 차이점 (0) | 2021.02.08 |
[Django] Channels & Daphne (0) | 2021.02.02 |
[Django] WSGI (Web Server Gateway Interface ) (0) | 2021.02.02 |