2009-03-16 6 views
61

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

EDIT : Linux 서버를 사용합니다.

+1

Windows의 경우이 질문 [최대 동시 Windows TCP/IP 연결 수는 어느 정도입니까?] [1] [1] : http : //stackoverflow.com/questions/413110/which-is-the-maximum -number-of-windows-concurrent-tcp-ip-connections – lsalamon

답변

-5

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

이 번호는 어렵지만 이론적으로 가능하기 때문에이 번호를 선택했다고 생각됩니다.

+52

이것은 다음과 같은 이유로 매우 좋은 답변이 아닙니다. a) 질문에 대답하지 않습니다. b) 리눅스에서는 net.core.somaxconn과 같이 조정할 수있는 특정 sysctl 설정이 있습니다.이 설정은 최대 수신 대기열 설정입니다. 또한 열린 파일 설명자의 수에는 제한이 있습니다. c) c10k 문제는 모호하며 많은 정보가 이론적이거나 전체 스택과 관련되어 있습니다. –

+2

이것은 모호한 답변입니다. 누군가 어떻게 그런 대답을 받아 들일 수 있습니까? – Juvenik

20

이것은 운영 체제뿐 아니라 구성, 잠재적으로 실시간 구성에 따라 다릅니다. Linux의 경우

:

cat /proc/sys/fs/file-max 

파일 디스크립터의 현재 최대 번호가 표시됩니다를 동시에 열 수 허용 전. 체크 아웃 http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

+1

그냥 내 우분투 (13.04) 랩톱을 체크 ... 386491. 나는 이것이 내가 만질 첫 번째 제한이 될지 의심 스럽다. – Gerry

-8

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

+2

지나치게 광범위한 진술. 실제로는 응용 프로그램 계층에서 수행중인 작업에 따라 다릅니다. 거의 모든 경우에 성능 병목이 될 것입니다. – DarkSquid

1

어떤 운영 체제입니까?

Windows 시스템의 경우 확장 성이 뛰어난 서버를 작성하므로 I/O 완료 포트와 비동기 I/O를 사용하는 경우 사용중인 비 페이징 풀의 양이 제한적입니다 각 활성 연결마다. 이 값은 시스템에 설치된 메모리의 양에 따라 제한됩니다 (비 페이징 풀은 설치된 총 메모리를 기반으로하는 유한 크기 고정 크기입니다).

많은 트래픽이없는 연결의 경우 비 페이징 풀을 사용하지 않고 잠긴 페이지 제한에 영향을주지 않는 '0 바이트 읽기'를 게시하여 더 효율적으로 만들 수 있습니다. 소켓 연결이 많이 열리는 것을 막을 수 있습니다).

외에도 프로필을 작성해야하지만 겸손하게 지정된 (760MB 메모리) 서버에서 70,000 개 이상의 동시 연결을 처리 할 수 ​​있습니다. 자세한 내용은 여기 http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html을 참조하십시오.

당연히 '연결 당 스레드'또는 '선택'과 같은 효율성이 낮은 아키텍처를 사용하는 경우 인상적인 수치는 적을 것으로 예상해야합니다. 하지만, IMHO, Windows 소켓 서버용 아키텍처를 선택할 이유가 없습니다.

편집 : 여기를 참조하십시오. http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx; 비 페이징 풀의 양이 계산되는 방식이 Vista 및 Server 2008에서 변경되었으며 이제는 더 많은 정보가 제공됩니다.

+0

흠. 흥미 롭 군. IOCP가있는 W2K의 비 페이징 풀 128MB를 사용하여 4,000 * 활성 * 소켓 (예 : 동시에 스트리밍)을 유지할 수있었습니다. 그 소켓이 유휴 상태 일 때 약 16,000을 유지할 수있었습니다. 나는 당신의 소켓이 유휴 상태이고/또는이 0 바이트 읽기 티켓이 도움이되었다고 추측하고있다. –

+0

활성을 정의하십시오. 다른 컴퓨터에서 테스트 클라이언트를 실행하고 있습니까? 어떤 형태의 흐름 제어를 사용하여 보내는 데이터의 양을 관리하고 있습니까? 내 소켓이 메시지를 울리고 있지만 0 바이트를 읽지 않았습니다. 그들은 가능한 한 빨리 데이터를 스트리밍하지 않고 실행 중이었습니다. –

+0

Windows에서 65k 연결 만 얻을 수 있다고 생각 했으므로 tcpnumconnections 레지스트리 설정을 편집해야합니다. (그리고 XP에서는 tcpip.sys에서 더 이상 제한을 두었습니다. 비트 토 런트 사이트에 대해 많은 이야기가있었습니다.) – gbjbaanb

5

