서버 네크워크 테스트용 클라이언트

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

Moderator: 류광

Locked
비회원

서버 네크워크 테스트용 클라이언트

Post by 비회원 »

안녕하세요.

열심히 이책 저책 이코드 저코드 보면서 서버 라이브러리를 나름대로

만들어봤습니다. 직접 만들면서 여러 테스트를 해보니

보았던 책들의 코드에 문제점들이 속속 나타나더군요.

지금 MMORPG같은 구조로 만들어서

근데 유저 한두명 붙여서 하는 테스트는 해보았는데

수백 수천명이 붙어서 하는 봇 테스트를 해보고 싶은데

마땅히 방법을 잘 모르겠습니다.

걍 드는 생각엔...

클라이언트에 쓰레드 수백개(가능하려나...) 만들어서

각각의 쓰레드 내에서 독립적으로 소켓연결을 가지고

게임 패킷 송수신을 하면서 부하테스트를 해보는 것인데

맞는 방식인지 궁금합니다.

물론 한 컴에서 수천명 어치의 클라리언트역할로의 접속테스트를 하진 못하겠지만

그래도 가능한한 많은 유저접속처럼 테스트 해보고 싶습니다.

먼저 길을 가신 개척자님들께서 도움좀 주시면 감사하겠습니다.
Edith
Posts: 23
Joined: 2006-03-08 15:27
Contact:

Post by Edith »

이게 맞는 방법인지는 모르겠습니다만.. (더좋은 방법이 있겠지요..)

저같은 경우 그냥 배열로 500개씩 어플리케이션을 여러개 띄웠습니다.

어차피 한컴에서 생성할수 잇느 스레드는 한도가 있으니

어플1개에 정해진 봇클래스 개수만큼 배열로 생성하고 그 클래스에서

Update 하면서 Connect 하고 send, recv를 하게 만들었습니다.

그리고 다른 컴에 같은 어플을 띄우고 이렇게 500명씩이면

4대의 컴에만 연결해도 2000명.. 다만 봇의 update로직을

얼마나 잘만드냐에 따라서 단순한connect, disconnect 테스트가 될테고

간단한 행동까지도 할수 있게 만들수 잇습니다.

저같은 경우 그냥 채팅메시지를 -- 랜덤으로 날리게 테스트 해봤었습니다.
for Edith..
풍류협객
Posts: 305
Joined: 2006-08-29 14:22
Location: 풍류혈

Post by 풍류협객 »

프로세스를 여러개 띄워도 되겠으나 자원을 너무 많이 잡아먹을 테니. 그냥 스레드 하나당 클라 하나로 대응되게 테스트프로그램을 만드시는게 낫지 싶어요.

실행할 때

접속할 곳의 주소정보, 가상클라의 갯수, 패킷을 날리는 간격

이런 것들을 가변적으로 설정할 수 있게 하면 더 분명한 데이터를 얻을 수 있는 테스트를 할 수 있으리라 봅니다


서버 테스트에 관해서는
성능 시험과 실무 어쩌구 하는 책이 있던데 한번 검색해서 찾아 읽어보시는게 좋을 것 같아요
Image

지지 않으려는 마음은 가짜
이기고 싶은 마음이 진짜
비회원

저랑 비슷한 고민을 하시네요..

Post by 비회원 »

저두 과거 그런 프로그램을 만들어 봤는데 어느 정도 완성했긴 했지만
지금 생각해도 썩 마음에 들지 않더군요.. 사실 전 말씀 하신 부분 보다는
윗, 윗 분이 언급하셧던것처럼 봇의 다음 행동 패턴을 정의 하는게 정말 힘들더군요
그 봇들이 단독으로만 움직인다면 별루 어려울꺼 없지만 다른 봇들과의 상호 작용에
의해서 움직이니깐 서버에서 받은 패킷에 따라 적절히 해동 봇의 상태나 다음 행동을
결정 해줘야 하니깐 이런 부분을 어떻게 하면 자동화 해서 효율적으로 처리할지 등에
대한 고민에 정말 죽겠더군요.. 더욱이 그작업을 신입때 팀장도 없는 상태에서 하다보니
물어볼사람도 없구.. 글구 위에서 요구했던게 그런 부분을 앞으로 다른 프로젝트에서
그대로 사용할수 있게 스크립트 화 하고 서버의 매모리나, cpu 부화같은것도 그래프로
보여주게 하는등 요구사항이 많이서리 매일 같이 날밤 깥던거 같네요..
아직도 다시 만든다면 고민스러운게 부하 측정의 기준(어느 정도 간격으로 패킷을 쏴야한다던지)을
어떻게 잡아야 실제 유저가 접속한거와 비슷한 기준이 될지라던지.. 실제 클라와 서버에서
주고 받는 패킷을 재정의 안하고 또는 더미 클라이언트 용으로 패킷 수정을 안하고 재활용할수
있는 방법등에 있어서는 아직도 의문이네요
도움이 될지 모르겠지만 제가 만들었던것의 간단한 구조만 말씀드리자면
쓰레드는 총 3개만 돌렸구요
첫번째 쓰레드는 키보드나 마우스 등의 이벤트 처리 쓰레드였구요
두번째는 서버로부터 받는 패킷을 처리하는 쓰레드
세번째 쓰래드느 가변적으로 설정할수 있는 틱마다 모든 더미 클라가 현재 상태에 맞는 동작을 취하는
방식이었습니다.
쉽게 말하자 면
foreach( client in clients)
{
client.Act();
client.nextState();
}

