2011-03-02 5 views
2

스트리밍 서버로 도움이되는 학생들이 생겼습니다. 그들은 동기 소켓과 클라이언트 당 하나의 쓰레드를 사용하는데 이것은 실제로 효율적이지 않습니다. 비동기 메서드를 사용하여 .Net에서 IOCP를 사용하는 것이 좋습니다.가장 효율적인 스레드 수는 무엇입니까?

문제는 비동기식 소켓이 아키텍처의 한 스레드/소켓 유형보다 효율적일 때 언제든지 생각해 보지 못했다는 것입니다. IIRC는 가장 효율적입니다. 코어 당 두 개의 스레드가 있습니다.

누구든지이 부분을 밝힐 수 있습니까? 비동기식 소켓은 언제 더 효율적이됩니까? 코어 당 최적의 스레드 수는 얼마입니까?

답변

1

표준 "하나의 코어 당 하나의 스레드"는 여기에 적용되지 않습니다. 스레드는 느린 연결 및 I/O 완료를 기다리는 많은 작업을 수행합니다. 소켓과 관련된 스레드는 일반적으로 실제 작업을 거의 수행하지 않으므로 비동기 소켓을 사용하면 매우 빨리 승리 할 수 ​​있습니다.

비동기 완료 핸들러 자체가 I/O (디스크 또는 dbase 일 수도 있음)를 기다리는 데 많은 시간이 걸리는 경우 변경되며, 스레드 풀 스케줄러는 아직 완료하지 않은 작업자를 따라 잡는데 약간 시간이 걸릴 수 있습니다. t 번 사이클. 추가 TP 스레드는 초당 두 번 추가됩니다.

1

응용 프로그램에 따라 다릅니다. 디스크 또는 네트워크 I/O 또는 계산을 수행하는 10 개의 스레드를 기다리는 1000 개의 스레드가있는 경우 ... CPU (또는 하이퍼 스레딩이있는 경우 가상 CPU) 당 스레드 및 프로세스가없는 이벤트 구동 디자인이 더 효율적입니다. 앱이 동작하는 방식을 관찰하고 이에 따라 스레드 수를 조정하십시오.

2

비동기 소켓이 항상 더 효율적입니다.

동기 소켓과 비동기 소켓의 차이점은 비동기 소켓이 스레드를 차단하는 대신 I/O completion ports을 사용한다는 것입니다. 차단 된 스레드는 스레드가없는 경우와 비교하여 추가 자원, 주로 메모리를 사용합니다.

코어 당 스레드 수에 대한 이야기는 잘못되었습니다.
가장 효율적인 스레드 수는 코어 당 하나의 실행 스레드 수입니다. 그 이상도 이하도 아닌. 동기화 솔루션을 사용하는 경우 스레드가 데이터를 기다리는 동안 스레드가 차단되어 CPU에서 실행되지 않습니다. 비동기식 솔루션에서는 데이터를 기다리는 동안 CPU에서 실행되는 스레드가 없지만 (차단 된 스레드는 적음) 실행중인 스레드의 수는 두 경우 모두 같지만 비동기식은 적은 메모리 오버 헤드를 사용합니다.

편집 : 정확히 하나의 코어 당 쓰레드를 실행에 대한
일부 노트.
스레드가 많을수록 컨텍스트 전환 오버 헤드가 발생하고 스레드가 적어지면 코어가 유휴 상태가됩니다.
그러나 스레드가 항상 사용 중이 아니기 때문에 실제로 이상적인 스레드 수를 얻으려면 I/O가 관련된 경우 어려운 작업입니다. 따라서 I/O를 기다리는 스레드가 차단 된 경우 코어보다 많은 스레드를 가질 수 있지만 스레드의 오버 프로비저닝 균형을 조정하여 실제로 코어 당 스레드가 거의 항상 실행되도록해야합니다.

편집 2 :
추가 메모. 하나 또는 두 개의 클라이언트 (실제 사용자 수를 제외하고)와 같이 부하가 적은 동안 효율성에 대해 신경 쓰지 말고 가능한 가장 높은 부하, 즉 성능이 중요 할 때 최적화하십시오.

+0

대답을 선택하기가 어려웠지만 나는 사람의 포인트 유형에 곧바로 들어갔다.그래서 한스는 더 많은 것을 호소했습니다. 그러나 훌륭한 답을 얻으려면 +1이 있습니다. – jgauffin

+0

소켓에 대한 읽기/쓰기를 실행중인 스레드에서 비동기 기술을 사용하여 효율성을 향상시킬 수 있습니다 (스레드 관련). 많은 입출력을 처리 할 수있는 하나의 마스터 스레드가있을 수 있습니다. 비동기 소켓을 기다리지 않고 유휴 상태가되면 다른 요청을 처리 할 수 ​​있습니다. – aepheus

관련 문제