찾아보면 대부분
MPM 방식과 Event-Driven 방식이라고 간략하게 정리하는데
아파치 2.4부터는 성능적으로 많이 따라잡았다고 하는데 그 내부 원리, 그리고 로우레벨에서의 웹서버의 동작에 대해 궁금함을 느껴서 제대로 조사해보았다.
내가 스스로 정리해서 이해한 내용은
Event 방식의 코어는 결국 리눅스 커널단에서의 IO 멀티플렉싱 방식을 쓰냐이다.
nginx는 멀티플렉싱 방식으로 커널에 작업을 넘기고 커널에서 처리된 순서대로 작업을 큐에 넣어서 순차적으로 처리한다.
또 불필요한 컨텍스트 전환이 없고 불필요한 스레드를 생성할 필요가 없다.
메모리 관리 측면에서는 두 웹서버다 유사한 방식인데, memcpy 가 아니라 포인터로 지정해서 관리하는식으로 관리한다.
아파치 방식이 이벤트 방식을 도입하면서 많이 성능이 좋아졌지만
근본적인 커널단의 작업이 event 방식(epoll등)으로 일어나지만 MPM 이벤트 방식은 결국 소켓 listener 스레드, worker 스레드등을 생성하게 되는점(미리 생성해둘순 있겠지만, 그만큼 초기 구동시 메모리가 늘어난다.)
그럼에도 nginx도 쓰레드풀을 활용하는 경우가 있어서 찾아봤는데
IO작업이 무거운경우 예를들어 Video Streaming Data처럼 큰 Data Stream을 주고받는 경우에는 Blocking 문제가 생길수있다.
간단하게 말하면 작업이 무거운경우 싱글스레드로 처리하기때문에 하나의 작업이 끝날때까지 계속 블로킹 당할수 있는데, 그것을 멀티스레드를 통해 완화할수있다.
apache event방식
Nginx/Apache 정리 잘된글
소켓 관련 accpect의 mutex
epoll / EPOLLEXCLUSIVE