테스트 실행시 컨트롤러에서 보이는 Agent 상태값에 대해서 질문드립니다.

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

테스트 실행시 컨트롤러에서 보이는 Agent 상태값에 대해서 질문드립니다.

cozyhun
안녕하세요.
저는 게임 개발사에 근무하는 개발자입니다.
최근에 nGrinder를 알게 되어 회사네 성능테스트 이슈도 있고 해서
지금 스크립트를 짜서 테스트를 진행 하고 있는데 잘 모르는게
있어서 이렇게 질문을 올리게 되었습니다.

현재 개발 환경은 게임서버 1대에 Agent 8대로 되어 있으며
게임서버는 상용엔진서버를 사용하는 관계로 연동하기 위해 별도의 Dll
을 만들어서 테스트를 진행하고 있습니다.
그리고 각각의 Agent는 동일한 시스템 사양으로 구성되어 있구요
(OS:Windows7,CPU 4Core,Memroy 8G,네트워크 속도는 100Mbps,jdk version:1.7)

질문내용은 테스트를 하다가 어느 순간부터 Agent 서버의 상태를 나타내는
수치가 차이가 나는거 같아서요 Agent의 CPU나 RX/TX값의 차이가 좀 나더라구요
테스트 설정환경은 3대의 Agent에 프로세스 10개 쓰레드 50개 총 1500Vuser
를 2시간동안 테스트 하려고 합니다.
그런데 10분정도 지나니까 아래와 같이 agent별 cpu와 RX/TX값들이 차이가 나더라구요
(Agent3인경우 특히 차이가 많이 나네요)
agent2-PC CPU-46% MEM-33% / RX-3.79M TX-3.77M
Agent1-PC CPU-20% MEM-34% / RX-3.96M TX-3.84M
agent3-PC CPU-0.4% MEM-33% / RX-27.2K TX-55.6K

이런 차이가 어떤 이유로 발생하는지 잘 몰라서 질문을 올립니다.

참고로 테스트하고 있는 스크립트소스는 다음과 같습니다.
import com.sun.jna.Library
import com.sun.jna.Native
import com.sun.jna.Pointer
import com.sun.jna.ptr.PointerByReference

import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.AfterProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import net.grinder.scriptengine.groovy.junit.annotation.AfterThread
// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith


/**
 * A simple example using the HTTP plugin that shows the retrieval of a
 * single page via HTTP.
 *
 * This script is automatically generated by ngrinder.
 *
 * @author admin
 */
@RunWith(GrinderRunner)
class GameServerRunner {
    // Define the interface which native library has.
    interface NativeClient extends Library {
        public void Init(PointerByReference testClientRef);
        public void Cleanup(Pointer testClient);
        public int ConnectToLoginServer(Pointer testClient, String ip, int port, int timeout);
        public int DisconnectFromLoginServer(Pointer tester);
        public int EchoLoginServer(Pointer testClient, int timeout);
        public int ConnectToGameServer(Pointer testClient, String ip, int port, int timeout);
        public int DisconnectFromGameServer(Pointer testClient);
        public int EchoGameServer(Pointer testClient, int timeout);
        public int ConnectToChatServer(Pointer testClient, String ip, int port, int timeout);
        public int DisconnectFromChatServer(Pointer testClient);
        public int EchoChatServer(Pointer testClient, int timeout) ;
    }
 
    public static GTest test
    public static def nativeClient;
    public static int timeout = 30000; // timeout 30 seconds
   
    def PointerByReference testerRef;
    def Pointer tester;
   
    @BeforeProcess
    public static void beforeProcess() {
        nativeClient = Native.loadLibrary("myGames", NativeClient);
        test = new GTest(1, "myTest")
    }
   
   
    @BeforeThread
    public void beforeThread() {
        testerRef = new PointerByReference();
        nativeClient.Init(testerRef);
        tester = testerRef.getValue();
        test.record(this,"doEchoGameServer");
        grinder.statistics.delayReports=true;
    }
   
   
    @AfterThread
    public void afterThread() {
        nativeClient.Cleanup(tester)
    }
       
    public def doEchoGameServer() {
                def resultCode = nativeClient.EchoGameServer(tester, timeout);
        return resultCode
    }
 
    @Test
    public void test(){
        nativeClient.ConnectToGameServer(tester, "xxx.xxx.xxx.xxx", 12000, timeout);
        int resultCode = doEchoGameServer()
        nativeClient.DisconnectFromGameServer(tester)
        assertThat(resultCode , is(0))
    }
}


질문을 끝까지 읽어 주셔서 감사합니다.




Reply | Threaded
Open this post in threaded view
|

Re: 테스트 실행시 컨트롤러에서 보이는 Agent 상태값에 대해서 질문드립니다.

junoyoon
Administrator
스크립트를 검토해 보았는데, 스크립트 상에는 큰 문제가 없어 보입니다.

그리고 말씀 하신 상황으로 봐서는 세번째 에이전트에서 서버측 문제로 Connection Hang 이 걸리는 듯 하군요.

메모리를 봐서는 아마 실제로 제대로 실행은 된것 같고,

3번째 에이전트의 에이전트 로그를 검토해 보셔야 할 것 같습니다.
Reply | Threaded
Open this post in threaded view
|

Re: 테스트 실행시 컨트롤러에서 보이는 Agent 상태값에 대해서 질문드립니다.

cozyhun
네 답변 주셔서 감사합니다.
지금 컨트롤러와 에이전트 총 9대가 하나의 허브에 물려 있고 그리고
내부 네트웍이 가끔 불안한 점이 있어서 처음엔 네트웍 문제가 아닌가 생각을 해보았습니다.
일단 서버 개발자에게 다시 문의 하여 다시 검토해 보겠습니다.
다시 한번 감사드립니다.