Slurm 설치 (Controller Node + Compute Node)

jaehan·2025년 6월 3일
post-thumbnail

1. 들어가며

Slurm(“Simple Linux Utility for Resource Management”)은 대표적인 HPC(High-Performance Computing) 잡 스케줄러입니다.
개인적으로 AWS EC2 인스턴스 두 대를 사용하여 Slurm 컨트롤러(Controller)와 컴퓨트(Compute) 노드를 기반으로 Slurm 클러스터를 구성해보았습니다.

2. 환경 및 사전 준비

  • AWS 리전(Region): 서울 리전(ap-northeast-2)

  • 두 대의 EC2 인스턴스

    • OS: Ubuntu 22.04 LT
    • 인스턴스 타입: t3.xlarge
    • 네트워킹: 기본 VPC
      • 컨트롤러(Controller) 호스트명: slurm-controller
        • Private IP: 172.31.54.171
      • 컴퓨트(Compute) 호스트명: slurm-compute
        • Private IP: 172.31.54.171
  • SSH 키 페어(PEM 파일): ~/.ssh/jaehan-ec2-keypair.pem

    • 두 인스턴스 모두 동일한 키 페어로 접속 가능하도록 생성 및 연결
  • 호스트네임 /etc/hosts 설정
    컨트롤러/컴퓨트 양쪽 인스턴스에 다음 내용을 /etc/hosts에 추가하여 서로를 이름으로 인식하도록 설정

sudo tee -a /etc/hosts << 'EOF'
172.31.54.171  slurm-controller
172.31.54.171  slurm-compute
EOF
  • OS 패키지 업데이트
sudo apt update && sudo apt upgrade -y

3. Munge 설치 및 키 공유

Slurm은 노드 간 통신을 암호화/인증하기 위해 Munge 인증 시스템을 사용합니다.
컨트롤러와 컴퓨트 노드에 동일한 munge.key 파일이 있어야 서로 통신이 가능합니다.

3.1. 컨트롤러 노드에서 Munge 설치 및 키 생성

패키지 설치

sudo apt install -y libmunge2 libmunge-dev munge

munge.key 생성

sudo /usr/sbin/mungekey --create

만약 이미 키가 존재한다면, 에러가 발생할 수 있으니 새로 키를 생성하고 싶을 때 아래 명령어를 사용합니다.

sudo rm /etc/munge/munge.key
sudo /usr/sbin/mungekey --create
sudo ls /etc/munge -alh

munge.key 파일 유저, 그룹 및 권한 설정

sudo chown munge:munge /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key

Munge 서비스 기동 및 활성화

sudo systemctl enable munge
sudo systemctl start munge
sudo systemctl status munge # active (running) 확인

3.2. 컨트롤러 → 컴퓨트 노드로 munge.key 복사

컨트롤러에서 생성된 /etc/munge/munge.key 파일을 컴퓨트 노드로 복사합니다.

sudo scp -i ~/.ssh/jaehan-ec2-keypair.pem /etc/munge/munge.key ubuntu@slurm-compute:/tmp/

컴퓨트 노드에서 작업:

sudo mkdir -p /etc/munge /var/lib/munge /var/log/munge
sudo mv /tmp/munge.key /etc/munge/munge.key
sudo chown munge:munge /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key

컴퓨트 노드에서 Munge 설치 및 기동

sudo apt install -y libmunge2 libmunge-dev munge
sudo systemctl enable munge
sudo systemctl start munge
sudo systemctl status munge   # active (running) 확인

4. Slurm 패키지 설치

4.1. 컨트롤러 노드에서 Slurm 설치

필요 패키지 설치

sudo apt install -y slurm-wlm slurm-wlm-basic-plugins

slurm 사용자/그룹 및 디렉터리 준비

sudo id slurm &>/dev/null || sudo useradd -m -U -r slurm
sudo mkdir -p /var/spool/slurmctld
sudo mkdir -p /var/log/slurm
sudo chown slurm:slurm /var/spool/slurmctld /var/log/slurm

기본 slurm.conf 파일 생성

sudo tee /etc/slurm/slurm.conf << 'EOF'
#
# Two-node Slurm cluster (controller + compute)
#
ClusterName=twoNodeCluster
ControlMachine=slurm-controller

# Slurm 사용자
SlurmUser=slurm

# 로그 파일 경로
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log

# 인증 방식
AuthType=auth/munge
CryptoType=crypto/munge

# 포트 (기본값)
SlurmctldPort=6817
SlurmdPort=6818

# 상태 저장 위치
StateSaveLocation=/var/spool/slurmctld

# 스케줄러 및 리소스 선택
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core

# 컨트롤러 노드(자기 자신)
NodeName=slurm-controller CPUs=4 RealMemory=8192 State=UNKNOWN

# 컴퓨트 노드
NodeName=slurm-compute CPUs=4 RealMemory=8192 State=UNKNOWN

# 파티션 정의: controller, compute 둘 다 debug 파티션에 포함
PartitionName=debug Nodes=slurm-controller,slurm-compute Default=YES MaxTime=INFINITE State=UP
EOF

파일 소유자와 권한 설정:

sudo chown slurm:slurm /etc/slurm-llnl/slurm.conf
sudo chmod 600 /etc/slurm-llnl/slurm.conf

slurmctld 데몬 활성화 및 기동

sudo systemctl enable slurmctld
sudo systemctl start slurmctld
sudo systemctl status slurmctld   # active (running) 확인

4.2. 컴퓨트 노드에서 Slurm 설치

필요 패키지 설치

