본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 16. 04:47

단 하나의 모델이 Linux 시스템을 멈추지 않도록 방지하기: 셀프 호스팅 AI를 위한 cgroup v2 가드레일 (Guardrails)

요약

Linux 환경에서 LLM을 셀프 호스팅할 때 시스템 전체가 멈추는 현상을 방지하기 위한 리소스 가드레일 구축 방법을 설명합니다. systemd와 cgroup v2를 활용하여 AI 워크로드에 CPU 및 메모리 제한을 설정하는 가이드를 제공합니다.

핵심 포인트

  • systemd와 cgroup v2를 이용한 AI 전용 리소스 슬라이스(ai.slice) 생성
  • MemoryHigh와 MemoryMax를 병용하여 부드러운 메모리 관리 및 OOM 방지
  • systemd-run을 활용한 일회성 AI 작업의 격리된 실행 방법
  • CPU 및 메모리 쿼터 설정을 통한 시스템 안정성 확보

만약 여러분이 개인 Linux 머신에서 LLM (Large Language Models)을 실행한다면, 아마 이런 상황을 겪어보셨을 것입니다:

  • 하나의 무거운 추론 (Inference) 작업이 시작되면,
  • 데스크톱/SSH가 느려지고,
  • 갑자기 모든 것이 멈춘 것처럼 느껴집니다.

해결책은 첫 번째 단계로 "더 큰 하드웨어를 사는 것"이 아닙니다.
첫 번째 해결책은 리소스 가드레일 (Resource guardrails) 입니다.

이 가이드에서는 systemd + cgroup v2를 사용하여 AI 워크로드를 명확한 CPU 및 메모리 경계 내에 유지함으로써, 단 하나의 모델 실행이 시스템 전체를 망가뜨리지 않도록 하는 방법을 알아봅니다.

우리가 구축할 것

다음 사항들을 구축할 것입니다:

  1. AI 워크로드를 위한 전용 슬라이스 (ai.slice),
  2. CPU 및 메모리 제한 (CPUQuota, MemoryHigh, MemoryMax),
  3. 일회성 작업을 위한 일시적 실행 패턴 (systemd-run --slice=ai.slice),
  4. 빠른 관측성 확인 (systemctl status, oomctl, memory.pressure, cpu.stat).

이 방식은 다음과 같은 경우에 효과적입니다:

  • Ollama 모델 풀(pull)/실행,
  • 배치 임베딩 (Batch embedding) 작업,
  • 로컬 리랭커 (Rerankers) 및 평가 (Eval) 스크립트,
  • CPU/RAM을 많이 사용하는 모든 장기 실행 프로세스.

요구 사항

  • systemd를 사용하는 Linux 호스트
  • cgroup v2 활성화 (최신 배포판에서는 기본값)
  • sudo 권한

빠르게 확인하기:

stat -fc %T /sys/fs/cgroup
# 예상 결과: cgroup2fs

...

1단계) 적절한 가드레일을 갖춘 ai.slice 생성하기

유닛 파일(Unit file)을 생성합니다:

sudo tee /etc/systemd/system/ai.slice >/dev/null <<'EOF'
[Unit]
Description=Resource slice for self-hosted AI workloads
...

슬라이스를 로드하고 시작합니다:

sudo systemctl daemon-reload
sudo systemctl start ai.slice
sudo systemctl status ai.slice --no-pager

MemoryHighMemoryMax를 모두 사용하나요?

  • MemoryHigh = 스로틀링/회수 압박 지점 (조기 경고 경계)
  • MemoryMax = 하드 캡 (cgroup이 여전히 제한을 초과할 경우 OOM kill 발생)

두 가지를 모두 사용하면 하드 킬(Hard kill) 제한만 사용하는 것보다 더 부드러운 동작을 제공합니다.

2단계) 슬라이스 내부에서 AI 작업 실행하기

일회성 실행을 위해 systemd-run을 사용합니다:

systemd-run --unit=ai-embed-$(date +%s) \
  --slice=ai.slice \
  --property=Type=exec \
...

Ollama 추론 스크립트를 사용한 예시:

systemd-run --unit=ai-infer-$(date +%s) \
  --slice=ai.slice \
  --property=Type=exec \
...

