sync
gunicorn에서 사용하는 기본 worker type
- 하나의 worker당 하나의 process가 load된다.
- worker의 개수는 기본적으로 2~4 * (NUM_CORES)을 추천한다.
application이 주로 cpu bound로 이루어진 경우 추천
- cpu bound로만 이루어진 경우에는 thread의 개수를 늘리는 것이 GIL 때문에 오히려 성능을 악화시킬 수 있기 때문이다.
적용 방식
- CPU 사용량과 requests 수를 감안해 process(worker) 수를 조정
- 너무 많은 process가 존재하면 context switching으로 인해 latency가 감소할 수 있다.
- request에 비해 process가 적으면 동시에 처리할 수 있는 request가 적어 reverse proxy에서 timeout error가 발생할 수 있다.
gthread
gunicorn에서 workers의 threads 개수가 한 개 이상이면 자동으로 gthreads worker type을 사용
- 하나의 worker당 하나의 process가 load되고, 각 workers에서 threads를 생성
application에서 I/O blocking이 빈번하게 발생하는 경우 추천
- I/O operation이 적당히 존재하고, cpu 사용량이 적당한 경우
- 사용하는 package에서 async code patch가 지원되지 않는 경우
적용 방식
- sync worker type에서와 동일
gevent/eventlet
greenlet을 기반으로 한 green threads나 pseudo threads를 사용
만약 application이 주로 I/O bound 작업으로만 이루어져 있다면 하나의 process에서 동시에 몇 개의 요청을 처리할 수 있다.
동작 방식
- gevent package로부터 I/O blocking 부분의 코드를 호환 가능한 coroutine 코드로 변경해준다.(monkey patching)
gevent를 100% 완벽하게 설정하는 것은 어려울 수 있으므로, 초당 100건 이상의 요청을 처리해야 하는 경우가 아니라면 gthread를 사용하는 것이 더 쉬울 수 있다.
적용 방식
- gevent에서 호환이 가능한 package를 설치해서 사용해야 한다.
- 주요 DB 라이브러리에는 gevent와 호환 가능한 패키지가 존재
- psycopg/psycogreen, pymysql, ..
- 주요 DB 라이브러리에는 gevent와 호환 가능한 패키지가 존재
참고
'Python(파이썬)' 카테고리의 다른 글
| Python Fast api advanced setting (0) | 2023.12.06 |
|---|---|
| Python Fast API (1) | 2023.12.06 |
| python event loop (0) | 2023.12.06 |
| python Global Interpreter Lock(GIL) (1) | 2023.12.06 |