IOCP 게임서버에 적당한 구성방식이?

3권에서 새로 도입된 네트웍 및 멀티플레이어 프로그로그래밍 섹션을 위한 게시판입니다.

Moderator: 류광

Locked
비회원

IOCP 게임서버에 적당한 구성방식이?

Post by 비회원 »

지금 제가 쓰는 방식은 이렇습니다...

어셉트 처리해주는 쓰레드
워커쓰레드 * 2(씨피유갯수) +2
메인처리 쓰레드 (모든 게임처리를 담당합니다.)

패킷은 워커쓰레드에서 다 긁어서 메인처리 쓰레드로 보내 처리하도록 하는 구성입니다.
물론 몬스터 AI도 메인처리 쓰레드에서 돌아가구요.
(즉, 게임처리는 쓰레드 하나로만 돌린다고 보시면 됩니다.)

대신 패킷처리라든지, AI처리시 갯수가 많아지면 처리 속도가 늦어지므로
AI는 1회루프에 최대 50개의 몬스터 AI만 처리하도록 하고 있고, (패킷도 50개만 처리)
이 시간은 대략 20~200 밀리세컨드정도 걸리니, 1회 루프돈다음 다시 초고속으로 일을 처리
하게되는 싱글쓰레드로 적절한 시간이내에 가능한 작업만 하고 루프를 연속적으로 도는 그런
매커니즘 입니다.

헌데이게, 20명까지는 렉없고 반응속도 빠르고 괜찮은데, 그 이상이 들어오면 패킷 처리량이 늘어서 그런지
서버 렉이 1초 이내로 걸리더군요. (반응속도는 1초도 어마어마하게 느린거죠)

위의 구성은 어떤지 고수님들께 여쭤보고 싶습니다.
그리고 IOCP로 중형 대형 서버를 코딩할려면 어떤 구성으로 하는게 좋을까요?
쓰레드는 어떻게 배치하고, 어떤 용도로 사용하며, IO방식은 어떻게 하고
대충 힌트만 좀 주실분 없으신지? ㅠㅠ
비회원

1

Post by 비회원 »

1. 메인쓰래드 안에서의 제한을 없앤다.

2. 메인쓰래드 갯수를 늘린다.

3. 메인쓰래드를 없애고, 워커쓰래드에서 게임로직을 처리한다.



사족. 워커쓰래드 이외에 메인쓰래드를 사용하신 이유가 궁금하네요.
비회원

Re: IOCP 게임서버에 적당한 구성방식이?

Post by 비회원 »

비회원 wrote: 20명까지는 렉없고 반응속도 빠르고 괜찮은데, 그 이상이 들어오면 패킷 처리량이 늘어서 그런지
서버 렉이 1초 이내로 걸리더군요. (반응속도는 1초도 어마어마하게 느린거죠)
쓰레드 구성방식은 일반적인 방식이므로 문제 없어보입니다.

윗 분이 조언해주신 2번 3번 방식은 동기화 문제가 크기 때문에 제대로 설계하지 않으면 오히려 성능이 떨어 질겁니다.

렉이 걸리는 이유를 먼저 아는게 중요할 거 같군요. 우선 패킷 처리 같은 경우에는 제한을 풀고 테스트 해보시기 바랍니다.

위 상황으로 봐서는 서버 CPU가 튀어서 발생하는거 같지는 않고 제한으로 인해서 패킷이 쌓이는거 같군요.

저 같은 경우에는 초당 1000번 업데이트하는데 엔피씨 1600마리씩하고 클라이언트는 60개씩 업데이트하면서 패킷도 받고 보냅니다. ( 엔피씨 업데이트 량이 많은 이유는 64비트 서버라 80만 마리를 띄울 예정입니다. 모두 다 띄우는건 아니고 활용되지 않는 엔피씨는 업데이트가 안되겠지요 )
비회원

Re: IOCP 게임서버에 적당한 구성방식이?

Post by 비회원 »

위에 답변해주신 두분 모두 감사합니다.

우선, 첫번째 답변자님의 답변을 보고나서 지금 적용해보고 테스트 하는 중입니다.
생각해보니, 굳이 메인쓰레드만 사용해서 모든 처리를 맡기는건 쓰레드를 나눈 이점을 못살리는 것 같아서
패킷처리만 워커쓰레드에서 하도록 냅두고 나머지는 그대로 메인 처리 쓰레드에서 담당하도록 해놨습니다.
테스트 해보고 다시 글을 올리겠습니다.

글고 두번째 답변자님께서 하신 말씀중
비회원 wrote: 저 같은 경우에는 초당 1000번 업데이트하는데 엔피씨 1600마리씩하고 클라이언트는 60개씩 업데이트하면서 패킷도 받고 보냅니다. ( 엔피씨 업데이트 량이 많은 이유는 64비트 서버라 80만 마리를 띄울 예정입니다. 모두 다 띄우는건 아니고 활용되지 않는 엔피씨는 업데이트가 안되겠지요 )
와우...;; 80만 마리라... 엄청나군요.
두번째 답변자님께 궁금한점이 있습니다.
답변자님께서도 메인처리 쓰레드 하나로 모든 처리를 담당하는 방식을 쓰시나요?
그리고 클라이언트를 60개씩 업데이트 한다는 말이 패킷을 초당 60개를 한번에 처리한다는 뜻인지?
비회원

Re: IOCP 게임서버에 적당한 구성방식이?

Post by 비회원 »

비회원 wrote:답변자님께서도 메인처리 쓰레드 하나로 모든 처리를 담당하는 방식을 쓰시나요?
그리고 클라이언트를 60개씩 업데이트 한다는 말이 패킷을 초당 60개를 한번에 처리한다는 뜻인지?
네 메인쓰레드에서 모든 로직을 담당합니다.
클라이언트도 엔피씨와 마찬가지로 로직을 업데이트해줘야 겠지요 그래서 클라이언트도 엔피씨와 동일하게 업데이트 처리를 해줍니다. 하지만 엔피씨와는 틀리게 클라이언트는 업데이트시 워크쓰레드에서 받아온 패킷들을 일괄 처리해주겠지요. ( 워커쓰레드에서는 패킷을 받아서 풀링만 하고 메인쓰레드에서 클라이언트 객체 업데이트시 받아온 패킷들을 처리합니다. )

메인쓰레드에서 많은 부분의 일을 하는것이 고전적이긴 하지만 안정성 및 동기화 부분에서는 이점이 훨씬 많지요. 현재 제가 사용하고 있는 쓰레드는 "네트웍 워크 쓰레드, 패킷 압축 및 전달 쓰레드, 메인 쓰레드, 엔피씨 길찾기 쓰레드, 로그 쓰레드, 디비 워크 쓰레드" 이정도로 나눠지네요.

ps. 고전적인 방식이긴 하나 현재 쿼드코어에서 테스트해본 결과 나름 CPU를 잘활용하고 있더군요. 메인 쓰레드를 얼마나 효율적으로 잘사용하느냐가 메인 스레드 분리보다는 작업 하기가 수월하실 겁니다.
Locked