Post

(TIL) 2025-03-03 FINAL(20)

(TIL) 2025-03-03 FINAL(20)

분산서버 작업 - 10일차


저번주 금요일 중간 발표 후 피드백 중 게이트 웨이 서버에서 다른 서버로 패킷을 전송할 때 패킷 정보를 인코딩 디코딩을 중복으로 처리되고 있는 점에 대해서 지적을 받아서 오늘은 해당 부분에 대해서 개선 작업을 진행하였다.

코드 개선

1
2
3
4
5
6
7
8
const onData = (socket) => async (data) => {
    // 생략
    const handler = handlers[packetType];
    // const proto = getProtoMessages().GamePacket;
    // const gamePacket = proto.decode(payloadBuffer);
    // const payload = gamePacket[gamePacket.payload];
    await handler({ socket, payloadBuffer, packetType });
  };

우선 OnData 함수에서 페이로드 정보를 decode처리 했던 부분을 삭제하고 게이트웨이 서버에서 decode를 해야하는 핸들러에서만 decode 처리하는 것으로 변경하였다.

1
2
3
4
5
6
7
8
9
10
11
function makeServerPacket([packetType, packetTypeName], { payload, payloadBuffer = null }, userId) {
  const packet = Buffer.concat([
      packetTypeBuffer,
      versionLengthBuffer,
      versionBuffer,
      userIdLengthBuffer,
      userIdBuffer,
      payloadLengthBuffer,
      payloadBuffer,
    ]);
  }

각 서버로 전송 패킷을 만드는 메소드에서는 payload -> payloadBuffer 로 변경하였다.

프로파일링

EC2에 배포를 하고 Clinic Doctor를 설치하여 개선 전/후를 프로파일링 해보았다. 왼쪽이 개선 전이고 오른쪽이 개선 후의 결과이다.

Clinic Doctor

Heap 메모리 사용량에 대해서 궁굼해서 사용해본거지만 생각 이상으로 큰 차이는 없었다. 전과 후의 범위가 25~30mb로 왔다갔다 했다. payload객체를 한개 더 사용하고 안하고의 차이라 크게 없는 것으로 추정하고 있다.

실행 시간

이번에는 OnData의 첫 실행과 끝 실행시간을 체크해보았다.

  • 개선 전 개선 전

  • 개선 후 개선 후

당연한 말이지만 개선 전과 개선 후의 실행 시간이 줄어든 것을 알수 있었다.

마무리

오늘은 프로파일링에서 차이를 좀 더 명확히 보고 싶어서 더미 클라이언트에서 100~1000명까지 늘려가면서 해보았지만 힙메모리 사용량에 대한 차이는 미비해서 뭔가 기대했던 결과가 안나와 아쉬움이 있었지만 위에서 언급했든 객체 1개 차이밖에 없다보니 내가 원했던 결과는 안나오는게 당연하다는 생각이 들었다. 로그인을 할 때 I/O작업으로 CPU가 오른다는 얘기를 들었는데 이번 프로파일링을 통해서 해당 부분을 확인할 수 있어서 신기하긴했다. 300명 로그인을 순차적으로 서버에 보내지만 서버에서는 300명의 로그인 처리를 하는데 약 25초 정도는 지나야 완료되는 것을 확인 할 수 있었다. 아마 데이터베이스 조회 때 await로 기다리다 보니 패킷이 점점 밀려서 그런것이라 생각이 든다.

This post is licensed under CC BY 4.0 by the author.