SLURM 구축. 패키지 설치만으로 끝나지 않습니다. 모든 노드의 시간과 UID/GID를 맞추고 MUNGE 신뢰 영역을 만든 뒤, 컨트롤러 slurmctld와 계산 노드 slurmd, 선택적인 회계 서비스 slurmdbd를 순서대로 구성해야 합니다.

이 SLURM 구축 가이드는 운영에 필요한 역할 분리, 패키지화, slurm.conf, cgroup 자원 격리, 회계, 제출·검증, drain과 백업까지 연결합니다. 예제 노드명과 자원 값은 반드시 실제 slurmd -C 출력에 맞춰 바꾸십시오.

SLURM 구축 아키텍처: 로그인 노드, slurmctld 컨트롤러, MUNGE, slurmd 계산 노드와 slurmdbd 회계
시간·UID/GID·설정을 동기화하고 MUNGE로 인증하는 Slurm 클러스터의 역할과 흐름

SLURM 구축: 역할과 장애 범위

구성요소 역할 운영 핵심
slurmctld 스케줄링과 클러스터 상태 StateSaveLocation 보호와 HA 설계
slurmd 계산 노드 작업 실행 로컬 spool과 cgroup 격리
MUNGE 노드 간 자격 증명 동일 키·정확한 시간·엄격한 권한
slurmdbd 작업·사용량 회계 중계 DB 비밀과 백업, 별도 장애 대응
slurmrestd 선택적 REST API 직접 인터넷 공개 금지, 별도 인증·프록시
Slurm 컨트롤러는 계산 데이터 자체를 보관하지 않지만 스케줄러 상태를 가집니다. StateSaveLocation을 지우거나 두 컨트롤러를 동시에 활성화하는 방식으로 장애를 처리하지 마십시오.

SLURM 구축: 노드·시간·UID/GID 선행 조건

정방향과 역방향 이름 해석, 동일한 사용자 숫자 ID, NTP 동기화가 먼저 맞아야 MUNGE와 작업 소유권이 일관됩니다. LDAP 같은 중앙 디렉터리를 쓰지 않으면 계정 프로비저닝 절차로 숫자 ID를 고정합니다.

hostnamectl --static
getent hosts ctrl01
getent hosts node01
id slurm
id hpcuser
timedatectl status
chronyc tracking
chronyc sources -v

서비스 계정과 디렉터리

sudo groupadd --system slurm
sudo useradd --system --gid slurm   --home-dir /var/lib/slurm --shell /sbin/nologin slurm
sudo install -d -o slurm -g slurm -m 0750 /var/lib/slurm/controller
sudo install -d -o slurm -g slurm -m 0750 /var/lib/slurm/slurmd
sudo install -d -o slurm -g slurm -m 0750 /var/log/slurm
여러 노드에서 계정을 직접 만들면 UID/GID가 달라질 수 있습니다. 숫자 ID를 조직 표준으로 고정하거나 중앙 디렉터리에서 제공하십시오.

재현 가능한 Slurm 패키지 준비

운영 환경은 소스 디렉터리에서 make install을 반복하기보다 공식 릴리스 tarball로 RPM 또는 DEB 패키지를 빌드하고 내부 서명 저장소에 고정합니다. 컨트롤러, 로그인, 계산 노드의 Slurm 주·부 버전과 플러그인 빌드 옵션을 동일하게 관리하십시오.

sha256sum "${SLURM_TARBALL}"
rpmbuild -ta "${SLURM_TARBALL}"
rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}
'   ~/rpmbuild/RPMS/*/slurm-*.rpm

배포판, 데이터베이스, PMIx, hwloc와 cgroup 지원에 필요한 빌드 의존성은 공식 문서와 내부 지원 매트릭스로 확정합니다. 인터넷의 임의 저장소 패키지를 컨트롤러 한 대에만 설치하지 마십시오.

SLURM 구축: MUNGE 신뢰 영역 구성

하나의 클러스터는 모든 참여 노드에 같은 MUNGE 키를 배포합니다. 키는 안전한 구성 관리 채널로 전달하고 munge 사용자만 읽게 합니다. MUNGE는 Slurm보다 먼저 시작해야 합니다.

sudo /usr/sbin/mungekey --create
sudo chown munge:munge /etc/munge/munge.key
sudo chmod 0400 /etc/munge/munge.key
sudo systemctl enable --now munge
munge -n | unmunge

컨트롤러에서 만든 키를 각 노드에 안전하게 배포한 뒤 소유권과 해시를 대조합니다. 명령행이나 일반 로그에 키 내용을 출력하지 않습니다.

sudo stat -c '%U:%G %a %n' /etc/munge/munge.key
sudo sha256sum /etc/munge/munge.key
remunge

SLURM 구축: slurm.conf를 실제 하드웨어에서 생성

SLURM 구축에서 CPU, 소켓, 코어, 메모리를 추측하지 않습니다. 각 계산 노드에서 slurmd -C를 실행하고 동일 모델 그룹별 NodeName 정의를 만듭니다.

slurmd -C
lscpu
free -m
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTS
ClusterName=hpc-prod
SlurmctldHost=ctrl01
SlurmUser=slurm
StateSaveLocation=/var/lib/slurm/controller
SlurmdSpoolDir=/var/lib/slurm/slurmd
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log

