부하테스트 중 증가한 메모리 사용량이 테스트가 종료된 이후에도 해제되지않고 계속 남아있는 것을 발견

Untitled

  1. 코딩 실수로 인한 메모리누수

    @SubscribeMessage(SOCKET_EVENT.DISCONNECT)
      disconnect(@ConnectedSocket() socket: Socket) {
        this.connectedSockets.delete(socket.id);
      }
    

    gateway에서 소켓 연결해제시 Map에서 정보를 삭제함.

    하지만 disconnect이벤트를 별도로 받는 것이 아니라 handleDisconnect()로 처리해야 정상적으로 인식됨

    handleDisconnect(@ConnectedSocket() socket: Socket) {
        this.connectedSockets.delete(socket.id);
      }
    
  2. 주기적으로 메모리 정리

    클라이언트의 이용의 경우 세션이 끝나면 소켓연결이 끊기지만

    부하테스트시 발생할 수 있는 혹시나 모를 비정상적 상황에 경우에 대비하여 (소켓연결이 지속적으로 이어지는 경우) Schedule을 등록해 앱 실행 후 매 5분마다 오래된 연결을 해제해 줌.

    @Cron(CronExpression.EVERY_5_MINUTES)
      handleNotCompleteSocket() {
        const Before10S = Date.now() - 10000;
        this.connectedSockets.forEach((value, key) => {
          const { socket, createTime } = value;
          if (createTime < Before10S) this.connectedSockets.delete(key);
          socket.disconnect();
        });
      }