단 하나의 모델이 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 및 메모리 경계 내에 유지함으로써, 단 하나의 모델 실행이 시스템 전체를 망가뜨리지 않도록 하는 방법을 알아봅니다.
우리가 구축할 것
다음 사항들을 구축할 것입니다:
- AI 워크로드를 위한 전용 슬라이스 (
ai.slice), - CPU 및 메모리 제한 (
CPUQuota,MemoryHigh,MemoryMax), - 일회성 작업을 위한 일시적 실행 패턴 (
systemd-run --slice=ai.slice), - 빠른 관측성 확인 (
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
왜 MemoryHigh와 MemoryMax를 모두 사용하나요?
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_throttled및throttled_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
일반적인 실수
-
MemoryMax만 설정하는 경우- 조기 회수 (early reclaim) 동작 없이 프로세스가 갑작스럽게 종료(abrupt kills)됩니다.
MemoryHigh+MemoryMax조합을 권장합니다.
- 조기 회수 (early reclaim) 동작 없이 프로세스가 갑작스럽게 종료(abrupt kills)됩니다.
-
임시 실행 시 slice를 잊어버리는 경우
- 명령어를 직접 실행하면 가드레일 (guardrails)을 벗어나게 됩니다.
-
관측 루프 (observability loop)의 부재
- 부하 테스트 (load tests) 후에는 항상
memory.events,memory.pressure, 그리고cpu.stat을 점검하십시오.
- 부하 테스트 (load tests) 후에는 항상
-
기기 간에 제한 값을 그대로 복사하여 붙여넣는 경우
- 실제 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)
- Linux kernel docs — Control Group v2: https://docs.kernel.org/admin-guide/cgroup-v2.html
- Linux kernel docs — Pressure Stall Information (PSI): https://docs.kernel.org/accounting/psi.html
- man7 — systemd.resource-control(5): https://man7.org/linux/man-pages/man5/systemd.resource-control.5.html
- man7 — systemd-run(1): https://man7.org/linux/man-pages/man1/systemd-run.1.html
- man7 — systemd.slice(5): https://man7.org/linux/man-pages/man5/systemd.slice.5.html
- man7 — systemd-oomd.service(8): https://man7.org/linux/man-pages/man8/systemd-oomd.service.8.html
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기