C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[15833] Re:다시한번질문드립니다.소켓의 한계...한피씨의 서버용량은???
Dante H [h64d5791] 4394 읽음    2002-02-26 17:05
안녕하세요 단테입니다.

헉 제 옛날 닉네임과 같은걸 쓰시는군요.. 앞으로 혼돈이 없기를..

일단 제가 아는 사항이 몇가지가 있어서 답변을 드리겠습니다.

1. 답변

일단 일반 소켓 서버당 400명의 유저를 처리한다면 채팅 서버의 경우는 평균적인겁니다.
서버의 성능은 소켓의 성능, 하드웨어의 성능도 중요하지만, 중간 중간 패킷의 해석, DB와의 연결
쿼리등이 서버 성능을 낮추는 역할(?)을 합니다. 즉 이론적으로 윈도우 서버는 Winsock 1.1을 기준
으로 말씀 드렸을때 다른거 다 빼고 Echo 정도라면 2000 커넥션 조금 못 미치게 받을 수 있습니다.
그 이후로는 커넥션이 거부되죠. 보통 분산 서버 방식을 사용해서 400*4 (서버 4대) 이런식으로
해서 1600 명을 받는다 하는데 이건 마케팅 적인 입장이고, 최고의 서버프로그래밍은 가장 적은 단
가로 최대의 효율을 내는것입니다. 즉 크레이지 아케이드 등의 윈도우 기반의 대용량 서버를 하기
위해서는 Overlapped IO를 사용한 IOCP 방식의 서버를 개발을 필수로 합니다. 단순 에코의 경우
Overlapped IO를 사용한 IOCP의 경우 제가 테스트한 결과로는 20000 커넥션은 가뿐히 넘더군요
여기에 DB, 패킷 해석이 들어가면 받을 수 있는 양이 줄어 들수 있으나 그렇게 큰 숫자는 아닐겁니다. 그리고 IOCP 방식의 경우 OS에 상당히 종속적이다 보니 CPU 갯수에 따라 엄청난 성능의 사이가
있습니다. 일반 소켓 리스너로 작업할 경우 CPU가 늘던 줄던 성능은 상관없게 됩니다. 하지만 IOCP로 제작한 경우 CPU한개마다 약 75% 정도의 성능의 향상을 가져올 수 있다는데 확인은 당근 못해봤죠.. 여하튼 최고의 서버 구조는 IOCP 방식에 분산 서버 방식을 같이 쓰는 방식입니다. 그런데 왜
일반 소켓은 2000 이라는 한계치가 생겼나.. 그건 바로 한 스레드 생성시 윈도우는 모조건 1메가의
메모리를 할당하는 문제점에서 출발합니다. 윈도우 시스템은 기본적으로 2G의 시스템 메모리, 2G의
유저 메모리를 잡게 되는데 2G = 1M * 2000 계산이 딱 떨어지지 않나요? ^^;; IOCP는 왜 2000 이상 받을 수 있는지의 설명은 제외 하겠습니다. (쓸것이 너무 많습니다.)

2. 답변
님의 생각이 맞습니다. 제가 위에서 설명했죠? 한피씨는 일단 그냥 윈속의 경우 2000 커넥션이라고
보시면 됩니다.

3. 답변
아무리 잘짜도 2000 MAX 로 받지 못합니다. 한 서버에서 많은 사용자를 받기를 원한다면 Overlapped IO를 사용한 IOCP 방식으로 서버를 바꾸십시오. 그리고 비동기, 동기 방식은 성능 차이가 없습니다. 즉 둘다 2000 이 MAX 입니다.

4. 답변
죽는 경우는 여러가지라 답변을 어떻게 못드리겠군요.. 그냥 죽으면 죽는다고 믿읍시다. (거의는 시스템 리소스 부족으로 죽습니다.)

