성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>윈도우 서버 환경에서, 최대 생성 가능한 소켓(socket) 연결 수는 얼마일까?</div> <br /> 사실, 처음 이 질문에 의문을 느꼈을 때 제 심중의 대답은 Port 수 제한이었습니다. unsigned short(2byte)이니까 65535일 텐데 그나마 시스템에서 사용하는 포트를 제외해야 하니 약 60K 정도는 생성할 수 있을 것이라는 계산이었습니다.<br /> <br /> 서버 한 대에 6만 개의 클라이언트라면 그다지 나쁘지 않은 연결 수인 것 같았지만, 최근의 64비트 다중 코어/소켓을 장착한 고성능 서버들이 출현하는 상황에서 거의 무한대에 가까운 16byte 주솟값을 갖는 IPv6에서도 포트를 나타내는 타입이 USHORT인 것을 보고는 다소 놀랬습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > === ws2ipdef.h === typedef struct sockaddr_in6 { ADDRESS_FAMILY sin6_family; // AF_INET6. <b style='COLOR: blue'>USHORT sin6_port; // Transport level port number.</b> ULONG sin6_flowinfo; // IPv6 flow information. IN6_ADDR sin6_addr; // IPv6 address. union { ULONG sin6_scope_id; // Set of interfaces for a scope. SCOPE_ID sin6_scope_struct; }; } SOCKADDR_IN6_LH, *PSOCKADDR_IN6_LH, FAR *LPSOCKADDR_IN6_LH; </pre> <br /> 여전히 미래에도 60K 동시 연결만을 제공한다는 걸까요?<br /> <br /> 도저히 그럴 수는 없다는 상식으로, 검색을 해보았습니다. 그런데... 꽤나 의외더군요. 이에 대한 의문을 갖는 사람도 별로 없었을 뿐더러, 대부분은 답변까지 포함해서 틀린 답들뿐이었습니다. (일부 답변은 Windows 2000만 있었을 당시라서 그때에는 맞는 답일 수 있습니다.)<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 이론상 접속 가능한 최대 인원은? ; <a target='_tab' href='http://www.gpgstudy.com/forum/viewtopic.php?topic=5370'>http://www.gpgstudy.com/forum/viewtopic.php?topic=5370</a> 다시한번질문드립니다.소켓의 한계...한피씨의 서버용량은??? ; <a target='_tab' href='http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=15833'>http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=15833</a> 소켓 생성시 최대개수는..... 얼마나.. ; <a target='_tab' href='http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MaeulNo=20&no=206826&ref=206665'>http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=50&MaeulNo=20&no=206826&ref=206665</a> Windows에서 열 수 있는 Socket 수 얻는 방법 ; <a target='_tab' href='http://bspfp.pe.kr/63'>http://bspfp.pe.kr/63</a> WSAAsyncSelect 로가능한 소켓갯수는... ; <a target='_tab' href='http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=16299'>http://www.tipssoft.com/bulletin/board.php?bo_table=QnA&wr_id=16299</a> </pre> <br /> 사실, 검색도 힘들었는데... 디아블로인가... ^^; 게임에서 제공되는 소켓 아이템이라는 동일 이름 때문이었습니다. (다시 한번 놀랬지만, 게임 유저들의 그 참여/공유 정신은 대단한 것 같습니다. ^^)<br /> <br /> 다음 차례로, 외국 자료가 남았군요. 검색을 해보니, 진단이 딱 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > One Million TCP Connections... ; <a target='_tab' href='http://www.serverframework.com/asynchronousevents/2010/12/one-million-tcp-connections.html'>http://www.serverframework.com/asynchronousevents/2010/12/one-million-tcp-connections.html</a> </pre> <br /> 윈도우상에서의 이론상 한계는 "<a target='tab' href='https://social.technet.microsoft.com/Forums/windowsserver/ko-KR/fb7a6ef7-5a70-43a4-b0fe-c0252877467b/concurrent-tcp-connection?forum=winservergen'>16,777,214</a>"라고 합니다. 이 정도면 결국 실질적인 한계가 문제인데, 아래의 글에서 잘 정리해 주고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > How to support 10,000 or more concurrent TCP connections ; <a target='_tab' href='http://www.serverframework.com/asynchronousevents/2010/10/how-to-support-10000-concurrent-tcp-connections.html'>http://www.serverframework.com/asynchronousevents/2010/10/how-to-support-10000-concurrent-tcp-connections.html</a> </pre> <br /> <ul> <li>Data copies</li> <li>Context switches</li> <li>Memory allocation</li> <li>Lock contention</li> </ul> <br /> 즉, 서버 스펙도 따라야 하고, 해당 응용 프로그램의 메모리/로직에 따라서 천차만별이 된다는 것이죠. ^^<br /> <br /> 참고로, 아래는 일반적인 threshold 값들인데 아마도 Windows Server 2003 기준의 값인 것 같습니다. 운영체제마다 변경된 부분이 있을 테니 적용할 때는 적절하게 감안을 해주셔야 할 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Configure the max limit for concurrent TCP connections ; <a target='_tab' href='http://smallvoid.com/article/winnt-tcpip-max-limit.html'>http://smallvoid.com/article/winnt-tcpip-max-limit.html</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, 아직... 의문이 안 풀린 분들이 있을 텐데요. 과연 어떻게 포트 번호 범위를 넘어서는 16,777,214 값이 나오게 된 걸까요? 이에 대한 설명은 위에서 소개한 "<a target='_tab' href='http://www.serverframework.com/asynchronousevents/2010/12/one-million-tcp-connections.html'>One Million TCP Connections...</a>" 글의 댓글에서 글쓴이가 쉽게 설명해 주고 있습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; width: 700px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> No, that's a common misconception. <b style='COLOR: blue'>You're limited to the local ports when making outbound connections as each connection consumes a local port and they are limited to 65535</b> as you point out and when you take into account the number of ports already in use <b style='COLOR: blue'>for other services</b> and any connections currently in <b style='COLOR: blue'>TIME_WAIT the maximum number of outbound ports is usually at most 50k</b>.<br /> <br /> <b style='COLOR: blue'>Inbound ports are identified by a tuple that consists of the local ip and port and the remote ip and port</b> and so are not limited in the same way. I've run tests whereby a simple server on very modest hardware supported more than 70,000 concurrent active connections - the test server and client that I used can be found here: <a target='_tab' href='http://www.lenholgate.com/archives/000568.html'>http://www.lenholgate.com/archives/000568.html</a><br /> </div><br /> <br /> 오~~~ 역시 머리 좋은 사람들은 다르군요. ^^ 어차피 내부에서 해당 소켓을 식별만 하면 되는데 굳이 2바이트 정수로 제한할 필요 없이 구분키의 범위를 연결을 시도한 측의 IP/Port를 함께 포함하니 자연스럽게 65,535개의 한계가 없어져버립니다. 실제로 글쓴이는 760MB 메모리만을 가진 Windows Server 2003 시스템으로 7만 개의 동시 연결을 테스트했다고 합니다.<br /> <br /> 재미있군요. 직접 테스트 해보실 분들 계신가요? 700MB 정도에 7만 개면, <a target='_tab' href='http://www.sysnet.pe.kr/0/0/342'>24GB 메모리</a>면 테스트에 사용한 동일한 서버 프로그램으로 210만 개는 무난하게 나온다는 얘기가 되는군요. 그럼, 서버는 그 정도 사양으로 한 대 준비하면 될 것 같고. 반면에 클라이언트는 제법 준비를 해둬야 합니다. 왜냐하면 클라이언트 측은 여전히 65,535 포트 범위 제한이 있기 때문에, 100만 개 연결 테스트만 해도 20대 정도가 넘게 필요합니다. Virtual NIC의 특별한 제한이 없다면 가상 PC를 20개 정도 마련해야겠군요. (참고로, 가정용 무선 Access Point로는 네트워크 연결 테스트하지 마세요. ^^ 제 경우에는 천 개만 넘어도 네트워크가 멈춰버렸습니다.)<br /> <br /> 혹시, 환경 구성해서 테스트하시는 분이 계시면 결과 좀 공유 부탁드리겠습니다. ^^<br /> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
6076
(왼쪽의 숫자를 입력해야 합니다.)