TCP 서버 애플리케이션에서 사용되는 스레드 수를 어떻게 최소화합니까?

StackOverflow https://stackoverflow.com/questions/32198

문제

클라이언트 TCP (또는 UDP) 요청을 처리하는 서버 애플리케이션을 구현할 때 사람들이 사용하는 모든 전략 (디자인 패턴, 구현 기술, 모범 사례 등)을 찾고 있습니다.

이 질문의 목적을 위해 요청이 상대적으로 오래 지속되고 (몇 분) 트래픽이 시간에 민감하므로 메시지 응답에 지연이 허용되지 않는다고 가정 해 보겠습니다.또한 우리는 클라이언트의 요청을 처리하고 다른 서버에 자체적으로 연결합니다.

내 플랫폼은 .NET이지만 기본 기술은 플랫폼에 관계없이 동일하므로 모든 언어에 대한 답변을보고 싶습니다.

도움이 되었습니까?

해결책

최신 접근 방식은 운영 체제를 사용하여 많은 네트워크 소켓을 멀티플렉싱하여 애플리케이션이 트래픽이있는 활성 연결 만 처리하도록하는 것입니다.

소켓을 열 때마다 선택기와 연결됩니다.단일 스레드를 사용하여 해당 선택기를 폴링합니다.데이터가 도착할 때마다 선택기는 활성화 된 소켓을 표시하고 해당 작업을 자식 스레드에 전달하고 폴링을 계속합니다.

이렇게하면 각 동시 작업에 대한 스레드 만 필요합니다.열려 있지만 유휴 상태 인 소켓은 스레드를 묶지 않습니다.

다른 팁

보다 소극적인 방법은 IO 완료 포트를 사용하는 것입니다. (윈도우) IO 완료 포트를 사용하면 폴링을 관리하기 위해 운영 체제에 맡기므로 잠재적으로 NIC 드라이버 지원과 함께 매우 높은 수준의 최적화를 사용할 수 있습니다. 기본적으로 OS가 관리하는 네트워크 작업 대기열이 있으며 작업이 완료 될 때 호출되는 콜백 함수를 제공합니다. (하드 드라이브) DMA와 비슷하지만 네트워크 용입니다.

Len Holgate는 몇 년 전 Codeproject에서 IO 완료 포트에 대한 eccelent 시리즈를 작성했습니다. http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

그리고 .net 용 IO 완료 포트에 대한 기사를 찾았습니다 (하지만 읽지 않았습니다). http://www.codeproject.com/KB/cs/managediocp.aspx

확장 가능한 대안을 시도하고 작성하는 것에 비해 완성 포트를 사용하는 것이 쉽다고 말하고 싶습니다. 문제는 NT (2000, XP, Vista)에서만 사용할 수 있다는 것입니다.

C ++ 및 Win32를 직접 사용했다면 중복 된 I / O 및 I / O 완료 포트에 대해 읽어 보는 것이 좋습니다.완전한 소스 코드가 포함 된 무료 C ++, IOCP, 클라이언트 / 서버 프레임 워크가 있습니다. 여기 를 참조하세요.

.Net을 사용하고 있기 때문에 모든 연결에 대해 스레드가 필요하지 않도록 비동기 소켓 메서드를 사용해야합니다.이 블로그 게시물에는 유용한 시작점이 될 수있는 몇 가지 링크가 있습니다. http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (최고의 링크 중 일부는 원래 게시물에 대한 댓글에 있습니다!)

G'day,

스레드 프레임 워크에 사용하려는 은유부터 살펴 보겠습니다.

스레드가 수신 요청을 수신하고 새 요청이 들어 오면 작업을 수행하고 풀의 다음 스레드가 수신 요청을 수신하기 시작하는 "리더 팔로워"일 수 있습니다.

또는 동일한 스레드가 항상 들어오는 요청을 수신 한 다음 스레드 풀에서 사용 가능한 다음 스레드로 요청을 전달하는 스레드 풀입니다.

반응기 섹션을 방문 할 수 있습니다.몇 가지 아이디어를 얻을 수 있습니다.

HTH.

건배, 롭

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top