트러블슈팅 및 FAQ

메모리 부족 (OOM) 크래시 해결

봇 프로세스가 종료 코드 137(Exit Code 137)로 멈출 때의 원인과 힙 메모리 조절 및 최적화 방법을 안내합니다.

봇을 운영하던 중 콘솔에 Process exited with code 137 또는 Out of Memory (OOM) 메시지가 출력되며 봇이 강제 종료되는 경우가 있습니다. 이는 컨테이너에 할당된 메모리 한도를 초과하여 운영체제(OOM Killer)가 프로세스를 종료시켰을 때 발생하는 현상입니다.


OOM 크래시의 주요 원인

디스호스트 기본 슬롯에는 128MB의 메모리가 할당됩니다. 간단한 핑퐁 봇에는 충분하지만, 다음과 같은 상황에서는 메모리가 부족해질 수 있습니다.

  1. 무거운 외부 패키지: 대용량 이미지 처리 모듈(canvas, sharp)이나 브라우저 자동화 라이브러리(puppeteer) 등을 실행하는 경우
  2. 메모리 누수 (Memory Leak): 이벤트 리스너가 중첩되거나, 전역 배열에 데이터를 계속 쌓아두어 가비지 컬렉터가 메모리를 회수하지 못하는 경우
  3. 과도한 디스코드 캐시: 봇이 참여 중인 수많은 서버의 전체 멤버 목록이나 과거 메시지를 메모리에 모두 보관하는 경우

해결 방법 1: Node.js 힙 메모리 크기 제한

Node.js는 기본적으로 호스트 시스템 메모리에 맞춰 큰 힙 공간을 확보하려고 합니다. 128MB 제한 환경에서는 V8 엔진의 힙 최대 크기를 수동으로 지정해 주는 것이 효과적입니다.

스타트업 옵션 적용

대시보드의 스타트업 설정에서 시작 명령어 인수에 다음 옵션을 추가합니다.

--max-old-space-size=90
  • 이 설정을 적용하면 Node.js 힙 메모리가 90MB에 도달하기 전에 가비지 컬렉션(GC)을 선제적으로 수행하여 128MB 한도를 넘지 않도록 관리합니다.

해결 방법 2: discord.js 클라이언트 캐시 제한

클라이언트 초기화 옵션에서 불필요한 데이터 캐싱을 비활성화하여 메모리를 대폭 절약할 수 있습니다.

Node.js (discord.js v14) 캐시 제한 예제

const { Client, GatewayIntentBits, Options } = require('discord.js');

const client = new Client({
  intents: [GatewayIntentBits.Guilds],
  makeCache: Options.cacheWithLimits({
    MessageManager: 0, // 과거 메시지 캐싱 끄기 (메모리 절약 핵심)
    PresenceManager: 0,
    UserManager: 0
  })
});

해결 방법 3: 포인트 상점을 통한 메모리 확장

코드 최적화 후에도 봇 자체의 기능 규모상 128MB로 부족하다면, 대시보드 포인트 상점에서 메모리 확장을 이용할 수 있습니다.

커뮤니티 활동으로 모은 포인트로 메모리 업그레이드 (+512MB)를 적용하면 넉넉한 메모리 환경에서 봇을 안정적으로 운영할 수 있습니다.