2010-08-09 2 views
54

나는 아파치가 사용하는 스레드를 이해한다 : 모든 연결은 스레드를 열고 응답이 보내지면 스레드는 닫히고 다른 스레드의 자원을 해제한다.Nginx는 HTTP 요청을 어떻게 처리합니까?

하지만 Nginx에서 사용하는 이벤트 기반 디자인은 없습니다. 내가 이벤트 구동 디자인에 대한 몇 가지 기본 사항을 읽었지만 ..이 웹 요청을 처리하는 nginx에 의해 사용되는 방법을 이해하지 않습니다.

Nginx가 이벤트 중심 방식으로 연결을 처리하는 방법을 읽고 이해할 수 있으므로 이벤트 기반 디자인을 수락하는 것보다는 스레드 기반 디자인을 사용하는 것이 더 낫습니다.

답변

51

Nginx는 Reactor 패턴을 사용합니다. 기본적으로 단일 스레드입니다 (그러나 여러 코어를 활용하기 위해 여러 프로세스를 포크 할 수 있음). 메인 이벤트 루프는 OS가 준비 이벤트를 알리기를 기다립니다. 그 데이터는 소켓에서 읽을 수 있으며 버퍼에서 읽혀 처리됩니다. 단일 스레드는 수만 개의 동시 연결을 매우 효율적으로 처리 할 수 ​​있습니다 (각 스레드가 자체 스택을 필요로하기 때문에 큰 메모리 소비뿐만 아니라 큰 컨텍스트 전환 오버 헤드로 인해 연결 당 스레드 모델이 실패합니다) .

+3

하지만 한 스레드가 수만 명의 사용자에게 서비스 할 수 있다면 더 많은 서비스를 제공하기 위해 여러 스레드를 사용하지 않는 이유는 무엇입니까? 또는 나는 그것을 잘못 듣고있다. –

+2

원자로는 소켓에서 읽기와 같이 비 threadsafe 연산을 수행해야하기 때문에. 약간 다른 방식으로 작동하는 Proactor 패턴을 사용하면 다중 스레드 (작업자 스레드의 고정 된 풀, 예 : CPU 당 하나의 풀)가 가능합니다. 예를 들어 OS가 버퍼에 읽기 데이터를 배치하는 경우 (비동기 조작). 그러나 프로 액터는 자체 단점이 있습니다. 즉, 버퍼에 더 많은 메모리를 확보해야합니다. 단일 CPU 만 사용하는 경우 Linux에서 속도가 느립니다. – Onestone

+3

"한 스레드가 수만 명의 사용자에게 서비스를 제공 할 수 있다면 왜 여러 스레드를 사용하지 않을까요?"스레드는 비용이 많이 드는 프로세스를 줄이기 위해 고안 한 골칫거리입니다. 비동기 I/O를 수행하는 요점은 단일 프로세스 내에서 많은 클라이언트를 처리하고 창 밖으로 스레딩을 얻을 수 있기 때문입니다. 비동기 I/O 분야에서 스레딩 가격의 가치가있는 성능 향상을 보지 못할 것이라고 확신합니다. – flow