C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[22072] Re:동시접속 소켓수 최대가 몇개까지 가능할까요
빌더(TWx) [builder] 28887 읽음    2012-11-09 01:47
카라얀 님이 쓰신 글 :
: 인디로는 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






...
카라얀 [lovekorea]   2012-11-09 02:46 X
답변 감사합니다 ^^
우리 회사도 프로그래밍 개발 회사이지만 네트웍 쪽은 꽝이에요 흐~
프로그램 의뢰하는 고객들이 많은 편인데, 클라이언트/서버 개발 의뢰 건 있으면, 꼭!!! 빌더님께 연결해 드리겠습니다 ^^
카라얀 [lovekorea]   2012-11-09 03:03 X
윈도 7, 윈도 8 에서는 알려주신 대로 6만 5천 근접해서 나온다는거 잘 알게 되었습니다. 그럼 XP 에서는 동시접속이 어느정도 나오는건가요.
Lyn [tohnokanna]   2012-11-09 03:15 X
똑같습니다...

단 OS별로 제한을 걸어둔 경우가 있습니다(리눅스는 대부분 2천개. XP는 5천개)
이 경우 설정을 살짝 만짐녀 바꿀 수 있는데 XP의 경우

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort 레지스트리에 의존하며 만약 키가 없을시 기본값은 5000개 입니다.

오랑캐꽃 [oranke]   2012-11-09 13:05 X
NIC당 최대동접을 직접 확인하시는 꼼꼼함에 감탄합니다.
저 상태에서 실제 정보를 흘려보내야 한다면...
100M 데디케이트를 물려도 초당 200바이트정도 포돗이 날아가겠네요...
Lyn [tohnokanna]   2012-11-09 14:04 X
오랑캐님 //
TCP헤더, IPv4 헤더 각각 20바이트씩 빼야죠...
오랑캐꽃 [oranke]   2012-11-09 14:29 X
Lyn님 // 아차차~~ 평소엔 무시하던 물건이 고기 있었네요~~ ^^;
IP는 20~60바이트, TCP는 20에서 시작해 "32비트"씩 늘어나덩가요? 솔찬허네~~

여담으로... 리눅스 우분투의 경우 동시에 열 수 있는 파일갯수 기본값이 1024개로 되어있어요. 정말 적죠.
예전에는 이거 늘려주려면 커널을 재빌드 해야했다는데 전 뉴비라 그딴거 모르고...  "ulimit -n 숫자" 로 간단히 늘어난다네요.
재부팅후에도 유지하려면 /etc/security/limits.conf 의 nfile 설정을 만져주면 되고요.
http://oranke.tistory.com/242
Lyn [tohnokanna]   2012-11-09 14:35 X
음 1024개엿나요?

에이.. IDC 팀이 알아서 하겠지뭐 ㅡㅡ;
오랑캐꽃 [oranke]   2012-11-09 14:53 X
암튼 몇만명 이상의 동접을 한 머신에서 지원하는 스케일러블한 서버를 구현하고 운영해보셨다니... 대단하십니다.
십년 가까이 게임바닥에서 굴렀지만... 신문에 스샷이 실릴만큼 바글바글했던 날도 머신당 실제동접은 오천이 안나왔거덩요.
죽기전에 그만큼의 유저가 동시에 몰리는 서비스를 한 번 만들어보고 싶어요~~
카라얀 [lovekorea]   2012-11-10 00:02 X
협력업체 네트웍 부서 팀장과 점심 같이 먹는 자리에서 이런저런 수다 떨다가 궁금한것 물어봤는데 인디 같은 식의 Thread per Clinet 방식으로 서버 프로그램 짜면 메모리 동시접속 속도 다 제대로 안나온다고 말씀하시더군요. 무식하게 생성되는 스레드가 오히려 프로그램 퍼포먼스의 발목을 잡는다네요.
Lyn [tohnokanna]   2012-11-10 00:07 X
제대로 안나온다기 보단 낭비가 좀 있죠... 못쓸정도는 아니에요

