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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[867] 인디 등 쓰레드블럭킹 소켓의 최대 동접수 올리는 법.
김태선 [cppbuilder] 9142 읽음    2009-03-04 19:06
인드 등 쓰레드 블럭킹 소켓을 쓰는 서버 프로그래밍에 있어서
동시 접속자 수(동접)는 최대 2000 정도입니다.
이는 보통 win32 환경에서 어플리케이션을 위한 메모리 공간이 2G 로 되어 있기 때문입니다.
즉 2G = 1M x 2000 의 관계에 의해 최대 동접수 2000 계산이 나오는 것입니다.
여기서 1M는 각 쓰레드마다 가지는 스택의 크기입니다.
실제로 테스트를 위해 인디로 클라이언트를 만들어 동시 접속수를 올려 보면 약 1980 이나 1990 정도에
머무는 것을  볼 수 있습니다.

그러면 어떻게 하면 동접을 늘일 수 있을까요?
예. IOCP를 쓰면 됩니다.
IOCP는 만들기 까다롭고 튜닝하기가 까다로워서 그렇지 잘 만들어 놓으면 1만 커넥션도 감당 할수 있습니다.
하지만 이건 제목과 주제가 상이 해서 패스~ 하고.


방법은 위에 이미 나와 있습니다.
각 쓰레드마다 1M 의 스택크기를 가지는데 실지로
각 쓰레드마다 이렇게 1M 씩이나 스택이 필요 없습니다.

그런데 어떻게 각 쓰레드마다 1M 씩 스택을 쓴다고 말할 수 있을까요?
그건 프로젝트 옵션의 Linker 탭에 보면
Max Stack Size : 0x00100000
이라는 항목이 있는데 최대 스택 사이즈가 0x00100000 = 1,048,576 Byte 즉 1M 로 설정되어 있습니다.
그러므로
Max Stack Size : 0x00080000
로 최대 스택 크기를 절반인 0.5M 으로 낮춰보면
동접 수가 3000 이상 올라가는 것을 볼수 있습니다.
이론적로는 4000가량 감당할 수 있고
Max Stack Size : 0x00040000
이라면 이론적으로 8000 동접까지 가능하다는 이야기죠.
스택 크기 0x00040000 이면 0.25M 크기인데 이 정도면 아주 충분한 스택 크기입니다.
이 스택 크기 설정은 메인 프로그램의 스택 크기에도 영향을 미치므로 너무 낮추면 프로그램이 다운 됩니다.

그런데 인디 서버 소켓은 스택 크기 1M 라는 표준적인 크기를
기준으로 성능이 튜닝되어 있기 때문에 이런 식으로 스택을 줄여
동접 수를 계속 올리면 성능에 좀 문제가 생깁니다.
또한 이는 3000개 이상의 쓰레드를 컨텍스트 스위칭(Context Switching) 해야 하는 CPU 입장에서는
매우 곤욕스러운 일이 됩니다.
즉 아무런 IP(기계어 명령어 인스트럭션)를 실행하지 않는, 코드와 무관한 CPU의 쓰레드 스위칭에
CPU 자원을 다 써버리기 때문에, 서버가 엄청나게 느리게 됩니다.

결론은 동접 수를 일정 부분 이상 어느 정도까지는 튜닝을 잘하면 올릴 수 있지만
동접이 4-5천 이상 발생한다면 IOCP 로 가는 것이 좋아 보입니다.
서버 성능이 좋으면 더 감당할 수 있을 것 같지만, 그 경우도 서버가 쓰레드 스위칭에
지나치게 CPU 성능을 허비하게 되므로 좋은 방법이 못 됩니다.
아니면 서버를 추가하여 부하를 분산하는 방법을 써야겠죠.
제가 테스트한 컴은 서버도 아니고 XP 설치된 노트북 불과 2G Dual Core CPU, 1M RAM 에서의 테스트 였기 때문에,
서버의 성능이 좋으면 더 감당할 수 있지 않을까 생각해 봅니다.

그리고 윈도우 서버의 경우는 사용자가 사용할 수 있는 메모리가 3G까지 늘어나기 때문에
더 많은 쓰레드를 생성할 수 있습니다.


그럼..
김호광 [testcode]   2009-03-04 22:42 X
요즘은 서버 당 동접 3천에서 4천 정도만 나오면 그게 신경 안씁니다. 인디건 IOCP 건 별 상관을 하지 않습니다. 워낙 서버 가격이 저렴해져서 적절한 속도가 나오면 됩니다. 제가 아는 모 게임 서버는 그냥 select socket 사용하는 걸 본 적이 있습니다.
김태선 [cppbuilder]   2009-03-04 23:16 X
예. 문제는 비용돼 효율이겠죠.
그런데 오래전에서 썼고 동접 제한이 큰 select socket을 사용한다는 것은 거의 상상이 안 가는군요.

+ -

관련 글 리스트
867 인디 등 쓰레드블럭킹 소켓의 최대 동접수 올리는 법. 김태선 9142 2009/03/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.