2009-06-04 6 views
23

서버 아키텍처에 대한 의견을 읽었습니다. 이 댓글에 이벤트 루프 대 멀티 스레드 차단 IO

http://news.ycombinator.com/item?id=520077

는 사람이 3 일 말했다 :

  1. 이벤트 루프, 시간을 다시 진정으로 낮은 활성 연결의 높은 번호를 빛나게하는 것으로 나타났다.
  2. 비교해 보면 스레드 또는 프로세스가있는 차단 IO 모델이 이벤트 루프와 비교하여 요청 당 대기 시간을 줄이거 나 반복적으로 보여주었습니다.
  3. 가볍게로드 된 시스템에서는 차이점을 구분할 수 없습니다. 로드가 발생하면 대부분의 이벤트 루프는 속도를 줄이기로 선택하고 대부분의 블로킹 모델은로드를 해제합니다.

이러한 사항이 사실입니까?

또한 여기라는 제목의 다른 기사 "이벤트가 나쁜 생각하는 이유 (높은 동시성 서버용)"

http://www.usenix.org/events/hotos03/tech/vonbehren.html

답변

20

일반적으로 응용 프로그램이 백만 연결을 처리해야하는 경우 멀티 스레드 패러다임을 이벤트 기반으로 결합 할 수 있습니다.

  1. 먼저 N 개의 스레드로 생성합니다. 여기서 N == 사용자 컴퓨터의 코어/프로세서 수입니다. 각 스레드는 처리해야하는 비동기 소켓 목록을 갖습니다.
  2. 그런 다음 수용자의 새로운 연결마다 새 소켓을 가장 적은 소켓을 가진 스레드에 "로드 밸런스"합니다.
  3. 각 스레드 내에서 모든 스레드에 대해 이벤트 기반 모델을 사용하여 각 스레드가 실제로 동시에 여러 소켓을 처리 할 수 ​​있도록합니다. 이 방법으로

,

  1. 당신은 백만 스레드를 생성하지 않습니다. 시스템에서 처리 할 수있는만큼 많은 정보를 얻을 수 있습니다.
  2. 단일 코어가 아닌 멀티 코어에서 이벤트 기반을 사용합니다.
+0

가능하면 구체적인 예를 제공해 주시겠습니까? 감사! – Jeff

+1

맞아. 귀하의 구현을 보여주십시오. –

+1

QThreadPool 및 QRunnable을 사용하여 구현하기 쉽습니다. http://doc.qt.nokia.com/4.7-snapshot/qthreadpool.html을 확인하십시오. – sivabudh

0

는 "낮은 활동"에 의해 무슨 뜻인지 확실하지,하지만 주요 믿는다 요인은 각 요청을 처리하기 위해 실제로 얼마나 많이해야하는지입니다. 단일 스레드 이벤트 루프를 가정하면 다른 클라이언트는 현재 요청을 처리하는 동안 해당 요청을 처리하지 못합니다. 중요한 요청 ("많은"의미있는 CPU 및/또는 시간이 걸리는 것을 의미)을 처리하고 컴퓨터가 실제로 효율적으로 멀티 태스킹을 수행 할 수 있다고 가정 할 때 (시간이 걸리는 것이 공유를 기다리는 것을 의미하지는 않습니다. 리소스, 단일 CPU 머신 또는 이와 유사)를 사용하면 멀티 태스킹으로 더 나은 성능을 얻을 수 있습니다. 멀티 태스킹은 멀티 스레드 블로킹 모델이 될 수 있지만 들어오는 요청을 수집하는 단일 태스크 이벤트 루프 일 수도 있고 멀티 태스킹을 통해 차례대로 처리하고 가능한 빨리 응답을 보내는 다중 스레드 작업자 팩터 리로 보낼 수도 있습니다.

클라이언트와의 느린 연결이 그다지 중요하지 않다고 생각합니다. 운영체제가 앱 외부에서 효율적으로 처리 할 것이라고 생각합니다. (처음에는 클라이언트와의 여러 라운드 트립에 대한 이벤트 루프를 차단하지 않는다고 가정합니다. 요청을 시작 했음). 그러나 나는 직접 테스트하지 않았다.

+0

이 답변은 정리가 필요합니다. –