2014-09-04 1 views
2

여러 동시 클라이언트 연결 (대략 100 개)을 처리 할 서버를 만들고 있는데, 여기서 클라이언트는 많은 양의 데이터 및 서버 패키지를 펌프하고 다른 원격 위치로 보냅니다.단일 이벤트 루프에 여러 개의 cURL 다중 핸들이 허용됩니까?

내가하고 싶은 것은 각 클라이언트에서 보낸 데이터를 자신의 데이터 구조 (일부 연결 목록)로 '그룹화'하고 이러한 목록을 동시에 처리하는 것입니다. 처리량이 중요하므로 최대한 많은 양의 데이터를 동시에 전송할 수 있기를 원합니다 (최대 10k 개의 손쉬운 핸들을 동시에 처리 할 수 ​​있음).

내가 생각하고 접근 방법은 다음과 같습니다

  1. 각 쉬운 핸들을 처리하는 큰 스레드 풀을 (100 개 스레드를 말한다)하게한다.
  2. 모든 10k 쉬운 핸들에 대해 멀티 핸들을 처리하는 단일 스레드가 있습니다.
  3. 멀티 핸들을 처리하는 여러 스레드 (예 : 4)를 생성하여 각각 2500 개의 쉬운 핸들을 처리합니다.
  4. 클라이언트마다 멀티 핸들이 있으므로 잠재적으로 100 개의 멀티 스레드 핸들을 처리 할 수 ​​있습니다.

내가 알고 싶은 것은 # 2와 # 3을 결합하여 단일 이벤트 루프에서 여러 개의 다중 핸들을 처리하는 단일 스레드를 가질 수 있는지 여부입니다. 그런 일이 허락 되었습니까? 그렇다면, 심지어 말이 되겠습니까? 가능하다면 멀티 핸들 당 클라이언트 프로세싱을 그룹화하는 요구 사항을 만족시킬 것이며 다중 핸들 당 지속적 연결을 이용할 수있게 해줄 것입니다. 그렇지 않은 경우, 모든 클라이언트에 대해 지속적인 연결을 최대한 활용할 수있는 유일한 방법은 옵션 # 4입니다. 가급적이면 나는 우리가 따르고있는 프로그래밍 모델로 인해 어떤 제약으로 인해 쓰레드의 수를 줄이고 싶다.

답변

4

이것은 매우 복잡한 질문이므로 간단히 대답 할 수 없습니다. 그것은 또한 당신이 가지고 있을지도 모르고 그러나 여기에서 지정되지 않는 다른 많은 필요 조건 및 지역 조건에 달려있을 것이다. 몇 가지 프로토 타입을 제작하고 특정 조건에 맞게 서로 비교하는 것이 좋습니다.

: 당신은 동일한 스레드에서 여러 멀티 핸들을 사용할 수 있지만 그것은 아마 조금 황당 얻을 것입니다 그리고 당신이 하나를 사용하여 모든 쉽게 추가하는 대신 그 어떠한 혜택을 오히려 볼 거라고 생각하지 않는다 그 하나 하나를 처리하십시오.

내 개인적인 취향은 # 3이지만 아마도 4보다 약간 더 많은 스레드를 사용하게 될 것입니다. 오늘날에는 8 개의 스레드가있는 CPU가 있고 곧 16 개가 될 것이기 때문에 여러분은 CPU 기반입니다. 성능을 높이기 위해 최대한 부하를 분산시키는 것이 더 좋습니다 (캐시 및 연결 재사용 등에서 여전히 많은 이득을 얻지는 못합니다).

또한 각각의 멀티 핸들은 N 개의 쉬운 핸들을 처리하기 때문에 다른 N-1 전송을 잠깐 멈추게하는 특수 전송에 대해 무언가를해야한다는 위험이 있습니다. 전체 스레드를 여러 스레드로 나누어 모든 전송을 차단하지 않는 경우

마지막으로,이 속도를 높이려면 최대 성능을 위해 curl_multi_socket_action 이벤트 기반 API를 사용하는 것이 좋습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 옵션 # 3을 사용한다면 코어 수를 늘릴 계획 이었으므로 완전히 동의합니다. 내 계획은'curl_multi_socket_action' API를 사용하기도 했으므로 올바른 방향으로 가고있는 것 같습니다 (이것은 처음으로 컬을 사용하는 것입니다).스레드 당 여러 개의 멀티 핸드가 허용된다는 것은 여전히 ​​좋은 일이지만 3 번 옵션을 사용하여이 작업이 어떻게 진행되는지 살펴볼 것입니다. – James