안녕하십니까? 이곳에서 늘 도움만 받고있는 늙어가는(?) 엔지니어입니다. 이 글을 빌어 감사함을 표합니다.
글을 올리게 된것은 다름이 아니오라 이번에 제가 프로젝트를 한 건 수주하게 될 것 같은데...
그 스펙이 해보지 않았던 부분이라 염치없지만 고수님들의 자문을 받고 싶어서입니다.
도와주시면 감사하겠습니다.
단적으로 말씀드리면 TCP/IP서비스 플그램을 제작해주는 것이고요, H/W구성 즉, 서버구성도 해주어야 합니다.
서버 입장에서 보면 약 200개의 클라이언트로부터 신호를 받아 약 20,000개 정도의 다른 클라이언트에게
Bypass하면 되는 일입니다. 제 입장에서 이렇게 많은 Connection을 다뤄 본 적이 없는지라 불안하기도 하여
고수님들의 경험담등을 듣고 적극 반영해보려 합니다.
1.서버의 구성은 일반 벤더사의 제품이 굉장히 고가인지라 견적을 내기도 어려워 조립을 예상하고 있고,
2.S/W는 물론 C++Builder로 개발하겠지만 콤포넌트를 TServerSocket류 보다는 Indy계열을 사용하려 합니다.
제 계획이 어떤지 판단해보시고 문제점이나 보완점등을 알려주시면 감사하겠습니다.
더불어 제가 생각하지 못한 부분이 있다면 언급하여 주시면 참고하겠습니다.
혼자 일하는 입장인지라 어디 자문을 구할곳이 막막하여 염치불구하고 드리는 질문이니
양해하시고 공력을 나눠주시면 감사하겠습니다.
고수님들의 고견을 기다리며...
|
일단 말씀하신 내용에서 문제점을 알려드리면요.
인디는 블로킹 기반 연결을 쓰니까 아마 한 연결당 하나씩의 쓰레드가 생성될 겁니다.
그런데 Win32에서 하나의 프로세스에는 기본 상태에서는 최대 2000개 정도의 쓰레드만 생성할 수 있습니다. 이건 OS 차원의 물리적인 한계이기 때문에 2천백몇십개가 되면 어느 순간에 더 이상 쓰레드가 생성되지 않습니다.
물론 프로세스 스택 크기를 낮추면 그만큼 최대 쓰레드 갯수도 늘어나지만, 2만개라면 문제가 있을 거 같습니다. TCP 연결을 유지하는 방식에서 인디로는 안될 것으로 생각됩니다. 사실 전송 횟수가 빈번해서 CPU 타임을 꽤 먹는다면, 쓰레드 스위칭에 드는 CPU 부하까지 감안한다면 연결 갯수가 2000개에 훨씬 못미친 수준에서 서버가 버벅이면서 제대로 처리를 못하게 될 수도 있습니다.
만약 매번 패킷이 전달되는 횟수가 상당히 적어서 부하가 많지 않다면 일반 소켓으로 넌블로킹 전송을 하는 것도 방법이구요. 가장 간단히 구현할 수 있죠.
그정도의 연결 갯수에 전송 횟수도 아주 많다면.. 매번 전송할 패킷의 크기가 너무 크지 않다는 가정하에, IOCP가 최적일 겁니다. IOCP는 구현하기가 많이 까다로울 텐데...
IOCP보다는 덜 복잡하고 IOCP를 쓰지 않는 다른 방법은.. 아마도 여러개의 쓰레드를 쓰되 한 쓰레드당 하나씩 클라이언트가 아니라 한 쓰레드에 여러 클라이언트를 붙도록 하는 방법일 겁니다. 기본적인 블로킹 연결을 1:1이라고 보고 넌블로킹 연결을 1:m이라고 할 때, 이 방법은 n:m이라고 할 수 있겠지요.