IOCP가 제일 유리하고...
시스템이 기본적으로 여는 포트가 꽤 많기때문에 실제 쓸수 잇는건 그 이하입니다.
그리고 IOCP는 Overlapped IO 의 결과를 받아오는 방식의 이름입니다...
그리고 소켓 방식 이전에 중요한건 얼마나 많은 처리를 하느냐입니다... 물론 쓰래드 많으면 CPU를 좀 많이 먹긴 하지만 요즘에 어지간한 상황에선 Context Switching 의 부하가 큰 비율을 차지하는 경우는 드뭅니다. 문제가 되면 IO 쪽이 대부분이지
카라얀 님이 쓰신 글 :
: 역시 빌더님께서 정확한 답변을 해주시는군요 ^^ 감사합니다. 몇가지 더 궁금한게 있는데 답변해주시면 고맙겠습니다.
: 빌더님 프로그램 보니까 동시접속 수가 6만 4천4백 71개로 표시되었던데 65535 거의 근접하지만 끝까지 가지 못하는 이유가 있나요?
: 또, 소켓 API도 비동기 방식도 있고, 오버랩드I/O도 있는데, 동시접속 수가 몇만명 이상 되려면 반드시 IOCP를 써야 하는건지요.
:
:
:
:
: 빌더(TWx) 님이 쓰신 글 :
: : 카라얀 님이 쓰신 글 :
: : : 인디로는 4천도 힘들다는 말도 있고, IOCP 이용하면 1만명 까지 된다는 말도 있고,
: : : 지금은 CPU가 멀티코어에 하이퍼스레드 지원되서 10배 더 많은 4만명? 정도? 돌릴수 있다는 말도 있고,
: : : 실제 동시접속 소켓수는 최대 몇개까지 가능할까요
: :
: :
: :
: :
: : 답변:
: :
: : 대충 Indy 에 대한 답변 글들을 훑어 보니까...
: :
: : Indy 에서 TIdThread 수정하면 몇만 명도 가능...
: :
: : 64bit 델파이 이용해서 Indy 쓰면... 멀티코어 하이퍼스레드 지원되서 10배 더 많은 4만 명도 가능하다는... 여러 얘기들이 있던데
: :
: : 몇만 명 이상의.. 동시접속을 고려한 Client/Server 프로그램을 실제로 구현해 본... 경험 없이 추측으로만 하는 얘기들로 보이네요...
: :
: :
: : Indy Framework 구조는 Scalable Network 환경에 적합한 구조가 결코 아닙니다.
: :
: : Indy Framework 소스코드를 살펴 보면 대번에 알수 있겠지만...
: :
: : 인디는 애초 부터... 쉽게 구현하자는 게 설계 목표였고...
: :
: : 네트웍 라이브러리를 쉽게 구현하기 위해서 소켓 모델 또한 Blocking-Socket 구조로 설계되어 있습니다.
: :
: : 프레임웍이 Blocking-Socket Model 이다보니... 클라이언트 하나당 쓰레드를 생성하는 식으로 구조가 잡혀있고...
: :
: : 하나의 쓰레드가 생성되기 위해선 User-mode 에서 뿐만 아니라... 커널 모드에서도 스케쥴러가 쓰레드에 대한...
: :
: : 자료구조를 생성해서 관리해야 하기 때문에... 메모리 낭비도 크고...
: :
: : Indy 처럼... 쓰레드 기반으로 돌아가는 프레임웍의 경우... 몇천개 혹은 몇만 개의 쓰레드를 Context Switching
: :
: : 하는 것.. 자체가 매우 비효율적인 구조가 돼 버립니다... ("김모씨(testcode)"님이 뭐 정확한 답변을 적어 주셨네요...)
: :
: :
: : 동시에 접속 가능한 최대 소켓수를 물으셨는데...
: :
: : 기본적으로 Windows 7이나 8의 경우... 32비트로 프로그램을 만들더라도...
: :
: : 6만 4천에서 6만 5천개 까지는 동시 소켓접속이 가능 합니다...
: :
: : Windows Server 버전의 경우... TCP 최대 Connection 수는 디폴트 Configuration 상태에서 0x00fffffe (Default = 16,777,214)
: :
: : 입니다... 어마어마한 숫자죠...
: :
: : 그러나 저렇게 최대 Socket Connection 수가 클지라도... 65,535개의 한계를 벗어나지 못하게 되는데요...
: :
: : 이유는... TCP/IP Protocol Stack 에서 (TCP Header 구조) Port 필드가 16비트 크기를 갖기 때문 입니다...
: :
: : 결국 TCP/IP Header 구조 때문에... 하나의 아이피에 사용되어질 수 있는 최대 포트수가 65,535개로 제한 되는데...
: :
: : 이 보다 더 많은 동시 접속 소켓을 사용하도록 하기 위해서는... Network Interface Card 를 추가로 설치해서...
: :
: : 서버를 구성해야 합니다... Scalable Network 서버로 사용되는 시스템에... NIC 카드가 몇개씩 달려 있는 것도 이 때문 이죠...
: :
: : 이런 식으로 포트를 확장을 할수 있기 때문에... 사실상 10만명 이상의 동시 접속도 가능하게 됩니다...
: :
: : 프로그램에선 Multiple NIC Interface를 바인딩 처리해주면 되는 거고요...
: :
: :
: : 아래는 32비트로 서버 프로그램을 구현해서... Windows 8 에서 테스트한 것을... 캡쳐한 화면 임...
: :
: :
: :
: :
: : 혹시 몇만 명 이상의... Scalable Network Client/Server 프로젝트 개발 건이 있습니까? 있으면 연락 주세요...
: :
: : 10만 명 이상 동시접속 구현도 가능하니까요 (Socket API를 직접 이용해서 구현 합니다) ... :p
: :
: :
: :
: :
: :
: :
: : ...
서버 시장에 진출하려면 BSD 소켓만으로 구현하는게 좋습니다.
아직도 IBM AIX, SUN SPARK 머신이 돌아가는 기업이 많다는 충격적인 사실 -_-;;;;;;