참고 사항:

  • --slice=ai.slice가 핵심 라인입니다.
  • --property=Type=exec는 시작 실패 감지(startup failure detection)를 더 엄격하게 만듭니다.
  • --collect는 종료 후 일시적인 유닛(transient units)의 정리를 돕습니다.

3단계) 제한 사항이 실제로 작동하는지 검사하기

유닛 배치 및 제한 사항 확인

systemctl status ai.slice --no-pager
systemctl show ai.slice -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

압박(Pressure) 및 스로틀링(Throttling) 신호 검사

# 우리 슬라이스(slice)를 위한 cgroup 경로
CG=/sys/fs/cgroup/ai.slice

...

확인해야 할 사항:

  • 부하 발생 시 memory.events 수치 증가 (high, max, oom, oom_kill)
  • CPU 할당량(quota)에 도달했을 때 cpu.stat에서 nr_throttledthrottled_usec 표시
  • memory.pressure 상승은 작업이 메모리 압박(memory pressure)으로 인해 지연(stalling)되고 있음을 의미

4단계) 선택 사항: OOM 정책으로 나머지 시스템 보호하기

사용 중인 배포판에서 systemd-oomd를 활성화한 경우, 커널의 완전한 OOM 혼란이 발생하기 전에 cgroup 레벨에서 압박 기반의 종료(kill) 결정을 내릴 수 있습니다.

빠른 확인:

systemctl status systemd-oomd --no-pager
oomctl

나중에 ManagedOOM* 설정을 조정한다면, 운영 환경이 아닌 곳에서 주의 깊게 테스트하십시오.

5단계) 이를 기본 실행 패턴으로 만들기

재현성을 위해 작은 래퍼(wrapper)를 추가합니다:

sudo tee /usr/local/bin/ai-run >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
...

사용법:

ai-run ollama run llama3.1:8b "Give me a 10-line summary"
ai-run python3 scripts/nightly_eval.py

일반적인 실수

  1. MemoryMax만 설정하는 경우

    • 조기 회수 (early reclaim) 동작 없이 프로세스가 갑작스럽게 종료(abrupt kills)됩니다. MemoryHigh + MemoryMax 조합을 권장합니다.
  2. 임시 실행 시 slice를 잊어버리는 경우

    • 명령어를 직접 실행하면 가드레일 (guardrails)을 벗어나게 됩니다.
  3. 관측 루프 (observability loop)의 부재

    • 부하 테스트 (load tests) 후에는 항상 memory.events, memory.pressure, 그리고 cpu.stat을 점검하십시오.
  4. 기기 간에 제한 값을 그대로 복사하여 붙여넣는 경우

    • 실제 RAM/CPU 및 워크로드 프로필 (workload profile)에 맞춰 제한 값을 조정하십시오.

최종 요약 (Final takeaway)

자원 격리 (resource isolation)를 일급 기능 (first-class feature)으로 취급할 때, 셀프 호스팅 AI는 극적으로 더 안정화됩니다.

cgroup v2 제한이 적용된 전용 systemd slice를 사용하면 다음과 같은 이점을 얻을 수 있습니다:

  • 예기치 않은 시스템 잠김 (lockups) 감소,
  • 단일 호스트에서의 더 나은 멀티 테넌트 (multi-tenant) 동작,
  • 새로운 모델을 테스트할 때 더 안전한 실험 환경.

이번 주에 단 한 가지만 구현한다면, 그것은 바로 ai.slice + systemd-run --slice=ai.slice입니다.

참고 문헌 (References)

  1. Linux kernel docs — Control Group v2: https://docs.kernel.org/admin-guide/cgroup-v2.html
  2. Linux kernel docs — Pressure Stall Information (PSI): https://docs.kernel.org/accounting/psi.html
  3. man7 — systemd.resource-control(5): https://man7.org/linux/man-pages/man5/systemd.resource-control.5.html
  4. man7 — systemd-run(1): https://man7.org/linux/man-pages/man1/systemd-run.1.html
  5. man7 — systemd.slice(5): https://man7.org/linux/man-pages/man5/systemd.slice.5.html
  6. man7 — systemd-oomd.service(8): https://man7.org/linux/man-pages/man8/systemd-oomd.service.8.html

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0