Linux에서 비동기 I/O를 사용하려면 epoll을 사용해야합니다. 또한 연결 당 너무 많은 커널 공간을 낭비하지 않도록 소켓 버퍼를 미세 조정하는 것이 좋습니다.

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

8

10,000? 70,000?그게 전부예요 :

FreeBSD는 아마도 당신이 원하는 서버 일 것입니다. 여기에 little blog post은 100,000 개의 연결을 처리하기 위해 조정하는 것이고, 그때는 제로 복사 소켓과 같은 재미있는 기능이 몇 가지 있습니다. 완료 포트 메커니즘.

Solaris can handle 100,000 connections 지난 세기!! 그들은 리눅스가 더 좋을 것이라고 말합니다.

가장 좋은 설명은 확장 가능한 웹 서버 작성에 관한이 프리젠 테이션/논문입니다. 이 소프트웨어에 대한

같은 :처럼 그는 말을 두려워하지 않는 다음 응용 프로그램 계층에 강정이 OS 층에 큰 혁신을 강요했다. Lotus Notes를 오픈 클라이언트 당 하나 개의 TCP 연결 를 유지하기 때문에, IBM은 리눅스

에 대한 주요 최적화 "하나 개의 프로세스, 100.000 열린 연결"사건을 기부 그리고 O (1) 스케줄러는 원래 잘 점수를 만들었습니다 관련없는 Java 벤치 마크에서 일부 . 하단의 라인은이 팽창이 입니다.

+2

내 고객이 요구하는 것보다 많기 때문에 나는 70,000에 멈췄다. 그래서 시험은 통과되었다. 비 페이징 풀 한도가 계산되는 방식이 변경되면 Windows Server 2008 컴퓨터가 100,000 개의 연결에 문제가 없을 것이라고 생각합니다. –

+0

인용 한 프레젠테이션에 대한 링크를 공유 할 수 있습니까? –

+1

@BrianCline 아마 더 이상 필요 없어,하지만 나는 또한 그것을 찾은 것 같아요 : https://www.slideshare.net/Arbow/scalable-networking (슬라이드 33) – Piyin

3

은 응용 프로그램에 따라 다릅니다. 각 클라이언트의 패키지가 몇 개 밖에 없다면 100K는 Linux에서 매우 쉽습니다. 내 팀의 엔지니어가 몇 년 전에 테스트 한 결과, 연결 후 클라이언트의 패키지가 없으면 Linux epoll은 CPU 사용률이 50 % 미만인 읽기 전용으로 400k fd를 볼 수 있습니다.

75

1600k 동시 유휴 소켓 연결을 달성하고 동시에 Linux 데스크톱 (16G RAM, I7 2600 CPU)에서 57k req/s를 달성했습니다. epoll을 사용하여 C로 작성된 단일 스레드 http 서버입니다. 소스 코드는 github, blog here입니다.

편집 :

나는 JAVA/Clojure의로, 모두 동일한 컴퓨터에서 600K 동시 HTTP 연결 (클라이언트 & 서버)했다. 상세 정보 post, HN 토론 : http://news.ycombinator.com/item?id=5127251

(는 epoll와) 연결 비용 :

  • 응용 프로그램이 연결
  • TCP 버퍼 2 * 4K ~ 10K에 따라 약간의 RAM이 필요 이상
  • epoll 파일은 epoll에 (7)

등록 된 각 파일 디스크립터 공동에서, 파일 디스크립터 일부 메모리를 필요 32 비트 커널에서는 약 012 바이트이고, 64 비트 커널에서는 약 160 바이트입니다.

+3

1 백만 상자, 참조하십시오 http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ – leef

+13

@leef 1600k는 160 만 ... – wallacer

+2

하하하 ... 1,000 만 연결 http : //highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html – Lothar

0

개방형 소켓의 개수에 제한이 정수 한계에 의해 정의되는 OS의 수신 연결/proc 파일 시스템

cat /proc/sys/fs/file-max 

최대의 구성이다.

리눅스 자체는 오픈 소켓이 개 있습니다.

소켓을 사용하려면 수신 대기중인 애플리케이션이 필요합니다. 웹 서버, 소켓 당 일정량의 RAM을 사용합니다.

RAM과 CPU는 실제 한계를 소개합니다. (현대 2017, 수십억이 아니라 수백만을 생각할 것)

1 백만 개가 쉽지 않습니다. 100 만 개의 소켓을 관리하려면 X 기가 바이트의 RAM을 사용해야합니다.

발신 TCP 연결은 IP 당 65000 개의 포트 번호로 제한됩니다. 무제한 IP 주소가 아닌 여러 IP 주소를 가질 수 있습니다. 이것은 TCP가 Linux가 아닌 한계입니다.

관련 문제