2013-03-20 8 views
4

고성능 서버 (HTTP 서버 아님)를 설계하고 있으며 내 디자인 옵션을 고려하고 있습니다. 서버는 많은 수의 수신 연결 (수천)을 지원하고 Windows와 Linux 모두에서 컴파일해야합니다.libEvent를 사용하는 고성능 서버

Windows 측에서 지금까지 스트레스를 처리하는 것으로 보이는 IO 완료 포트 서버를 구현했습니다. 리눅스 수요가 급상승 한 이후, 이제 스레드 풀에서 accept/read 이벤트를 사용하는 방법을 제공하는 크로스 플랫폼 라이브러리를 찾으려고합니다.

지금까지 libEvent는 올바른 선택입니다 (이 link의 "예제 코드 : 에코 서버"와 유사 함). 그러나 another page in the libEvent docs에서 인용 : event_base이 잠금을 사용하도록 설정되어

경우, 여러 스레드 사이를 에 액세스하는 것이 안전합니다. 루프는 단일 스레드 인 에서만 실행할 수 있습니다. IO에 대해 폴링하는 다중 스레드를 원할 경우 각 스레드에 대해 event_base를 사용하려면 이 필요합니다.

내 기본 디자인은 스레드 풀을 받아들이고 이벤트를 읽는 것입니다. 이 견적은, 내가 정확하게 이해한다면, 나는 그것을 할 수 없다고 말합니다.

높은 퍼프 사용 경험이있는 사람이 있습니까? libEvent 기반 서버? 다른 라이브러리를 사용해야할까요?

이러한 서버에 대한 예제 코드가

답변

6

libevent 완벽 할 것이라고는 크로스 플랫폼을 유지하려면 갈 수있는 방법입니다. 그 libevent 어쨌든 리눅스 내부적으로는 epoll을 사용

참고 : 매우 효율적으로하려면

, 나는 리눅스 (Windows에서 작업 한)와 epoll IO 완료 포트와 같은 특정 플랫폼 API의의를 추천 할 것입니다.

mulithreaded 디자인에 대한 질문으로, 각 수신 클라이언트 연결을 처리하기 위해 하나의 스레드를 사용하지 않기를 바란다. 만약 당신이 그렇게했다면 이벤트 중심 모델을 사용하는 목적을 무너 뜨릴 것이다! 소수의 클라이언트 연결이 단일 스레드에 의해 처리되도록 코드를 설계하고 동시 연결 수가 증가 할 때 스레드 수를 늘려야합니다.

또한 클라이언트가 데이터를 수신하는 IO를 수행하고있는 스레드 풀에서 보내는 데이터에 대한 강력한 계산 작업을 수행하지 않을 것입니다. 네트워크 집약적 IO를 수행하고 CPU 집약적 인 계산을 두 개의 별도 스레드 풀로 분리하는 작업을 분리합니다.