요런 방식으로요 그리고 해당 더미의 상태는 자신이 행동함으로서 바뀌기도 하지만 주로
서버에서 받은 패킷에 따라 상태가 바뀌고 그 바뀐 상태에 따라 다음 행동을 하게 처리 했습니다.
즉 위에서 Act() 함수 안에는 각 상태에 따라 취할 행동들의 많은 분기가 존재 하는거죠..

그리고 혹시 이런 더미 클라이언트 개발에 좋은 솔루션이 있다면 많은 가르침 부탁드립니다.
비회원

^^

Post by 비회원 »

클라이언트에서 캐릭터에 AI를 붙여보면 좀 더 그럴싸하게 될것같아요

물론 배보다 배꼽이 더크게 작업하면 안되겠지만

주변에 PC를 찾아서 공격해라(주변 PC정보는 서버로 부터 받아서 가지고 있겠죠)

서버에서 NPC한테 사용하는 AI구조가 잘 잡혀있다면 또는 고려했다면

PC한테 가져다 붙이기 쉬울것같네요




우리팀에서도 비슷하게 테스트클라이언트를 만들었는데
윗분처럼 행동이 그냥 주변을 램덤하게 움직이고 총을 시간간격으로 쏘고
이정도였거든요
FiaDot
Posts: 24
Joined: 2007-05-29 19:50
Location: 네온소프트
Contact:

테스트 방법에 대해서...

Post by FiaDot »

현재 개발중인 MMORPG 프로젝트에서는 ETRI의 Venus와 유사한 구조를 가지는 테스트 툴을 제작했습니다.

에이전트(가상의 클라이언트-개발자들 컴퓨터에 설치되는)와

스튜디오(에이전트관리-제가 실행)로 구성되고

개별 에이전트는 스튜디오에서 받은 명령에 따라 실행 되게 합니다.


스튜디오에서는 에이전트들에게 실행할 스크립트, 가상클라이언트 접속수, 접속할 주소를 보내게 해놨구요,

서버와 접속하게 해둬서 CPU, 메모리, 레이턴시 등을 주기적으로 받아서 뿌려줍니다.


스크립트는 접속, 패킷송수신, 해제등등의 이벤트를 기반으로 해서 호출되게 했습니다.

컨텐츠(예를 들면 접속/해제, 이동, 전투, 거래) 별로 스크립트를 만들어 두고,

개별 스크립트에 대해 그룹핑해서 사용자와 비슷하게 동작할 수 있게 구성했구요.


컨텐츠별 스크립트를 만들때는 패킷시퀀스에 맞춰서 송수신해야 되는 부분이 있기에

게임 프로토콜을 토대로 루아에서 송수신 함수를 등록하는 부분을 툴로 생성하게 해서

노가다 작업을 줄였습니다.

송수신시에 일정 시간 지연을 발생하기 위한 부분도 스크립트에 포함 시켰습니다.

스레드 수는 간단하게 CPU*2+1로 박았습니다. ㅡㅡ;; (무책임한...)


참고로 스튜디오는 C#, 에이전트는 C++, 스크립트는 Lua로 했습니다.

예전에는 MFC로 툴작업을 했었는데, C#을 쓰니 확실히 생산성은 엄청 좋아지더군요 ^^b;


도움이 되셨으며 좋겠습니다.
어둠의 기타리스트를 포기한 3류 저질 서버 프로그래머 ^_^
http://www.fiadot.com
Locked