비동기 소켓이 항상 더 효율적입니다.
동기 소켓과 비동기 소켓의 차이점은 비동기 소켓이 스레드를 차단하는 대신 I/O completion ports을 사용한다는 것입니다. 차단 된 스레드는 스레드가없는 경우와 비교하여 추가 자원, 주로 메모리를 사용합니다.
코어 당 스레드 수에 대한 이야기는 잘못되었습니다.
가장 효율적인 스레드 수는 코어 당 하나의 실행 스레드 수입니다. 그 이상도 이하도 아닌. 동기화 솔루션을 사용하는 경우 스레드가 데이터를 기다리는 동안 스레드가 차단되어 CPU에서 실행되지 않습니다. 비동기식 솔루션에서는 데이터를 기다리는 동안 CPU에서 실행되는 스레드가 없지만 (차단 된 스레드는 적음) 실행중인 스레드의 수는 두 경우 모두 같지만 비동기식은 적은 메모리 오버 헤드를 사용합니다.
편집 : 정확히 하나의 코어 당 쓰레드를 실행에 대한
일부 노트.
스레드가 많을수록 컨텍스트 전환 오버 헤드가 발생하고 스레드가 적어지면 코어가 유휴 상태가됩니다.
그러나 스레드가 항상 사용 중이 아니기 때문에 실제로 이상적인 스레드 수를 얻으려면 I/O가 관련된 경우 어려운 작업입니다. 따라서 I/O를 기다리는 스레드가 차단 된 경우 코어보다 많은 스레드를 가질 수 있지만 스레드의 오버 프로비저닝 균형을 조정하여 실제로 코어 당 스레드가 거의 항상 실행되도록해야합니다.
편집 2 :
추가 메모. 하나 또는 두 개의 클라이언트 (실제 사용자 수를 제외하고)와 같이 부하가 적은 동안 효율성에 대해 신경 쓰지 말고 가능한 가장 높은 부하, 즉 성능이 중요 할 때 최적화하십시오.
대답을 선택하기가 어려웠지만 나는 사람의 포인트 유형에 곧바로 들어갔다.그래서 한스는 더 많은 것을 호소했습니다. 그러나 훌륭한 답을 얻으려면 +1이 있습니다. – jgauffin
소켓에 대한 읽기/쓰기를 실행중인 스레드에서 비동기 기술을 사용하여 효율성을 향상시킬 수 있습니다 (스레드 관련). 많은 입출력을 처리 할 수있는 하나의 마스터 스레드가있을 수 있습니다. 비동기 소켓을 기다리지 않고 유휴 상태가되면 다른 요청을 처리 할 수 있습니다. – aepheus