문제

현대 표준 루트 서버에서 얼마나 많은 TCP 소켓 연결이 가능한지 아는 사람이 있습니까?(일반적으로 각 연결의 트래픽은 적지만 모든 연결은 항상 켜져 있어야 합니다.)

편집하다: 우리는 Linux 서버를 사용할 것입니다.

도움이 되었습니까?

해결책

"C10K"문제에 대한 Google 주변. 이것은 기본적으로 10,000 개 이상의 동시 연결을 관리하는 데 관한 토론과 기술입니다.

나는이 숫자가 어렵 기 때문에 선택되었다고 생각하지만 이론적으로 가능합니다.

다른 팁

1600K 동시 유휴 소켓 연결을 달성했으며 동시에 Linux 데스크탑 (16G RAM, i7 2600 CPU)에서 57K REQ/S를 달성했습니다. Epoll이있는 C로 작성된 단일 스레드 HTTP 서버입니다. 소스 코드가 켜져 있습니다 github, ㅏ 여기 블로그.

편집하다:

Java/Clojure를 사용하여 동일한 컴퓨터에서 600K 동시 HTTP 연결 (클라이언트 및 서버)을 수행했습니다. 세부 정보 게시하다, HN 토론 : http://news.ycombinator.com/item?id=5127251

연결 비용 (Epoll 사용) :

  • 응용 프로그램은 연결 당 RAM이 필요합니다
  • TCP 버퍼 2 * 4K ~ 10K 이상
  • epoll은 epoll (7)의 파일 디스크립터에 대한 메모리가 필요합니다.

각 등록 된 파일 디스크립터는 32 비트 커널에서 대략 90 바이트, 64 비트 커널에서 약 160 바이트 비용이 듭니다.

이는 해당 운영 체제뿐만 아니라 구성, 잠재적으로 실시간 구성에 따라 다릅니다.

Linux 용 :

cat /proc/sys/fs/file-max

현재 최대 파일 디스크립터 수를 동시에 열 수있는 총액을 보여줍니다. 체크 아웃 http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

10,000?70,000?그게 다야 :)

FreeBSD는 아마도 당신이 원하는 서버일 것입니다. 작은 블로그 게시물 100,000개의 연결을 처리하도록 조정하는 것에 대해, 완료 포트 메커니즘으로 작동하는 kqueue와 함께 한동안 제로 복사 소켓과 같은 몇 가지 흥미로운 기능이 있었습니다.

Solaris는 100,000개의 연결을 처리할 수 있습니다. 지난 세기에 다시!.리눅스가 더 나을거라고 하던데

제가 접한 가장 좋은 설명은 확장 가능한 웹 서버 작성에 대한 프레젠테이션/문서입니다.그는 그런 식으로 말하는 것을 두려워하지 않습니다 :)

소프트웨어에도 동일:애플리케이션 계층의 Cretins는 OS 계층의 훌륭한 혁신을 강요했습니다.Lotus Notes는 클라이언트 당 하나의 TCP 연결을 유지하기 때문에 IBM은 Linux에 "One Process, 100.000 Open Connections"케이스에 대한 주요 최적화에 기여했습니다.

그리고 O (1) 스케줄러는 원래 관련없는 Java 벤치 마크에서 점수를 매기도록 만들어졌습니다.결론은이 팽창이 우리 모두에게 도움이된다는 것입니다.

Linux에서는 Async I/O에 Epoll을 사용해야합니다. 연결 당 너무 많은 커널 공간을 낭비하지 않도록 미세 조정 소켓 버퍼가 가치가있을 수도 있습니다.

합리적인 기계에서 100k 연결에 도달 할 수 있어야한다고 생각합니다.

오픈 소켓 수에 대한 제한은 /Proc 파일 시스템에서 구성 가능합니다.

cat /proc/sys/fs/file-max

최대 들어오는 정수 한계로 정의 된 OS의 연결.

리눅스 자체는 허용합니다 수십억 열린 소켓의.

소켓을 사용하려면 응용 프로그램 청취와 예를 들어 웹 서버가 필요하며 소켓 당 특정 양의 RAM을 사용합니다.

RAM과 CPU는 실제 한도를 소개합니다. (Modern 2017, 수백만 달러가 아닌 생각)

1 백만은 쉽지 않습니다. RAM의 X 기가 바이트를 사용하여 백만 개의 소켓을 관리 할 것으로 예상됩니다.

나가는 TCP 연결은 IP 당 포트 번호 ~ 65000으로 제한됩니다. 여러 IP 주소를 가질 수 있지만 무제한 IP 주소는 없습니다. 이것은 Linux가 아닌 TCP의 한계입니다.

응용 프로그램에 따라 다릅니다. 각 클라이언트의 패키지가 몇 개 밖에 없다면 Linux의 경우 100K는 매우 쉽습니다. 우리 팀의 엔지니어는 몇 년 전에 테스트를 수행 한 결과, 결과는 다음과 같습니다. 연결이 설립 된 후 클라이언트로부터 패키지가 없으면 Linux Epoll은 50%미만의 CPU 사용 수준에서 Readablity를 위해 400K FD를 볼 수 있습니다.

어떤 운영 체제?

Windows Machines의 경우 확장을 잘하기 위해 서버를 작성하고 I/O 완료 포트 및 Async I/O를 사용하는 경우 주요 제한 사항은 각 활성 연결에 사용하는 비 페이지 풀의 양입니다. . 이것은 기계가 설치 한 메모리의 양에 따라 직접 한계로 변환됩니다 (비 페이지 풀은 설치된 총 메모리를 기반으로 한 유한 한 고정 크기 양입니다).

트래픽이 많지 않은 연결의 경우 비 페이지 풀을 사용하지 않고 잠긴 페이지 제한에 영향을 미치지 않는 'Zero Byte Reads'를 게시하여 더 효율적으로 만들 수 있습니다 (잠재적으로 제한된 리소스는 귀하를 방지 할 수 있습니다. 소켓 연결이 많이 열려 있음).

그 외에도 프로필이 필요하지만 적당히 지정된 (760MB 메모리) 서버에서 70,000 개 이상의 동시 연결을 얻었습니다. 여기를 봐 http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html 자세한 사항은.

'연결 당사자'또는 'Select'와 같은 덜 효율적인 아키텍처를 사용하는 경우 덜 인상적인 수치를 달성해야합니다. 그러나 IMHO는 Windows 소켓 서버의 해당 아키텍처를 선택할 이유가 없습니다.

편집하다: 여기를 봐 http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx; 비 임금 풀의 양이 계산되는 방식은 Vista 및 Server 2008에서 변경되었으며 이제 훨씬 더 많이 사용 가능합니다.

실제로 응용 프로그램의 경우 단일 시스템의 4000-5000 개 이상 오픈 소켓이 실용적이지 않습니다. 모든 소켓에서 활동을 확인하고 관리하는 것만으로는 특히 실시간 환경에서 성능 문제가되기 시작합니다.

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