AuthType=auth/munge
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
SchedulerType=sched/backfill
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup

AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=acct01
JobAcctGatherType=jobacct_gather/cgroup

NodeName=node[01-04] CPUs=32 RealMemory=125000 State=UNKNOWN
PartitionName=compute Nodes=node[01-04] Default=YES MaxTime=2-00:00:00 State=UP
NodeName의 CPUs와 RealMemory는 예시입니다. 실제 slurmd -C 값보다 메모리를 약간 낮게 잡아 운영체제 여유분을 남기고, GPU가 있으면 GRES와 장치 cgroup 구성을 별도로 검증하십시오.

cgroup v2 자원 격리

CgroupPlugin=autodetect
ConstrainCores=yes
ConstrainRAMSpace=yes
ConstrainDevices=yes
stat -fc %T /sys/fs/cgroup
scontrol show config | grep -E 'ProctrackType|TaskPlugin|SelectType'
systemd-cgls --no-pager

slurmdbd 회계 서비스

작업 이력, 계정별 사용량과 QoS를 장기간 관리하려면 slurmdbd와 지원되는 SQL 데이터베이스를 분리합니다. DB 자격 증명은 0600 권한의 slurmdbd.conf나 비밀 관리 시스템에 두고 본문·Git에 기록하지 않습니다.

sudo install -o slurm -g slurm -m 0600   /dev/null /etc/slurm/slurmdbd.conf
sudoedit /etc/slurm/slurmdbd.conf
sudo systemctl enable --now slurmdbd
sudo journalctl -u slurmdbd -b --no-pager

클러스터 등록과 계정·협회 생성은 변경 관리 하에서 수행합니다. sacctmgr 출력과 DB 백업을 남기고, 삭제 명령은 dry-run 성격의 조회로 대상을 확정한 뒤에만 실행합니다.

sudo sacctmgr add cluster hpc-prod
sudo sacctmgr add account research Description='Research'
sudo sacctmgr add user hpcuser Account=research
sacctmgr show cluster
sacctmgr show association tree

SLURM 구축: 서비스 시작 순서와 상태 확인

  1. 모든 노드에서 시간·이름·UID/GID를 검증합니다.
  2. MUNGE를 시작하고 로컬·원격 자격 증명을 시험합니다.
  3. 회계를 쓰면 slurmdbd와 DB 연결을 먼저 확인합니다.
  4. 컨트롤러에서 slurmctld를 시작합니다.
  5. 계산 노드에서 slurmd를 시작합니다.
  6. scontrol·sinfo로 구성과 노드 상태를 확인합니다.
sudo systemctl enable --now slurmctld
sudo systemctl enable --now slurmd
systemctl --no-pager --full status slurmctld
systemctl --no-pager --full status slurmd
scontrol ping
sinfo --long
scontrol show nodes

대화형·배치 작업으로 SLURM 구축 검증

srun --partition=compute --nodes=1 --ntasks=1   hostname
srun --partition=compute --nodes=2 --ntasks-per-node=2   /bin/hostname
#!/usr/bin/env bash
#SBATCH --job-name=smoke-test
#SBATCH --partition=compute
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=2
#SBATCH --time=00:05:00
#SBATCH --output=slurm-%j.out

set -euo pipefail
hostname
srun --label /bin/hostname
JOB_ID=$(sbatch --parsable smoke-test.sbatch)
squeue --job "$JOB_ID"
sacct --jobs "$JOB_ID"   --format=JobID,State,Elapsed,AllocCPUS,MaxRSS,ExitCode
scontrol show job "$JOB_ID"

노드 drain, 복구와 안전한 운영

sudo scontrol update NodeName=node03   State=DRAIN Reason='planned maintenance'
scontrol show node node03
squeue --nodelist=node03

sudo scontrol update NodeName=node03 State=RESUME
sinfo --nodes=node03 --long

DOWN이나 DRAIN 상태를 무조건 RESUME하지 말고 Reason, slurmd 로그, 하드웨어 이벤트와 파일시스템 상태를 먼저 확인합니다. 작업 중인 노드는 정책에 따라 완료·재큐·취소 판단을 내립니다.

sudo journalctl -u slurmd --since '-30 minutes' --no-pager
sudo journalctl -u slurmctld --since '-30 minutes' --no-pager
scontrol show node node03
sdiag

백업과 장애 복구

  • slurm.conf, cgroup.conf, gres.conf와 배포 자동화 원본을 버전 관리합니다.
  • StateSaveLocation은 서비스 일관성을 고려해 백업하고 권한을 보존합니다.
  • slurmdbd 데이터베이스는 트랜잭션 일관성이 있는 방식으로 백업·복원 시험합니다.
  • MUNGE 키는 암호화된 비밀 저장소에 별도 보관하고 접근을 감사합니다.
  • 대기 컨트롤러는 공식 HA 방식으로 구성하고 동시에 두 slurmctld를 활성화하지 않습니다.

공식 문서와 연계 가이드

SLURM 구축 완료 기준은 데몬이 active인 상태가 아니라 MUNGE 인증, 자원 격리, 다중 노드 작업, 회계 기록, drain·resume, 백업·복원 시험이 모두 통과하는 것입니다. 이 기준을 자동 점검으로 남겨 노드 추가와 버전 업그레이드 때 반복하십시오.