아파치가 그럭저럭 잘 굴러가는거 보면 알 수 있고...
카라얀 [lovekorea]   2012-11-10 00:07 X
저는 요즘 C#으로 메트로 프로그램 짜는 프로젝트 진행중인데 빌더님은 서버 프로그램 짜게되면 C++ Builder로 작업하시는 건지요
카라얀 [lovekorea]   2012-11-10 00:11 X
아 네. 저는 이만 자러 갑니다 모두 굿나잇 ^^
빌더(TWx) [builder]   2012-11-10 11:32 X
카라얀 //

Visual Studio C#으로 Metro Style Application 개발하고 있나 보네요... 그쪽이 흥미로운 요소가 많죠?
C++ Builder로는 업무용 프로그램 코딩할 때 사용하는 정도고... 핵심 코어나 복잡한 연산이 필요한 경우 등...
업무용 이외의 프로그램은 거의 대부분 Visual Studio C++을 이용 합니다... 컴파일러가 생성하는 코드의 질도..
Visual Studio C++ 컴파일러가 낫습니다... 특히 대용량 데이타에 대한 복잡한 연산이 필요할 때...
Parallel 연산이 가능하도록 GPU 프로세서를 이용할 수 있는 부분이 그렇죠...

오랑캐님은 대박나기 바라고 :p ..

그리고...

Lyn 군은... Thread Per Clinet 방식에 집착하고 있는 걸 보면...
유닉스 플렛폼에서.. Apache Web Server의 네트웍 구조나 쓰레드 모델에 대해서... 뭔가 크게 잘못 알고 있는 듯...
Lyn [tohnokanna]   2012-11-11 10:46 X
그럴리가요. 제대로 알고 있으니 쓸데없는 걱정은 안하셔도 됩니다
빌더(TWx) [builder]   2012-11-11 11:45 X
Apache 2.0.x employs a hybrid architecture of multiple
having multiple threads (pthreads) to handle requests. Each
listening to the listen socket, and a few worker threads to
accepted by the listener thread of the same process.

