Gunicorn은 어떻게 트래픽을 분산할까?

Gunicorn이 어떻게 요청을 Worker 프로세스에 전달하는지 알아보았습니다.

1. Gunicorn은 기본적으로 WSGI를 지원하는데, Worker 프로세스가 UvicornWorker와 같은 ASGI 구현체를 사용하는 건 가능합니다.

2. Gunicorn은 Multi Processing 방식 중 fork 방식을 사용합니다. fork 방식은 현재 동작하고 있는 프로세스를 Clone하여 자식 프로세스를 만드는 방식입니다. Uvicorn이 기본적으로 spawn 방식을 사용하는 것과 차이가 있습니다. spawn 방식은 기존 프로세스를 복제하는게 아니라, 새로운 파이썬 Interpreter를 실행하여 새롭게 프로세스를 만드는 방식입니다.

3. Gunicorn이 시작되면 master 프로세스가 요청을 받을 주소로 소켓을 바인딩합니다. 주소가 0.0.0.0:8000이라고 하면, 해당 주소와 포트로 요청을 받을 수 있도록 TCP 소켓을 여는 셈입니다. 그 이후에 Worker 수만큼 os.fork() 함수를 호출합니다. 이때 앞서 생성했던 소켓을 자식 프로세스가 상속(공유)받습니다.

4. 자식 프로세스는 같은 주소와 포트로 바인딩된 소켓을 사용하여 accept() 함수를 호출합니다. 커널은 연결 요청 대기열(queue)에 요청이 들어오면 먼저 들어온 요청을 꺼내서 대기하고 있는 프로세스 하나를 깨워 전달합니다.

5. Gunicorn의 master 프로세스는 실제 요청을 처리하지 않고, worker 프로세스들을 관리하는 역할을 합니다. 실제 요청은 운영체제 수준에서 각 worker 들에게 전달되고, 덕분에 worker들은 비동기로 요청을 처리하고 클라이언트에게 응답을 보낼 수 있습니다.

Gunicorn과 Uvicorn의 정확한 동작원리를 알면, 조금이나마 애플리케이션을 운영하는데 도움이 될 것 같아서 조금씩 공부하고 있는데, 쉽지 않네요.

혹시나 잘못된 내용이 있거나, 첨언해주실 내용이 있다면 댓글로 조언 부탁드립니다.

https://techchallengearena.substack.com/p/gunicorn

Gunicorn은 어떻게 트래픽을 분산할까?

Substack

Gunicorn은 어떻게 트래픽을 분산할까?

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 6월 3일 오후 6:04

댓글 0