메모리 부족 (OOM) 크래시 해결
봇 프로세스가 불규칙적으로 멈추며 종료 코드 137(Exit Code 137)이 발생하는 원인을 짚어보고, 코드 최적화 및 힙 메모리 조절법을 다룹니다.
디스호스트에서 봇을 가동하는 중 로그 콘솔에 Process exited with code 137 혹은 Out of Memory (OOM) 경고 메시지가 기록되며 봇이 강제 정지되는 경우가 발생할 수 있습니다. 이는 시스템 하이퍼바이저가 할당된 메모리 한계치를 침범한 컨테이너 프로세스를 강제로 물리적 차단 및 격리하면서 나타나는 대표적인 증상입니다.
OOM 크래시의 원인 진단
디스호스트 기본 슬롯에는 128MB의 메모리가 할당됩니다. 이는 핑퐁 봇이나 가벼운 데이터 파싱 봇에는 충분하지만, 아래 케이스에 해당될 경우 RAM 공급 한계를 초과하여 크래시가 유발될 수 있습니다:
- 대형 외부 라이브러리 탑재: 대규모 이미지 가공 모듈(
canvas,sharp) 또는 브라우저 자동화 라이브러리(puppeteer) 등을 불러와 가동하는 경우. - 메모리 누수 (Memory Leak): 이벤트 리스너가 누적되거나 전역 배열 변수에 사용자 데이터를 가비지 컬렉션(GC) 회수 없이 지속적으로 적재만 시키는 오작동 코드 구현.
- 디스코드 서버 캐시 적재: 봇이 참여 중인 수백 개 서버의 전체 멤버 오브젝트와 메시지 히스토리를 메모리에 실시간 캐싱할 경우.
해결 방안 1: Node.js 힙(Heap) 메모리 제한 조율
Node.js는 기본 설정 상 머신의 물리 램 용량에 비례해 과도하게 큰 규모의 가상 힙 메모리 공간을 선점하려고 시도합니다. 128MB 가상 머신 환경 내에서 과도한 힙 선점을 억제하기 위해 시작 파라미터를 강제 규제할 필요가 있습니다.
스타트업 매개변수 적용법
대시보드의 스타트업 설정 내 시작 명령 인수 필드에 아래 변수를 기입해 자바 가상머신(V8) 엔진의 가용 크기를 수동 제약해 줍니다:
--max-old-space-size=90- 본 옵션을 적용하면 Node.js 런타임이 힙 메모리 크기가 90MB를 넘기 전 스스로 가비지 컬렉션(GC)을 강력하게 소집 작동시켜 128MB 하드웨어 장벽을 뚫고 올라가는 상황을 예방합니다.
해결 방안 2: 디스코드 클라이언트 캐시 제한
개발 라이브러리 선언 옵션에서 불필요한 오브젝트 캐싱을 원천 배제합니다.
Node.js (discord.js v14) 캐시 제한 예시
const { Client, GatewayIntentBits, Options } = require('discord.js');
const client = new Client({
intents: [GatewayIntentBits.Guilds],
makeCache: Options.cacheWithLimits({
MessageManager: 0, // 과거 메시지 캐싱 억제 (OOM 방지 핵심)
PresenceManager: 0,
UserManager: 0
})
});해결 방안 3: 포인트 상점을 통한 메모리 증설
코드를 극도로 쥐어짜도 봇의 핵심 비즈니스 크기 때문에 메모리가 절대적으로 부족한 상황이라면, 대시보드 내 포인트 상점을 활용하는 것이 근본적인 해결책입니다.
포인트 상점에서 메모리 업그레이드 연장 아이템을 구매하면 즉시 RAM 스펙이 확장되어 넉넉한 공간에서 봇을 운용할 수 있습니다.