튜토리얼 카테고리 Skills 소개
ZH EN JA KO
운영 모니터링

OpenClaw 성능 최적화 및 리소스 사용량 제어

· 13 분 소요

서문

OpenClaw은 장기 실행되는 AI 게이트웨이 데몬 프로세스로서, 리소스 사용량은 서버 비용과 서비스 안정성에 직접적인 영향을 미칩니다. 본 문서에서는 메모리, CPU, 네트워크, 스토리지의 네 가지 차원에서 OpenClaw의 리소스 사용량을 최적화하는 방법을 체계적으로 설명하여, 제한된 리소스에서도 서비스가 효율적으로 운영되도록 합니다.

1. 메모리 최적화

1.1 메모리 사용 원인 파악

OpenClaw의 메모리 소비는 주로 다음에서 발생합니다:

  • 대화 기록 캐시: 각 활성 사용자의 대화 컨텍스트
  • 채널 연결 풀: 각 메시지 플랫폼의 WebSocket 장기 연결
  • 스킬 런타임: 로드된 스킬 모듈
  • 요청 큐: 처리 대기 중인 메시지 버퍼

현재 메모리 사용 상황 확인:

# 헬스체크 인터페이스를 통해
curl -s http://localhost:18789/health/detail | jq '.memory'

# 출력 예시
# {
#   "heapUsed": "128MB",
#   "heapTotal": "256MB",
#   "rss": "310MB",
#   "external": "15MB"
# }

1.2 Node.js 힙 메모리 제한

NODE_OPTIONS 환경 변수를 통해 V8 엔진의 최대 힙 메모리를 제어합니다:

// ~/.config/openclaw/openclaw.json5
{
  "runtime": {
    "nodeOptions": "--max-old-space-size=384"  // 단위 MB
  }
}

또는 환경 변수로 설정:

export NODE_OPTIONS="--max-old-space-size=384"
openclaw restart

권장 값:

서버 메모리 권장 힙 메모리 제한 적용 시나리오
512MB 256MB 개인 사용, 1-2개 채널
1GB 384MB 소규모 팀, 3-5개 채널
2GB 512MB 중간 부하, 다중 채널
4GB+ 1024MB 고부하 프로덕션 환경

1.3 대화 기록 길이 제어

대화 기록은 메모리 소비의 주요 요인입니다. 각 사용자의 기록이 길어질수록 API 호출의 토큰 소비와 메모리 사용량이 커집니다:

// ~/.config/openclaw/openclaw.json5
{
  "conversation": {
    // 최대 보존 대화 턴 수
    "maxHistory": 20,
    // 최대 토큰 수 제한 (초과 시 오래된 메시지 자동 잘라내기)
    "maxTokens": 8000,
    // 대화 타임아웃 (이 시간 이상 비활성 시 기록 삭제)
    "idleTimeout": "30m"
  }
}

리소스가 제한된 환경에서는 더 압축할 수 있습니다:

{
  "conversation": {
    "maxHistory": 10,
    "maxTokens": 4000,
    "idleTimeout": "15m",
    // 기록 요약 압축 활성화: 제한 초과 시 이전 대화를 자동으로 요약
    "summarize": true
  }
}

1.4 메모리 캐시 전략

{
  "cache": {
    // 사용자 프로필 캐시 크기
    "userProfileMaxSize": 100,
    // 스킬 결과 캐시 만료 시간
    "skillResultTTL": "5m",
    // 최대 캐시 항목 수
    "maxEntries": 500
  }
}

2. CPU 최적화

2.1 동시 요청 수 제한

너무 많은 요청을 동시에 처리하면 CPU 급등과 응답 지연 증가를 초래합니다. 큐를 통해 동시성을 제어합니다:

{
  "gateway": {
    // 최대 동시 모델 요청 수
    "maxConcurrentRequests": 5,
    // 요청 큐 최대 길이
    "queueMaxSize": 50,
    // 큐 대기 타임아웃
    "queueTimeout": "30s"
  }
}

2.2 스킬 로딩 최적화

불필요한 스킬은 CPU와 메모리 리소스를 차지합니다. 실제로 사용하는 스킬만 로드하세요:

{
  "skills": {
    // 활성화할 스킬을 명시적으로 지정 (전체 로드 대신)
    "enabled": ["weather", "reminder", "rss"],
    // 스킬 실행 타임아웃
    "timeout": 10000,
    // 스킬 결과 캐시 (중복 계산 감소)
    "cache": true
  }
}

2.3 Systemd CPU 할당량 사용

Systemd로 OpenClaw을 관리하는 경우 CPU 사용을 강제로 제한할 수 있습니다:

# /etc/systemd/system/openclaw.service
[Service]
CPUQuota=50%          # 최대 CPU 50% 사용 제한
CPUWeight=80          # 스케줄링 가중치 (100이 표준)

2.4 PM2 클러스터 모드

멀티코어 서버에서 PM2의 클러스터 모드를 사용하여 부하를 분산합니다:

