2009-12-14 6 views
1

저는 데스크톱 소프트웨어에서 많은 TCP/IP 소켓 영구 연결을 허용하는 서버를 리눅스에서 빌드합니다 (프로그래밍 언어 선택). 이것이 어떻게 저렴하고 효율적으로 수행 될 수 있습니까? 기계는 60000 개 이상의 포트를 가질 수 없으므로 600k 연결을 지원해야한다면 10 개의 리눅스 박스가 필요합니까?수천 개의 영구 네트워크 연결을 허용하는 서버를 구축하는 방법은 무엇입니까?

각 연결에 필요한 계산이 매우 적기 때문에 (한 번에 95 %의 유휴 상태) 하나의 리눅스 박스가 이미 600k를 처리 할 수 ​​있기 때문에 포트 제한을 극복하기 위해 돈과 자원을 낭비하고 싶지 않습니다.

아이디어가 있으십니까?

+1

서버를 실행중인 경우 각 클라이언트마다 하나의 포트가 아니라 하나의 포트 만 바인딩하면됩니다. – Kimvais

+0

연결을 수락하면 서버 포트가 생성되지 않습니까? – erotsppa

+0

클라이언트 (ip : port) -server (ip : port)의 쌍인 서버 소켓을 만듭니다. – MBO

답변

6

연결은 다음 튜플로 식별됩니다. [서버 IP, 서버 포트, 클라이언트 IP; Client Port]를 사용하면 컴퓨터 당 60,000 개 이상의 포트를 사용할 수 있습니다.

얼랑 (Erlang)은 1000 개의 연결 중 10 개를 효과적으로 처리합니다. Apache와 Erlang Yaws 사이에이 comparison을보십시오.

+0

그래서 그 튜플에 따르면, 메모리 제한을 벗어난 서버쪽에 실제로 제한이 없습니까? 나는 그 때 그것을 잘못 얻었다. – erotsppa

+0

@erotsppa : 그것이 내가 좋아하는 것입니다. 당신은 항상 새로운 것을 배울 수 있습니다! 재미있어! – jldupont

1

할 수 아니요에는 각 연결마다 포트가 필요합니다. HTTP 서버는 하나의 포트 (일반적으로 80)를 사용합니다.

+0

포트 80은 위대한 예입니다. +1. –

1

어떤 상대적으로 널리 사용되는 언어가 나는 언어에 대한 갈 것이라고 합리적으로 효율적인 소켓 라이브러리를 가지고 있기 때문에 :

  1. 가 어떤에서 효율적인가요 당신은 데스크탑에서 데이터로 할 필요가 처리
  2. 당신 가장 일반적인 함정/디자인 패턴을 피하기 위해 익숙 함 (읽기 쉽고, 가장 친숙 함)
0

괜찮은 프레임 워크에서는 쉽게이 작업을 수행 할 수 있어야합니다. 이해하기 쉽지 않은 Twisted를 사용합니다 (파이썬과 비동기 프로그래밍을 이해한다고 가정).

비동기 프로그래밍은 600k 스레드를 시작하고 싶지 않기 때문에 꽤 많이 주어진 것입니다.

관련 문제