부하테스트 중 증가한 메모리 사용량이 테스트가 종료된 이후에도 해제되지않고 계속 남아있는 것을 발견
코딩 실수로 인한 메모리누수
@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);
}
주기적으로 메모리 정리
클라이언트의 이용의 경우 세션이 끝나면 소켓연결이 끊기지만
부하테스트시 발생할 수 있는 혹시나 모를 비정상적 상황에 경우에 대비하여 (소켓연결이 지속적으로 이어지는 경우) 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();
});
}