// openclaw-ecosystem.config.js
module.exports = {
  apps: [{
    name: "openclaw",
    script: "openclaw",
    args: "up",
    instances: 2,          // 2개 인스턴스 시작
    exec_mode: "cluster",
    max_memory_restart: "400M"
  }]
};

참고: 클러스터 모드에서는 OpenClaw이 다중 인스턴스 실행을 지원해야 하며, 공유 세션 스토리지가 설정되어야 합니다.

3. 모델 호출 최적화

3.1 적절한 모델 선택

모델 선택은 응답 속도와 비용에 직접적인 영향을 미칩니다:

{
  "model": {
    // 일상 대화에는 경량 모델 사용
    "default": "claude-3-5-haiku",
    // 복잡한 작업에는 고급 모델 사용
    "advanced": "claude-3.5-sonnet",
    // 메시지 복잡도에 따라 자동 전환
    "autoSwitch": true,
    "autoSwitchThreshold": 100  // 입력 100자 초과 시 고급 모델 사용
  }
}

3.2 스트리밍 응답 활성화

스트리밍 응답은 첫 바이트 지연을 줄이고 사용자 경험을 향상시킵니다:

{
  "model": {
    "stream": true,
    // 스트리밍 청크 전송 간격 (스트리밍을 지원하지 않는 일부 채널에 적용)
    "streamChunkInterval": 500
  }
}

3.3 요청 타임아웃 설정

비정상 요청이 장시간 리소스를 점유하는 것을 방지합니다:

{
  "model": {
    "timeout": 30000,     // 단일 요청 타임아웃 30초
    "maxRetries": 2,      // 최대 재시도 횟수
    "retryDelay": 2000    // 재시도 간격 2초
  }
}

4. 스토리지 및 네트워크 최적화

4.1 로그 파일 제어

로그 파일 증가는 많은 디스크 공간을 차지합니다:

{
  "log": {
    "level": "info",        // 프로덕션 환경에서는 debug 사용 금지
    "rotation": {
      "maxSize": "30MB",
      "maxAge": 14,         // 14일 보존
      "compress": true
    }
  }
}

4.2 세션 데이터 정리

만료된 세션 데이터를 정기적으로 정리합니다:

# 세션 데이터 사용량 확인
du -sh ~/.openclaw/sessions/

# 30일 이상 비활성 세션 정리
openclaw session cleanup --older-than 30d

# 자동 정리 설정
openclaw config set session.autoCleanup true
openclaw config set session.cleanupInterval "24h"
openclaw config set session.maxAge "30d"

4.3 네트워크 연결 최적화

{
  "gateway": {
    // HTTP Keep-Alive 타임아웃
    "keepAliveTimeout": 30000,
    // 연결 풀 크기
    "maxSockets": 20,
    // gzip 압축 활성화
    "compression": true
  }
}

5. 성능 모니터링 및 벤치마크

5.1 내장 성능 지표

# 런타임 성능 통계 확인
curl -s http://localhost:18789/health/stats | jq .

# 반환 예시
# {
#   "avgResponseTime": "1.8s",
#   "p95ResponseTime": "3.2s",
#   "messagesPerMinute": 12,
#   "activeConnections": 3,
#   "queueLength": 0
# }

5.2 리소스 사용 추세

Prometheus 지표와 결합하여 리소스 사용 추세를 모니터링합니다:

# 지난 24시간 메모리 추세 확인
openclaw stats --metric memory --period 24h

# 응답 시간 추세 확인
openclaw stats --metric latency --period 7d

5.3 최적화 효과 검증

설정 조정 후 최소 24시간 동안 다음 지표를 관찰하는 것이 좋습니다:

지표 정상 범위 주의 필요
힙 메모리 사용률 < 70% > 85%
평균 응답 시간 < 3s > 5s
오류율 < 1% > 5%
CPU 사용률 < 40% > 70%
큐 길이 0-5 > 20

6. 저사양 서버 최적화 방안

512MB 메모리의 입문급 VPS에서는 다음과 같은 극한 최적화 설정을 권장합니다:

{
  "runtime": {
    "nodeOptions": "--max-old-space-size=256"
  },
  "conversation": {
    "maxHistory": 8,
    "maxTokens": 3000,
    "idleTimeout": "10m",
    "summarize": true
  },
  "gateway": {
    "maxConcurrentRequests": 2,
    "queueMaxSize": 20
  },
  "model": {
    "default": "claude-3-5-haiku",
    "stream": true,
    "timeout": 20000,
    "maxRetries": 1
  },
  "skills": {
    "enabled": [],
    "cache": true
  },
  "log": {
    "level": "warn",
    "rotation": {
      "maxSize": "10MB",
      "maxAge": 7
    }
  }
}

위 최적화를 통해 OpenClaw은 512MB 메모리 서버에서도 안정적으로 실행되면서 수용 가능한 응답 속도를 유지할 수 있습니다. 실제 부하에 따라 매개변수를 점진적으로 조정하여 성능과 리소스 사이의 최적 균형점을 찾으세요.

OpenClaw는 무료 오픈소스 개인 AI 어시스턴트로, WhatsApp, Telegram, Discord 등 다양한 플랫폼을 지원합니다