241216 TIL - oreno turn wk6 (1)

LIHA·2024년 12월 16일
0

내일배움캠프

목록 보기
134/136
post-thumbnail

게임서버 - 포지션 업데이트 패킷 부하 테스트

10/10, CPU/메모리 제한 없이 120초

도커 CPU 사용 그래프가 왜 순간 치솟았는지 모르겠지만 전반적으로는 무난하게 나왔다.

import java.io.OutputStream;
import java.io.InputStream;
import java.net.Socket;
import org.apache.jmeter.util.JMeterUtils;

        String serverName = "127.0.0.1";
        int port = 16666;

		byte[] positionData = {
		0x00, 0x17, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x15, 0xba, 0x01, 0x12, 0x09, 0x00, 0x00, 0x00, 0xa0, 0x9e, 0xac, 0x34, 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x72, 0x2f, 0x25, 0x40 };

		byte[] positionData2 = { 0x00, 0x17, 0x05, 0x31, 0x2e, 0x30, 0x2e, 0x30, 0x00, 0x00, 0x00, 
		0x04, 0x00, 0x00, 0x00, 0x15, 0xba, 0x01, 0x12, 0x09, 0x00, 0x00, 
		0x00, 0x20, 0x6a, 0xa4, 0x37, 0x40, 0x11, 0x00, 0x00, 0x00, 0x60, 
		0x3e, 0x77, 0x25, 0x40 }; 

        Socket socket = null;
        OutputStream out = null;
        InputStream in = null;

        try {
			// 소켓 초기화
			socket = new Socket(serverName, port);
			out = socket.getOutputStream();
			in = socket.getInputStream();
				// 데이터 전송
				out.write(positionData);
				out.flush();
				
				out.write(positionData2);
				out.flush();

            // 서버 응답 수신
 		byte[] responseBuffer = new byte[1024];
 		// 이 in.read가 줄때까지 기다리기 때문에 else절이 있어도 의미가 없다. 계속 기다린다고...
            int bytesRead = in.read(responseBuffer);
            if (bytesRead > 0) {
                String response = new String(responseBuffer, 0, bytesRead, "UTF-8");
                log.info("Server response: " + response);
            } else {
                log.warn("No response received from the server.");
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 리소스 정리
            try {
                if (out != null)
                    out.close();
                if (in != null)
                    in.close();
                if (socket != null)
                    socket.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

동혁님이 고쳐주신 코드를 기반으로 재실험 - 유의미한 결과가 나왔다!

사람들이 들어와서 업데이트 하려는 모습을 보려고 했던건데, 그게 아니라 그냥 방 단위로 테스트를 하는 개념으로 방향을 바꿨다.
그래서 이 제이미터의 쓰레드는 사람 한명이 아니라 방 1개가 되는 셈.

부하량을 늘렸더니 바로 터져버리는 게임서버

60프레임 (쓰레드 슬립 16ms로 설정)

1코어 1기가 60프레임 메모리 터짐 -> 한 개의 게임서버로 방 50개를 돌리는건 절대 버틸 수 없을 듯!

30프레임 (쓰레드 슬립 32ms로 설정)

1코어 1기가 30프레임 메모리 터짐 -> 역시나 한 개의 게임서버는 무리였다.

빵야를 쏴주고 싶은데 - 빵야 버퍼를 가져와서 위치 업데이트와 같이 패킷 부하 테스트를 해보자


<Buffer 00 19 05 31 2e 30 2e 30 00 00 00 df 00 00 00 07 ca 01 04 08 01 10 02>
  • 2020-30Hz-이동패킷 그래프

  • 3434-지연300ms-카드사용 쓰레드 그래프

방 20개, 유저 34명 - FPS 60에 카드사용 텀 50ms

  • 방 20개 60Hz

  • 카드사용 50ms

FPS 30, 카드 사용 딜레이는 10까지 줄여서 오히려 카드 사용수를 왕창 많게 해보자

  • 위치 업데이트 RTOT 2020-60Hz

  • 카드사용 RTOT 딜레이 10

  • 도커 리소스 사용량

IF문을 지운것 만으로는 특별히 변화가 없었다

  • 포지션 업데이트 RTOT 2020-30Hz

  • 카드사용 RTOT 3434 딜레이 10

  • 도커 리소스 사용량

console.log를 지웠더니 유의미한 CPU 사용량 변화가 있었다

  • 포지션 업데이트 RTOT 2020-30Hz

  • 카드사용 RTOT 3434 딜레이 10

  • 도커 리소스 사용량

로그 삭제로 최적화를 했으니 조건을 좀더 바꿔보자

  • 포지션 업데이트 RTOT 2525-30Hz

  • 카드사용 RTOT 5050 딜레이 65

  • 도커 리소스 사용량

profile
갑자기 왜 춤춰?

0개의 댓글