인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

mhyim님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)

마무리

파트 7 스트레스 테스트 질문 드립니다.

해결된 질문

작성

·

111

·

수정됨

1

안녕하세요 루키스님?

 

토이 프로젝트 개요

파트 7을 기반으로 3D 환경에서 Zone없이 위치 동기화 정도로 간단한 게임을 만들어 포트폴리오 만들려고 합니다.

유니티에서 3D캡슐을 플레이어라고 하고, Move패킷에 목표 좌표 찍어서 transform.position 변경시키면서 스르륵 이동하는 방식으로 데드레커닝 비슷하게 흉내 내고 있습니다.

 

문제 - 스트레스 테스트

얼추 위치 동기화를 마치고 스트레스 테스트를 하고 있는데, 파트4 마지막 스트레스 테스트에서 더미 500명은 거뜬했었는데, 제가 파트7 기반으로 한 프로젝트는 더미 100명부터 버벅거리더라구요.

 

문제 분석 - 왜 파트4는 더미 500까지 버텼는데 제거는 100명도?

뭐가 다른가 곰곰히 뜯어보니, 파트4에서는 패킷 모아보내기를 통해 500명이 초당 4번, 총 2000번 정도를 처리하는 반면, (Send만 세었다고 하면)

제 프로젝트는 패킷 모아보내기가 안되는지 100명이 초당 4번, 총 40000번(브로드캐스트 400 * 100명) 정도 코스트가 발생하는게 원인이라고 짐작하고 있습니다.

더해서 파트7의 마지막도 패킷 Send도 찍어보니, O(N^2)인 것을 확인하여 질문 드리게 되었습니다. (플레이어 4명이 입장 시키고 한명 움직이면 초당 약 10번, 4명이니까 40번 발생하는 것을 확인).

 

질문 드립니다.

Q1. 파트 4의 패킷 모아보내기는 더미클라이언트들이 같은 프로젝트 안의 공동 큐를 사용해 Send 됐기 때문에 가능했던 부분으로 이해되는데 맞을까요?

Q2. 파트7을 기반으로 했다면 100명도 버거운게 맞을까요?

Q3. Q2이 맞다면 500명의 부하를 버틸 수 있게 할 수 있는 조언 주실 수 있을까요? 더미 클라 500이 아닌, 실제 500명이 붙었을 때를 가정하고 싶습니다. 패킷을 이렇게 모아보내면 된다.. 등의 아이디어 레벨로라도 조언을 기대하고 있습니다.

 

물론 파트9에서 존단위 처리 등의 더 상위기법을 알려주시지만, 파트7의 범위 내에서 500명의 스트레스 테스트도 가능하게 하고 싶습니다.

 

나름 분석하고 질문 드리고 있는데 그냥 제가 뭐 잘못 건드려서 100명도 렉걸리는거 같아서 질문하면서 좀 민망하네요..ㅎㅎ

 

답변 미리 감사합니다! 회사를 골라 가는 사람으로 성장하겠습니다.

답변 2

0

mhyim님의 프로필 이미지
mhyim
질문자

얼추 해결.. 파트4 -> 7로 넘어가는 과정에서 패킷 모아보내기는 삭제된 모양입니다.

패킷 모아보내기를 적용하여 제가 수정한 환경 기준 400명까지는 어떻게 돌아갑니다.

 

파트9 - 대형 구조 관리 - 게임구조변경 - 21분 쯤에서 서빙과 요리사로 각각 역할을 나눠 다시 개선하는 모양.
엄밀히 말하면 이건 패킷 모아보내기는 아니고 역할 분류 이므로, 이것도 적용하면 추가 최적화 가능성도 보고있음.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. mhyim님, 질문 주셔서 감사합니다.

  1. 패킷 모아보내기: 파트 4의 패킷 모아보내기는 같은 프로세스에서 더미 클라이언트들이 함께 실행되었기 때문에 실현 가능한 부분입니다. 단일 프로세스 내에서 네트워크 트래픽을 적게 사용하며 효율적으로 데이터를 전송할 수 있습니다.

  2. 파트 7의 구조 문제: 파트 7은 기본적인 서버 클라이언트 통신을 다루고 있는데요, 이 단계에서 100명이 참가하면 문제가 발생할 수 있습니다. 이는 주로 패킷 전송 방식이나 데이터 처리 알고리즘의 비효율성 때문일 수 있습니다.

  3. 성능 최적화 조언:

    • 패킷 모아보내기: 데이터 전송을 하나로 묶어 처리량을 줄이는 방법입니다. 각 클라이언트에서 서버로 전송하는 데이터가 많다면, 이를 줄여주는 것이 필요합니다.
    • 데드 레커닝 기술: 이미 사용하고 계시는 데드 레커닝 기술을 더욱 고도화하는 것도 도움이 될 수 있습니다. 클라이언트 간의 데이터 전달을 최적화하여 필요한 경우에만 데이터를 업데이트하도록 해보세요.
    • 네트워크 상태 관리: 네트워크 상태를 모니터링하여 비정상적인 데이터 처리를 방지하는 것도 좋은 방법입니다.

관련 게시물:
- 스트레스 테스트를 해봤는데 이 방식이 맞나요? - 스트레스 테스트의 실제 서버에서의 의미를 다룬 글입니다.

위의 방법들을 고려하여 프로젝트를 개선하면, 더 많은 동시 접속자를 효율적으로 관리할 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

mhyim님의 프로필 이미지

작성한 질문수

질문하기