2010-03-24 4 views
8

TCP 소켓 서버에 시간당 다중 연결을 최적화하려고합니다.소켓 서버의 클라이언트 연결마다 새 스레드가 있습니까?

연결 요청을 수신 할 때마다 수신 대기 서버에서 새 스레드를 시작하는 것이 좋습니다.

이 인프라를 기반으로하는 서버는 몇시에 시작해야합니까? 더 이상 아무런 의미가 없을 때까지 내가 할 수있는 백그라운드 스레드의 최대 개수는 얼마입니까?

플랫폼은 C#, 프레임 워크는 모노, 대상 OS는 CentOS, RAM은 2.4G, 서버는 구름 위에 있으며 초당 약 200 건의 연결 요청이 예상됩니다.

답변

8

아니요, 연결 당 하나의 스레드가 없어야합니다. 대신 비동기 메서드 (BeginAccept/EndAccept, BeginSend/EndSend 등)를 사용해야합니다. 이것들은 시스템 자원을 훨씬 더 효율적으로 사용할 것입니다.

특히, 만드는 모든 스레드는 컨텍스트 전환, 스택 공간, 캐시 누락 등의 측면에서 오버 헤드를 추가합니다. 예를 들어, Linux는 Windows보다이 기능을 관리하는 편이 낫지 만 원하는만큼 많은 스레드를 만들 수있는 자유 의지는 변명의 여지가 없습니다.)

+0

@codeka 연결 당 프로세스는 어떻습니까? 클라이언트가 서버에 연결할 때 서버가 다른 프로세스를 생성하고 클라이언트를 클라이언트로 리디렉션합니까? –

+0

글쎄, 기술적으로 연결 당 하나의 프로세스가 동일합니다. 아파치 (예를 들어)가 일일 연결에 하나의 프로세스가 아닌 동시 요청을 처리하기 위해 "작업자 프로세스"풀을 사용하는 이유입니다. –

+1

+1 스레드 풀에 대한 언급은 OP가 구현할 수있는 좋은 접근 방법 일 수 있습니다. –

관련 문제