sudo apt install -y slurm-wlm slurm-wlm-basic-plugins

slurm 사용자/그룹 및 디렉터리 준비

sudo id slurm &>/dev/null || sudo useradd -m -U -r slurm
sudo mkdir -p /var/spool/slurmctld
sudo mkdir -p /var/log/slurm
sudo chown slurm:slurm /var/spool/slurmctld /var/log/slurm

slurm.conf 파일 복사
컨트롤러에 작성한 /etc/slurm-llnl/slurm.conf 파일을 컴퓨트 노드로 가져옵니다.
컨트롤러에서:

sudo scp -i ~/.ssh/jaehan-ec2-keypair.pem /etc/slurm/slurm.conf ubuntu@slurm-compute:/tmp/

컴퓨트에서:

sudo mv /tmp/slurm.conf /etc/slurm/slurm.conf
sudo chown slurm:slurm /etc/slurm/slurm.conf
sudo chmod 600 /etc/slurm/slurm.conf

slurmd 데몬 활성화 및 기동

sudo systemctl enable slurmd
sudo systemctl start slurmd
sudo systemctl status slurmd   # active (running) 확인

5. 클러스터 상태 확인

컨트롤러에서 파티션·노드 정보 조회(sinfo)

NODES=2, STATE=idle, NODELIST=slurm-controller,slurm-compute 로 두 노드가 모두 준비된 상태입니다.

6. 발생 에러 및 해결

slurm 구성 파일인 slurm.conf의 초기 세팅이 잘못되어 이를 수정 후, 기존 구성 파일을 제거하고 새로 slurm.conf를 생성 후 slurm을 구동시키려고 했으나, 기존 초기 세팅에서 나온 에러가 발생하였습니다.

ubuntu@slurm-controller:~$ sudo systemctl status slurmctld
× slurmctld.service - Slurm controller daemon
     Loaded: loaded (/lib/systemd/system/slurmctld.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2025-06-03 02:26:51 UTC; 11s ago
       Docs: man:slurmctld(8)
    Process: 25690 ExecStart=/usr/sbin/slurmctld -D -s $SLURMCTLD_OPTIONS (code=exited, status=1/FAILURE)
   Main PID: 25690 (code=exited, status=1/FAILURE)
        CPU: 33ms

Jun 03 02:26:51 slurm-controller systemd[1]: Started Slurm controller daemon.
Jun 03 02:26:51 slurm-controller slurmctld[25690]: slurmctld: fatal: CLUSTER NAME MISMATCH.
Jun 03 02:26:51 slurm-controller slurmctld[25690]: slurmctld has been started with "ClusterName=twonodecluster", but read "cluster" from the state>
Jun 03 02:26:51 slurm-controller slurmctld[25690]: Running multiple clusters from a shared StateSaveLocation WILL CAUSE CORRUPTION.
Jun 03 02:26:51 slurm-controller slurmctld[25690]: Remove /var/spool/slurmctld/clustername to override this safety check if this is intentional (e>
Jun 03 02:26:51 slurm-controller systemd[1]: slurmctld.service: Main process exited, code=exited, status=1/FAILURE
Jun 03 02:26:51 slurm-controller systemd[1]: slurmctld.service: Failed with result 'exit-code'.

원인

Slurm 컨트롤러는 매 기동 시 $StateSaveLocation 디렉터리(기본 /var/spool/slurmctld)를 확인하여,
이전에 사용된 클러스터 이름(ClusterName)을 기록한 “clustername” 파일(또는 디렉터리)을 읽어옵니다.

  • /var/spool/slurmctld/clustername 내부에는 이전 ClusterName값(예: cluster)이 있어 보관 중이었습니다.
  • 그런데 현재 slurm.conf에 ClusterName=twoNodeCluster를 쓰면서 이름이 불일치하자, Slurm은 다른 클러스터 정보를 덮어써서는 안 된다는 안전장치를 작동시켜 기동을 거부했습니다.

해결 방법

상태 디렉토리 초기화

sudo systemctl stop slurmctld
sudo rm -rf /var/spool/slurmctld/<clusteName>
sudo systemctl start slurmctld
sudo systemctl status slurmctld

정상 기동 시 아래와 같이 출력됩니다.

ubuntu@slurm-controller:~$ sudo systemctl status slurmctld
● slurmctld.service - Slurm controller daemon
     Loaded: loaded (/lib/systemd/system/slurmctld.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2025-06-03 02:28:08 UTC; 3min 36s ago
       Docs: man:slurmctld(8)
   Main PID: 25989 (slurmctld)
      Tasks: 10
     Memory: 2.0M
        CPU: 143ms
     CGroup: /system.slice/slurmctld.service
             ├─25989 /usr/sbin/slurmctld -D -s
             └─25995 "slurmctld: slurmscriptd" "" ""

Jun 03 02:28:08 slurm-controller systemd[1]: Started Slurm controller daemon.
Jun 03 02:28:08 slurm-controller slurmctld[25989]: slurmctld: No parameter for mcs plugin, default values set
Jun 03 02:28:08 slurm-controller slurmctld[25989]: slurmctld: mcs: MCSParameters = (null). ondemand set.
Jun 03 02:29:08 slurm-controller slurmctld[25989]: slurmctld: SchedulerParameters=default_queue_depth=100,max_rpc_cnt=0,max_sched_time=2,partition>

참고자료

https://slurm.schedmd.com/documentation.html
https://blog.liam.kim/posts/2024/05/Slurm-Setup-Guide/#install-munge
https://grsn.tistory.com/493

profile
공부공부

0개의 댓글