블루 님이 쓰신 글 :
: 1. 현재 한서버 플밍당 400명의 유저를 처리하는데요...
:      비동기소켓이라 클라이언트의 접속시에 스레드는 발생시키지 않습니다.
:      다른 채팅사이트에서 한서버당 500명정도를 한계로 두고 한피씨에 서버플밍을 4대정도 그니깐 한피씨에 2000명정도를 카바한다고
:      들었습니다. 물론 정확한건 아니구요...뭐 그위에 미들웨어가 있어서 서버끼리 통신은 되겠지요..저는 한피씨에 서버플밍 4개정도를 생각하니깐
:      한 피씨에 총클라이언트 1600명정도 되겠군요.
:      그렇담 도대체 어느정도가 적정한선인지가 궁금합니다. 클라이언트의 몇명을 한 피씨 그리고 한 서버 플밍에서 처리를 할것인지에대한
:      의견을 주시면 감사하겠구요....넥슨에서 만든 크레이지 아케이드 비엔비게임을 보면 동시 접속수 20만명을 돌파했다는데 도대체 서버를
:      그런곳은 몇대를 두는지도 궁금하군요...수십대 수백대의 서버를 둔다는건 말이될려나..!!! 암튼 첫번째 질문이구요..
:
: 2. 두번째 질문은 님이 올리신 글중에서 한프로세스당 스레드를 약 2000개까지 생성을 할수있다고 들었습니다.(물론 스택에 크기를 줄이면 더 생성할수도 있겠지만) 그럼 이 한프로세스라는게 한피씨를 말씀하시는건지요??? 프로세스와 한피씨의 개념은 다르지만 만약 님이설명하신 것도 한피씨가 아니고 한 프로세스당 2000개이면 여러프로세스 즉 서버플밍을 여러개 띠우면 2000개 이상의 스레드를 만들수 있는건지요?? 한 스레드가 1메가의 스택을 먹으면 OS가 2GB까지(4GB에서절반)스레드를 만들수 있는데 그럼 프로세스가 여러개라두 OS가 2GB까지 제공을 하니 결국 한피씨당 프로세스가 여러개라두 총 스레드수가 2000개까지로 생각을 하면 맞는지요???
:
: 3. 그리고 만약 2000개 까지 한피씨에서 생성을 할수 있다면 동기소켓으로 만들면 한피씨당 2000개의 클라이언트까지 처리를 할수 있다고 생각을 하면 되는지와 비동기로 만들면 클라이언트의 스레드를 발생하지 않고 서버 플밍을 한다면 한 피씨당 몇개까지의 클라이언트를 정상적으로 커버할수 있을까요??
:
: 4. 아~그리고 또한가지 질문이 있습니다. 제가 웹에 대해서 잘몰라서 그러는데요....웹서버가 다운된다는것은 실제로 플밍이 다운되서 재부팅을 해야하는건지 아님 소켓의 버퍼가 꽉차서 그걸 처리하느라고 나머지 클라이언트들에게는 웹페이지가 안뜨는건지궁금합니다. 만약 소켓버퍼가 다차서 나머지 클라이언트들에게 웹페이지가 안뜬다면 일정시간이 지나면 서버 관리자가 손을 대지 않아도 다시 웹서비스가 정상적으로 되는건지요??? 일반적으로 어디 홈페이지가 접속폭주로 서버다운이다라는 개념좀 설명해주시면 고맙겠습니다...

+ -

관련 글 리스트
15823 다시한번질문드립니다.소켓의 한계...한피씨의 서버용량은??? 블루 1321 2002/02/26
15833     Re:다시한번질문드립니다.소켓의 한계...한피씨의 서버용량은??? Dante H 4394 2002/02/26
15860         재질문 드립니다. 블루 1210 2002/02/27
15873             Re:재질문 드립니다. Dante H 1247 2002/02/27
15875                 그럼모든게임서비스업체의 서버프로그램은 IOCP로 제작을 하나요??? 블루 1845 2002/02/27
15876                     Re:그럼모든게임서비스업체의 서버프로그램은 IOCP로 제작을 하나요??? Dante H 2093 2002/02/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.