이 내용은 cnblogs에서 여러 번 논의되었습니다. 저는 지난 이틀 동안 몇 가지 정보를 읽고 몇 가지 간단한 성과 지표를 보고 이에 대해 모두와 논의했습니다.
소켓 + 스레드/ThreadPool
대략적인 성능: 1500개 미만
구현: 소켓을 승인하고 스레드에 맡겨 관리합니다. 상대적으로 어리석지만 동기식 방식이므로 제어하기가 매우 편리합니다. 더 발전된 방법은 관리를 위해 스레드 풀에 넘겨주는 것입니다. 스레드 풀은 시스템에서 자동으로 호스팅되므로 오버헤드 스레드 시간이 절약됩니다. 일반적인 소규모 프로젝트의 경우 이 정도면 충분하며 개발도 간단합니다. 그러나 여러 소켓이 스레드 풀의 스레드를 오랫동안 점유하고 다른 연결이 많이 있는 경우 사용할 스레드가 충분하지 않다는 메시지를 받기 쉽습니다. 하하, 소켓이 작업을 덜 하고 시간을 덜 차지하도록 하는 것이 더 빠른 CPU로 바꾸는 것이 좋은 방법입니다. 또한 더 나은 타사 스레드 풀 구성 요소가 있는 경우 SmartThreadPool과 같은 해당 구성 요소를 사용하도록 선택할 수도 있습니다.
소켓+선택
대략적인 성능: 1500개 이상의 연결 후에는 성능이 저하됩니다.
구현: Select는 매우 일반적으로 사용되는 모델입니다. 차단 기능에서 하나 이상의 소켓을 폴링하고 처리할 소켓을 IList에 넣는 것입니다. 선택 폴링이 완료되면 이 IList에서 소켓을 직접 처리합니다. 구체적인 사용법은 MSDN을 참조하세요. 대기열에 처리할 소켓이 많을 때 마지막 몇 개의 소켓을 처리하는 것은 이전 소켓을 모두 순회하는 것과 동일하므로 매우 비경제적이므로 Select의 효율성은 높다고 말할 수 없습니다.
소켓+비동기
대략적인 성능: 약 7500개의 클라이언트 연결
구현: BeginXXXX, EndXXXX, 우리 모두는 그것에 익숙합니다. 최종 분석에서 비동기 소켓은 여전히 스레드 풀 기술을 사용하며 스레드 풀을 사용하여 비동기 IO를 처리합니다. 이것은 또 다른 질문을 제기합니다. .NET의 스레드 풀에 어떤 구현 방법이 사용됩니까? 이전에 누군가가 .NET의 스레드 풀이 완료 포트를 사용하여 구현되었다고 말하는 것을 본 적이 있습니다. 이를 확인할 방법이 없습니다. 내가 찾은 정보에서 (친구가 나에게 이것을 말해주길 바랍니다). 비동기 소켓은 동기 프로그램 처리 흐름보다 훨씬 복잡하며 비동기 콜백 함수의 제어는 동기 메서드만큼 직관적이지 않습니다. 하지만 한 가지 주의해야 할 점은 콜백 함수를 가볍게 사용해야 하고, 너무 많은 트랜잭션을 처리해서는 안 되며, 전송된 데이터의 처리를 다른 스레드에 맡겨 처리해야 한다는 것입니다.
IOCP(완료 포트)
대략적인 성능: 약 20,000~50,000개의 클라이언트 연결
구현: .NET에 일부 의사 IOCP가 있습니다. 이러한 의사 IOCP를 사용하여 구현된 공개 SOCKET 예제를 본 적이 없습니다. 제가 말하는 20,000~50,000개의 클라이언트 연결은 C++에서의 개발 상황을 의미하며, 이때 사용해야 할 기본 기술로는 메모리 풀, 쿼리 알고리즘 등이 있습니다.
pseudo-IOCP가 달성할 수 있는 최대 연결 수를 확인할 수 있는 정보는 없습니다. 아는 사람이 있으면 토론할 수 있습니다. 또한 위에서 언급한 데이터 중 상당수는 일부 정보에서 발췌한 것입니다. 저는 직접 시도해 보지는 않았습니다. 고성능 서버 프로그램에는 어떤 모델을 사용할지 뿐만 아니라, 메모리 처리, 어떤 알고리즘을 사용할지 등 주의해야 할 많은 세부사항이 요구되는 기술이 필요할 수 있다고 생각합니다. 물론 이는 소프트웨어 비용 측면에서만 하드웨어에 대한 투자가 있을 것입니다.