It wins over the other architectures because of fewer context switches,
and batching of information across user/kernel boundary .
오랑캐꽃 [oranke]   2012-11-12 11:04 X
린님이 한 쓰레드당 하나의 클라이언트 방식에 집착한다는 건 뭔가 잘못 읽으신 것 같고요... ^^;;
(린님은 조금 게으르기는 해도... @#$%는 아님... )

저는 수도꼭지 연결하는 거 말고... 실제로 데이터를 흘리는 방법에 대해서 고견을 청하고 싶습니다.
제 짧은 소견으로는 NIC에 값비싼 100M 데디를 물려도 한 커넥션마다 1MB 전송하는데 한시간이 넘어가는데...
이러면 정상적인 서비스가 어렵지 않나요...
굳이 이렇게 랜카드당 최대 연결을 강조하신데는 그만한 이유가 있다고 생각되어서요.

일단... 저런 구조라고 해도 어차피 대여폭에 따라 최대동접이 제한받는건 마찬가지 아닌가 싶고...
이런 상황이라면 굳이 어플리케이션에서 복수 랜카드의 바인딩을 고민하는 것 보다는...
그런거 잘 처리해주기 위해 만들어진 "뽄딩~"같은 놈들을 쓰는게 맞지않나 싶기도 하고...

암튼 고수와의 대화는 항상 두근두근 합니다~~ ^^;;
카라얀 [lovekorea]   2012-11-12 13:00 X
저도 네트웍은 잘모르는데요 헙력업체 네트웍 운영부서 팀장 하고 식사하는 자리에서 스레드가 무식하게 생성되면 프로그램 퍼포먼스 발목을 잡는다는 말을 들었고요, 제가 들은 내용을 쓴 글에 Lyn님이 제대로 안나온다기 보단 낭비가 좀 있고, 아파치도 잘 돌아가고, 또 어지간한 상황에선 컨텍스트 스위칭의 부하가 큰 비율을 차지하는 경우는 드물다는 글을 적으셨길래, 저도 Lyn님이 뭔가 잘못 알고 게시지 않을까 생각했거든요. 저도 그렇게 읽었는데 ^^;;;;
카라얀 [lovekorea]   2012-11-12 13:06 X
oranke님 100M 정도는 소호에서 홈페이지 운영할때 정도면 몰라도, 회사에서 몇만명 규모의 네트웍 운영을 생각하신다면 기가급의 전용회선을 사용해야 하는거 아닌가요. 제 컴이 네트웍 두개가 달려있어서 티밍을 실험해본 적이 있는데요. 저도 예상으로는 티밍이 속도가 더 잘나올거로 생각했거든요. 그런데 몇기가 이상되는 큰 파일을 전송해보니까, 티밍 보다 개별적인 네트웍카드의 전송대역을 합한 값이 더 높게 나오더군요.
카라얀 [lovekorea]   2012-11-12 13:08 X
이유가 뭔지는 정확하게 모르겠지만 그랬구요. 스레드 스위칭 부하에 대해선 저도 시스템 쪽에 잘몰라서 빌더님께 설명을 좀 들었으면 좋겠네요 ^^;;;
오랑캐꽃 [oranke]   2012-11-12 17:13 X
카라얀님//
그러니까... 저 화면을 볼 때 바로 떠올리는 대역폭 문제를 어떻게 해결하셨는지에 대한 고견을 구하는 거죠.. ^^;
소켓 연결 맛을 보여주시고 "몇만명 이상의 처리"가 가능하다는 떡밥을 주시니... 저같은 물고기는 팔딱팔딱~~ ^^;

그리고 전 뽄딩... 충분히 쓸만하던데... 윈도에서 티밍은 아직 안써봤어요. ^^;

덧붙여서... 아파치 2의 처리는 기본적으로 pre-fork 입니다. httpd -V 또는 apache2 -V 해보세요.
저걸 Event 방식으로 바꾸려면 소스를 내려받아 --with-mpm=event 옵션으로 재빌드 해 주어야 합니다.
"아직 제대로 동작하지 않으니 주위에 고쳐줄 프로그래머가 있을 때만 써라~"는 무시무시한 경고와 함께...
그러니 린님의 "아파치도 그럭저럭 돈다"는 얘기는 틀린게 아니죠~ ^^;;
오랑캐꽃 [oranke]   2012-11-12 17:59 X
오해가 있을까봐 덧붙이면... 아파치 2의 "Server MPM" 기본값은 리눅스에서 그렇다는 얘기입니다.
윈도에서는 WinNT로 되어있고... 얘는 빌더님 말씀처럼 IOCP를 써서 고정된 갯수의 쓰레드를 사용합니다.

아파치 홈페이지에는 유닉스계열은 prefork가 기본이라고 나오네요.
http://httpd.apache.org/docs/2.2/en/mpm.html

리눅스 이외의 유닉스는 구경해본 적도 없지만, 대부분 AMP라고 하면 리눅스에서 돌리는 것을 기준으로 하니까 저렇게 적었습니다. ^^;;
카라얀 [lovekorea]   2012-11-12 18:05 X
oranke님. 저는 프로그래밍으로 밥 먹고 살지만 네트웍은 잘 몰라요. 동시접속 소켓 글이 있어서 읽어 봤고요, 실제 열릴 수 있는 최대 소켓 제한이 몇개인지에 대한선 설왕설래 여러 의견이 있고, 확실하게 알려주시는 분이 없길래 궁금해서 질문했건거고요. 빌더님이 테스트해서 알려주신 결과 보고서 궁금중이 풀리게된거 였습니다. ^^;;;;
카라얀 [lovekorea]   2012-11-12 18:12 X
제가 게으르기도 하고 잘몰라서 그랬던거죠. 근데요 몇만명 동접을 고려한 네트웍 운영을 생각하신다면서 100M 대역을 말씀하시는게 저는 이해가 가질 않네요. 빌더님께서도 제가 궁금했던 동시에 열릴수있는 소켓을 답변해주시면서 대역폭과 연관해서 말씀하신건 아니구요. 저는 오히려 수만명의 동접을 고려한 네트웍 운영을 계획중인 분이, 100M 대역을 생각하고 있다는게 상직적으로 납득이 가질 않습니다. 제가 아무리 네트웍에 대해서 잘몰라도 수만명 동시접속에서 100M 회선은 상식적으로 생각해도 ^^;;;;
카라얀 [lovekorea]   2012-11-12 18:15 X
제 컴이 보드에 네트웍이 2개가 달려있어요. 당연히 티밍지원되고요. 보드 두개를 티밍으로 설정해서 파일 카피해봤는데, 저는 1GB 두개 티밍으로 묶어서 2GB로 해도 전송속도가 50%인 1GB 밖에 안나오던데. 리눅스에서는 2GB 속도가 다 나오나요?
오랑캐꽃 [oranke]   2012-11-12 18:25 X
음... 제 어투가 뭔가 이상한가보네요. 의미가 자꾸 이상하게 전달되는 느낌이... ㅜㅜ;
전 단지 빌더님 글 말미에 수만명 나아가 십만 이상의 동접도 한 머신에서 처리한다는 얘기가 있으셔서...
그렇다면 대역폭은 어찌 감당하시는지에 대한 노하우가 궁금했을 뿐인데...
만약 게임서버에서 그런게 가능하다면, 골치아픈 동기화도 필요없고 정말 좋거덩요~

게시판에서 글로 제 호기심을 전달하기는 쉽지 않다는 생각이 드네요.
불쾌하셨다면 사과드립니다.
오랑캐꽃 [oranke]   2012-11-12 18:36 X
1GB 얘기하시는 것을 보니까 로컬네트웍이신가보네요.
보내는 차선은 2차선으로 확장되었는데 받는 차선은 그대로라 그런것 같습니다. 수신측도 확장해주세요.

전 직장에서는 공유기 대용으로 쓰던 우분투 서버에 회선이 두 개 박혀있어서... 가끔씩 잘 써먹었습니다.
지금은 뭐 공유기안에 틀어박혀있어서...
카라얀 [lovekorea]   2012-11-12 18:41 X
oranke님. 제가 사용하는 보드 둘다 티밍 지원하구요. 양쪽다 네트웍 2개씩 보드에 달려있고, 송신 수신 양쪽다 티밍으로 설정해서 파일 카피해봤는데 2GB 속도가 안나오고 1GB가 한계더라구요. 등록정보에서 보면 컴 둘다 네트웍이 2GB로 표시되던데 속도는 그대로고.
오랑캐꽃 [oranke]   2012-11-12 18:54 X
몰라요~ 그런 상황이라고 하시니 급 흥미가 당기는군요... 시간날 때 함 시도해보겠습니다.
카라얀님도 우분투 깔고 뽄딩 함 해보세요~~ ^^;
오랑캐꽃 [oranke]   2012-11-12 19:49 X
지식이 짧아서 두가지정도밖에 안떠오르는데요...

1. 라우팅이 제대로 되지 않는다. -> 좀 나은 라우터로 교체.
2. 하드 대역폭이 전송속도를 못따라간다. -> SSD 또는 레이드 0 구성.

저도 어지간히 넷맹에 기가비트 환경에서 놀아본 적도 없는지라... 대충 이정도??
전직장의 경우 내부네트웍은 100Mb 였지만 허브는 좀 좋은거였거덩요.
사용하시는 라우터가 기가비트 매니징 기능이 있는지 살펴보시구요...
다나와 뒤져보니 기가비트 스위칭 허브 가격도 참 착해졌네요.
frozen [frozen]   2012-11-13 00:21 X
오랑캐님 16 개의 제온 프로세서가 장착된 엔터프라이즈급 서버도 있습니다. 거기다 Giga 급 네트웍카드 물리면 몇만명 ~ 10만명 정도도 충분히 서버 한대로 커버할 수 있죠. 상황에 따라서 추후에 코어 램 네트웍 다 확장됩니다. 그 물건을 모 업체에서 본적이 있는데 탐나더군요.
오랑캐꽃 [oranke]   2012-11-13 02:06 X
frozen님//
아... 확실히 제 표현이 뭔가 문제가 있나보군요. 
이 늦은시간에 새로 가입한 분께 첫댓글을 받다니...
네~ 잘 알겠습니다. 첫댓글 감사드립니다.
볼포에서 좋은 시간 되시구요, 좋은 밤 되세요~~^^

+ -

관련 글 리스트
22071 동시접속 소켓수 최대가 몇개까지 가능할까요 카라얀 5671 2012/11/08
22072     Re:동시접속 소켓수 최대가 몇개까지 가능할까요 빌더(TWx) 28887 2012/11/09
22073         Re:Re:동시접속 소켓수 최대가 몇개까지 가능할까요 카라얀 7203 2012/11/09
22074             Re:Re:Re:동시접속 소켓수 최대가 몇개까지 가능할까요 Lyn 9765 2012/11/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.