SLURM 소개
SLURM의 개요 및 역할
SLURM(Simplified Linux Utility for Resource Management)은 리눅스 환경에서 다중 노드를 묶어 고성능 컴퓨팅(HPC, High-Performance Computing) 클러스터를 구성할 때 사용되는 오픈 소스 자원 관리 및 작업 스케줄러입니다. SLURM은 리소스 할당, 작업 스케줄링, 노드 모니터링 등 클러스터 관리의 핵심 기능을 제공하며, 여러 연구소와 산업체에서 자원을 효율적으로 관리하고 계산 작업을 최적화하는 데 사용됩니다.
SLURM의 주요 기능 및 역할
SLURM은 고성능 컴퓨팅에서 작업의 효율성을 극대화하기 위해 다양한 기능을 제공합니다. SLURM의 핵심 역할을 몇 가지로 나누어 설명할 수 있습니다.
- 1) 자원 관리(Resource Management)
- CPU, 메모리, GPU, 디스크 공간 등 다양한 시스템 자원을 관리합니다. 이를 통해 사용자는 특정 자원 조건을 설정하여 작업을 제출할 수 있습니다.
- 자원 관리 기능은 컴퓨팅 자원의 중복 사용을 방지하고, 각 작업이 할당된 자원을 독립적으로 사용할 수 있도록 보장합니다.
- 2) 작업 스케줄링(Job Scheduling)
- 클러스터에 요청된 작업을 스케줄링하여 자원에 할당합니다. 사용자는 sbatch, srun 명령을 통해 작업을 제출하고, 이를 큐에 넣고 우선순위에 따라 스케줄링합니다.
- 작업의 우선순위는 대기 시간, 사용자 그룹, 자원 요청 조건 등에 따라 결정되며, 다양한 스케줄링 알고리즘이 지원됩니다.
- 스케줄링 기능은 계산 자원의 사용률을 높이는 동시에 작업의 빠른 처리를 보장합니다.
- 3) 클러스터 노드 관리(Node Management)
- SLURM은 클러스터 내 여러 노드를 하나의 큰 컴퓨팅 환경으로 묶어 관리합니다. 각 노드는 SLURM 마스터 노드와 통신하며, 작업을 수행하는 compute node 역할을 합니다.
- 노드에 문제가 발생하면 SLURM은 해당 노드를 격리하고, 다른 노드를 통해 작업을 계속 수행할 수 있도록 지원합니다. 이를 통해 클러스터의 안정성과 가용성을 높일 수 있습니다.
- 4) 사용자 접근 제어 및 계정 관리
- SLURM은 다중 사용자 환경에서 각 사용자와 그룹의 권한을 설정하고 관리합니다. 이를 통해 자원 할당을 사용자별로 제어하고, 특정 그룹에 높은 우선순위를 부여하는 방식으로 자원 할당 정책을 운영할 수 있습니다.
- SLURMDBD(SLURM Database Daemon)를 통해 작업 기록과 자원 사용량을 저장, 분석하여 공정한 계정 관리와 청구가 가능합니다.
- 5) 확장성(Scalability)
- SLURM은 수백 개에서 수천 개의 노드까지 확장 가능한 구조를 갖추고 있으며, 멀티클러스터 환경도 지원합니다. 따라서 대규모의 HPC 환경에서도 성능 저하 없이 자원 관리와 스케줄링이 가능합니다.
역사 및 발전 배경
2002년 로렌스 리버모어 국립 연구소(Lawrence Livermore National Laboratory, LLNL)에서 시작된 오픈 소스 프로젝트로, 초기에는 다양한 플랫폼에서 확장 가능하고 안정적인 작업 스케줄링 시스템을 구축하는 것을 목표로 개발되었습니다. SLURM은 HPC(High-Performance Computing) 환경에서 효율적이고 유연한 자원 관리를 지원하기 위해 설계되었으며, 이후 여러 연구소와 클라우드 컴퓨팅 환경에서도 널리 채택되어 발전해왔습니다.
SLURM의 초기 역사
2002년 프로젝트 시작: SLURM 프로젝트는 HPC 환경에서 기존의 상용 스케줄러들이 가진 비효율성과 높은 비용을 해결하기 위해 시작되었습니다. 당시 LLNL은 리눅스 클러스터 자원 관리의 효율성을 높이고 오픈 소스 환경에서 접근성과 유연성을 강화할 필요성을 느끼고 있었습니다.
오픈 소스 채택: LLNL은 SLURM을 오픈 소스로 공개하여 다른 연구소나 조직에서도 자유롭게 SLURM을 사용할 수 있도록 했습니다. SLURM은 GNU General Public License(GPL)에 따라 배포되며, 이를 통해 빠르게 확산되었습니다.
SLURM의 발전과 기능 추가
2005년~2010년대 초반: 다중 클러스터 지원 및 확장성 강화
초기 버전의 SLURM은 상대적으로 소규모 클러스터에 적합한 기능을 제공했으나, HPC의 수요가 증가하면서 확장성과 기능이 강화되었습니다. 특히 수천 개의 노드를 다룰 수 있도록 다중 클러스터 지원, 노드 간 통신 최적화, 다양한 자원 유형의 관리 기능이 추가되었습니다.
2010년대 중반: 멀티코어와 GPU 지원 강화
기술의 발전으로 멀티코어 프로세서와 GPU가 HPC에 도입되면서, SLURM은 CPU뿐 아니라 GPU 자원 관리 기능을 강화했습니다. SLURM은 이를 통해 HPC 환경뿐만 아니라 AI, 머신러닝 등의 데이터 집약적 작업에도 적합한 플랫폼으로 발전했습니다.
SLURM Database Daemon(slrumbd)의 도입
SLURM은 대규모 환경에서 자원 사용 데이터를 기록하고 분석할 수 있는 SLURM Database Daemon(slrumbd)을 도입하여, 작업과 자원 사용을 분석하고 효율적인 자원 분배가 가능하게 했습니다. 이를 통해 사용자 계정 관리, 자원 청구, 사용량 통계 등 다양한 관리 기능이 추가되었습니다.
최근 발전 및 업계 확산
고성능 스케줄링 알고리즘 도입: 최신 SLURM 버전은 다양한 스케줄링 알고리즘을 지원하여, 사용자 요구에 맞는 스케줄링 정책을 설정할 수 있게 되었습니다. FAIR, QoS, Priorities와 같은 정책을 적용할 수 있게 하여 자원의 공평한 배분을 보장합니다.
HPC 및 클라우드 통합 지원: SLURM은 이제 온프레미스 HPC와 클라우드 환경을 통합하여 사용할 수 있는 다양한 기능을 지원합니다. 이로 인해 연구소 및 산업체에서 온프레미스 환경뿐만 아니라 클라우드와의 하이브리드 환경에서도 SLURM을 사용할 수 있게 되었습니다.
보안 강화 및 접근 제어 기능 개선: SLURM은 최근 보안 기능을 강화하여 데이터 암호화, 사용자 접근 제어 리스트, 암호화 통신 등을 지원합니다.
SLURM의 산업적 채택과 커뮤니티 성장
전 세계 주요 HPC 센터와 데이터센터에서 표준화된 자원 관리 솔루션으로 채택되었습니다. 특히 연구소, 대학, 정부 기관을 비롯해 AI 및 데이터 과학을 위한 클러스터를 운영하는 여러 산업체에서도 SLURM을 사용하고 있습니다. SLURM 사용자와 개발자 커뮤니티는 꾸준히 성장해 왔으며, 현재도 활발히 기여하고 있어 최신 기술과 요구에 맞추어 지속적인 개선이 이루어지고 있습니다.
SLURM의 아키텍처
SLURM(Simplified Linux Utility for Resource Management)은 고성능 컴퓨팅(HPC) 클러스터에서 자원 관리를 효율적으로 수행하기 위한 아키텍처를 갖추고 있습니다. SLURM은 자원 및 작업을 관리하는 Controller, 작업을 수행하는 Compute Nodes, 기록을 보관하는 Database(선택적)로 구성되며, 이들 구성 요소 사이의 통신을 통해 클러스터 전체를 조율합니다. SLURM 데몬(slurmctld, slurmd, slurmdbd 등)은 각 요소가 제 기능을 수행하도록 돕고, 통신 흐름 및 데이터 저장 구조를 통해 작업과 자원 상태를 모니터링하고 관리합니다.
SLURM의 기본 구성 요소
Controller (슬럼 마스터 노드)
- 역할: SLURM에서 Controller는 클러스터의 중앙 관리 역할을 담당하며, slurmctld 데몬이 실행됩니다.
- 기능: 모든 작업 요청을 접수하고 스케줄링하며, 클러스터 자원을 모니터링하여 각 작업에 필요한 자원을 할당하고, 작업 완료 후 자원을 회수합니다. Controller는 클러스터 상태와 자원 정보, 작업 대기열을 실시간으로 업데이트하고 관리합니다.
- 고가용성: 단일 Controller가 실패할 경우를 대비해 보조(백업) Controller를 구성할 수 있습니다. 이를 통해 장애 발생 시 백업 Controller가 주 Controller의 기능을 이어받아 클러스터 운영을 지속할 수 있습니다.
Compute Nodes (슬럼 컴퓨트 노드)
- 역할: Compute Node는 사용자 작업이 실제로 실행되는 클러스터의 노드입니다.
- 기능: 각 Compute Node에는 slurmd 데몬이 실행되어, Controller와 통신하며 작업 수행 준비 상태에 있음을 알리고 작업이 할당되면 이를 수행합니다.
- 데몬 통신: Compute Node는 Controller로부터 작업 명령을 받아 수행하며, 작업이 완료되면 그 결과를 Controller에 보고합니다. Compute Node의 slurmd 데몬은 작업 중 발생하는 오류나 상태 변화를 실시간으로 Controller에 전달하여, 필요한 경우 작업을 중단하거나 재시작할 수 있도록 합니다.
Database (선택적 구성 요소)
- 역할: SLURM Database는 slurmdbd 데몬을 통해 작동하며, 작업 기록, 자원 사용 통계, 사용자 및 계정 정보를 저장하고 관리합니다. 이 구성 요소는 필수는 아니지만, 자원 사용량 추적 및 청구 관리에 유용합니다.
- 기능: 작업 제출 및 완료, 실패 내역 등 모든 작업 이력을 기록하여 향후 분석과 자원 사용 최적화를 위한 데이터를 제공합니다. SLURM Database Daemon(slurmdbd)는 MySQL, MariaDB 등 관계형 데이터베이스를 사용하여 데이터 보존과 조회 기능을 지원합니다.
SLURM 데몬(slurmctld, slurmd, slurmdbd)
- slurmctld: Controller에서 실행되며, 클러스터의 자원 상태와 작업 대기열을 관리하는 중심 데몬입니다. 작업을 스케줄링하고 자원을 할당, 해제하는 등의 작업을 수행합니다.
- slurmd: 각 Compute Node에서 실행되며, Controller로부터 작업을 할당받아 실행하는 데몬입니다. slurmd는 자원 상태 및 작업 진행 상태를 Controller에 실시간으로 보고합니다.
- slurmdbd: 선택적 Database 데몬으로, 작업 및 자원 사용 기록을 Database에 저장하여 후속 분석 및 보고가 가능하게 합니다.
통신 흐름 및 데이터 저장 구조
통신 흐름
Controller와 Compute Node 간 통신
slurmctld와 각 노드의 slurmd 데몬은 클러스터 내에서 주기적으로 통신하여 자원 상태와 작업 요청을 주고받습니다.
- Controller는 작업 대기열의 상태를 모니터링하며, 사용자가 작업을 제출하면 이를 적절한 Compute Node에 스케줄링하고, 작업 종료 후 자원 해제 상태를 업데이트합니다.
- 각 Compute Node의 slurmd는 Controller에서 전달받은 작업을 수행하고, 상태 변화를 실시간으로 Controller에 보고합니다.
Database 통신
slurmctld와 slurmdbd는 Database를 통한 데이터 저장 및 관리 통신을 수행합니다.
- slurmctld는 작업이 제출되거나 완료될 때마다 이 데이터를 slurmdbd에 전달하여 작업 기록 및 사용량 데이터를 저장합니다.
- Database에 저장된 정보는 사용자가 작업 이력을 조회하거나 자원 사용 현황을 확인할 때 활용됩니다.
데이터 저장 구조
- 작업 대기열 데이터
- 작업 제출 시 Controller의 메모리에 대기열 형태로 관리됩니다. 작업은 대기열 내에서 우선순위와 자원 가용성에 따라 스케줄링됩니다.
- 자원 상태 데이터
- Controller는 클러스터의 자원 상태를 메모리에 저장하고, 각 Compute Node에서 주기적으로 수신한 정보를 갱신하여 자원 할당 시 참고합니다.
- Database 저장 데이터
- 작업 ID, 사용자 ID, 작업 시간, 사용 자원량 등의 정보가 Database에 기록됩니다. 이 데이터는 사용량 보고서 생성, 통계 분석 등에 유용하며, 각 작업에 대한 데이터가 장기간 보관됩니다.
SLURM 설치 및 환경 설정
설치 전 요구 사항 및 환경 설정 준비
- 운영 체제
- SLURM은 주로 리눅스 시스템에서 사용되며, CentOS, Ubuntu, Debian 등 주요 리눅스 배포판을 지원합니다.
- 필수 패키지
- SLURM 설치 전 시스템에 필요한 필수 패키지를 설치해야 합니다. 일반적으로 아래와 같은 패키지가 필요합니다
- 컴파일 도구 (gcc, make 등)
- MySQL 또는 MariaDB 클라이언트 라이브러리 (Database 사용 시)
- munge (보안 인증을 위한 패키지)
- 네트워크 설정
- SLURM은 네트워크를 통해 Controller와 Compute Node 간의 통신을 수행합니다. 따라서, 모든 노드는 동일한 네트워크에 연결되고 각 노드의 IP 주소를 확인할 수 있어야 합니다.
- 파일 시스템
- 모든 노드에서 공통적으로 접근 가능한 공유 파일 시스템(NFS 등)을 설정하여 SLURM 설정 파일 및 데이터를 공유하는 것이 권장됩니다.
- 보안 설정 (MUNGE)
- SLURM은 munge라는 보안 인증 도구를 사용하여 각 노드 간 통신의 무결성과 인증을 보장합니다.
- munge를 설치하고 설정 파일(/etc/munge/munge.key)을 모든 노드에 동일하게 배포하여, SLURM Controller와 Compute Node 간의 통신을 보호할 수 있습니다.
- munge 서비스를 모든 노드에서 실행하고, 방화벽 설정도 허용하도록 해야 합니다.
SLURM 설치 (소스 및 패키지 설치)
패키지 설치
SLURM은 대부분의 리눅스 배포판에서 패키지로 설치할 수 있습니다.
# Redhat
yum update -y
yum install epel-release -y
yum install slurm* -y
주요 설정 파일 (slurm.conf, slurmdbd.conf) 구성
slurm.conf (마스터 노드 및 컴퓨트 노드 공통)
slurm.conf는 SLURM의 주요 설정 파일로, 클러스터 구성, 스케줄링 정책, 각 노드의 역할 등을 정의합니다.
일반적으로 /etc/slurm/slurm.conf에 위치하며, 클러스터의 모든 노드에서 동일하게 접근할 수 있어야 합니다. 일반적으로 NFS와 같은 공유 파일 시스템을 사용하여 모든 노드가 동일한 slurm.conf를 참조하도록 설정합니다.
ClusterName=mycluster
ControlMachine=controller-node
# 컴퓨트 노드 정의
NodeName=node[01-10] CPUs=16 RealMemory=64000 State=UNKNOWN
# 파티션 정의
PartitionName=debug Nodes=node[01-10] Default=YES MaxTime=INFINITE State=UP
옵션 | 설명 | 예시 |
ClusterName | 클러스터 이름을 지정합니다. | ClusterName=mycluster |
ControlMachine | SLURM Controller의 호스트 이름을 지정합니다. | ControlMachine=controller-node |
ControlAddr | SLURM Controller의 IP 주소를 지정합니다. | ControlAddr=192.168.0.1 |
SlurmdPort | SLURM 데몬(slurmd)의 포트를 지정합니다. | SlurmdPort=6818 |
MpiDefault | 기본 MPI 유형을 지정합니다. | MpiDefault=pmix |
NodeName | 클러스터에 포함된 노드를 정의합니다. | NodeName=node[01-10] CPUs=16 RealMemory=64000 State=UNKNOWN |
NodeAddr | 각 노드의 IP 주소를 지정합니다. | NodeAddr=node01-ip |
Sockets, CoresPerSocket, ThreadsPerCore | 각 노드의 CPU 구조를 지정합니다. | Sockets=2 CoresPerSocket=8 ThreadsPerCore=2 |
State | 노드의 초기 상태를 정의합니다. | State=UNKNOWN |
PartitionName | 파티션을 정의합니다. | PartitionName=debug Nodes=node[01-10] Default=YES MaxTime=INFINITE State=UP |
Nodes | 파티션에서 사용할 노드를 지정합니다. | Nodes=node[01-05] |
Default | 기본 파티션으로 지정할지 여부를 설정합니다. | Default=YES |
MaxTime | 파티션의 최대 실행 시간을 지정합니다. | MaxTime=01:00:00 |
State | 파티션의 상태를 지정합니다. | State=UP |
SchedulerType | 스케줄러 유형을 설정합니다. | SchedulerType=sched/backfill |
SelectType | 작업 선택 및 자원 할당 방식을 정의합니다. | SelectType=select/cons_res |
SelectTypeParameters | 자원 할당에 세부 파라미터를 설정합니다. | SelectTypeParameters=CR_CPU_Memory |
PriorityType | 작업의 우선순위 방식을 정의합니다. | PriorityType=priority/multifactor |
PreemptType | 작업의 선점 정책을 설정합니다. | PreemptType=preempt/partition_prio |
AccountingStorageType | 작업 기록 저장 방식을 설정합니다. | AccountingStorageType=accounting_storage/slurmdbd |
AccountingStorageHost | 작업 기록 데이터베이스 서버 호스트를 지정합니다. | AccountingStorageHost=database-node |
JobAcctGatherType | 작업 계정 정보 수집 방식을 지정합니다. | JobAcctGatherType=jobacct_gather/linux |
JobAcctGatherFrequency | 작업 계정 정보 수집 빈도를 초 단위로 설정합니다. | JobAcctGatherFrequency=30 |
AuthType | 인증 방식을 설정합니다. | AuthType=auth/munge |
SlurmUser | SLURM 데몬을 실행할 사용자 계정을 지정합니다. | SlurmUser=slurm |
SlurmdLogFile | SLURM 데몬의 로그 파일 위치를 지정합니다. | SlurmdLogFile=/var/log/slurmd.log |
SlurmctldLogFile | SLURM Controller 데몬의 로그 파일 위치를 지정합니다. | SlurmctldLogFile=/var/log/slurmctld.log |
PrivateData | SLURM 정보를 제한하여 보안 강화를 설정합니다. | PrivateData=jobs,usage |
KillWait | 작업 강제 종료 대기 시간을 설정합니다. | KillWait=30 |
ResumeTimeout | 일시 정지된 작업 재개 대기 시간을 설정합니다. | ResumeTimeout=300 |
SlurmctldTimeout | SLURM Controller의 응답 대기 시간을 설정합니다. | SlurmctldTimeout=600 |
MailProg | 알림을 보낼 메일 프로그램을 지정합니다. | MailProg=/bin/mail |
ProctrackType | SLURM에서 프로세스를 추적하는 방식을 설정합니다. | ProctrackType=proctrack/linuxproc |
slurmdbd.conf (Database Daemon 설정, 선택적)
SLURM의 작업 기록 및 자원 사용 내역을 데이터베이스에 저장하려면 slurmdbd.conf 파일을 설정해야 합니다.
DbdHost=controller-node
StorageType=accounting_storage/mysql
StorageHost=database-node
StorageUser=slurm
StoragePass=your_db_password
옵션 | 설명 |
DbdHost | SLURM 데이터베이스 데몬(slurmdbd)이 실행될 호스트의 이름 또는 IP 주소입니다. 이를 통해 SLURM 클러스터에서 모든 작업 데이터가 기록되고 관리됩니다. |
StorageType | SLURM에서 작업 및 사용자 데이터를 저장하는 방식입니다. accounting_storage/mysql은 MySQL 데이터베이스에 저장함을 의미합니다. |
StorageHost | 데이터베이스 서버가 위치한 호스트 이름 또는 IP 주소입니다. SLURM과 연동될 MySQL 데이터베이스 서버의 위치를 지정합니다. |
StorageUser | SLURM이 데이터베이스에 접근하기 위해 사용할 MySQL 사용자 계정입니다. 데이터베이스에 접근 권한이 있어야 합니다. |
StoragePass | StorageUser 계정의 비밀번호입니다. SLURM이 데이터베이스에 접근할 때 인증을 위해 사용됩니다. |
마스터 노드 구성 방법
# SLURM 데몬 시작
sudo systemctl start slurmctld
sudo systemctl enable slurmctld
# MUNGE 설정 [munge 키 파일을 생성하고 모든 노드에 동일하게 배포합니다.]
/usr/sbin/create-munge-key
chmod 400 /etc/munge/munge.key
chown munge:munge /etc/munge/munge.key
# 모든 노드에 munge.key를 복사한 후 munge 서비스를 시작합니다.
systemctl start munge
systemctl enable munge
컴퓨터 노드 구성 방법
# Slrum 패키지를 설치 합니다.
yum install -y epel-release
yum install -y slurm*
# 마스터 서버의 munge.key를 컴퓨터 노드에 복사한 후 데몬 시작하여야 합니다.
systemctl start munge
systemctl enable munge
# 마스터 서버의 slurm.conf 을 컴퓨터 노드에 복사한 후 데몬 시작하여야 합니다.
systemctl start slurmd
systemctl enable slurmd
노드 및 파티션 구성 방법
노드 추가
slurm.conf 파일에서 NodeName 항목에 새로운 노드를 추가하고, SLURM 서비스를 재시작하여 변경 사항을 반영합니다.
마스터에서 설정한 후 모든 노드는 동일한 slurm.conf을 가지고 데몬을 동작시켜야 합니다.
vi /etc/slurm/slurm.conf
# 예시
NodeName=node11 CPUs=16 RealMemory=64000 State=UNKNOWN
systemctl restart slurmctld
systemctl restart slurmd
파티션 추가
새로운 파티션을 추가하려면 slurm.conf 파일에서 PartitionName 항목을 정의합니다.
마스터에서 설정한 후 모든 노드는 동일한 slurm.conf을 가지고 데몬을 동작시켜야 합니다.
vi /etc/slurm/slurm.conf
# 예시
PartitionName=highmem Nodes=node[01-05] MaxTime=48:00:00 State=UP
systemctl restart slurmctld
4. SLURM의 자원 관리 및 스케줄링 원리
자원 요청 및 할당의 기본 개념
SLURM의 자원 관리 및 할당은 기본적으로 사용자가 요청한 자원을 기준으로 수행됩니다. 사용자는 작업을 제출할 때 필요한 CPU 코어 수, 메모리 용량, GPU, 시간 등의 요구 사항을 명시할 수 있습니다. SLURM은 이 요청을 기반으로 가용한 자원을 탐색하고, 적절한 컴퓨트 노드에 자원을 할당합니다.
- 작업(Job)
- 사용자가 SLURM에 제출한 연산 작업 단위로, 하나 이상의 태스크로 구성될 수 있습니다.
- 태스크(Task)
- 작업 내에서 개별적으로 수행되는 계산 단위입니다. 여러 CPU 또는 노드에 분산될 수 있습니다.
- 자원 요청 옵션
- SLURM의 sbatch와 srun 명령을 통해 자원을 요청할 때, -n (태스크 수), –mem (메모리 용량), -t (시간) 등의 옵션을 사용하여 요청할 자원을 지정합니다.
스케줄링 방식 및 알고리즘
SLURM은 다양한 스케줄링 알고리즘을 지원하며, 각 클러스터 환경에 맞게 선택하거나 조합하여 사용할 수 있습니다. 기본적으로 FCFS(First Come, First Served) 알고리즘을 사용하지만, 이외에도 우선순위 기반, 공정성을 고려한 알고리즘이 존재합니다.
- FCFS(First Come, First Served)
- 가장 일반적인 방식으로, 가장 먼저 제출된 작업부터 순서대로 스케줄링합니다. 자원이 사용 가능해질 때까지 기다리게 됩니다.
- Priority Scheduling
- 우선순위가 높은 작업을 먼저 할당합니다. 우선순위는 사용자가 설정한 우선순위 값, 작업 제출 시간, 사용자 또는 그룹별 가중치 등에 따라 결정됩니다.
- Backfill Scheduling
- 대기 중인 작업 중에서 작은 작업을 먼저 실행하여 자원을 최대한 활용하는 방식입니다. 대규모 작업으로 인해 빈 자원이 생길 경우, 대기열에 있는 작은 작업을 먼저 실행하여 자원을 효율적으로 사용할 수 있도록 합니다.
- Fairshare Scheduling
- 사용자나 그룹이 공평하게 자원을 사용할 수 있도록 하는 방식으로, 자원 사용 기록을 바탕으로 사용자가 균등하게 자원을 사용할 수 있도록 할당합니다.
파티션 설정 및 제약 조건
파티션은 SLURM 클러스터의 논리적 자원 그룹으로, 각 파티션은 별도의 자원 제약을 가질 수 있습니다. 파티션을 통해 특정 노드 그룹을 할당하거나, 작업이 수행될 노드를 지정할 수 있습니다.
- 파티션의 기본 설정
- SLURM 설정 파일(slurm.conf)에서 파티션을 정의할 수 있습니다. PartitionName을 통해 각 파티션을 명명하고, Nodes 옵션을 통해 파티션에 속한 노드를 지정합니다.
- 파티션 제약 조건
- 파티션별로 다양한 제약 조건을 설정할 수 있습니다. 예를 들어, MaxTime으로 작업의 최대 실행 시간을 제한하거나, Default 설정을 통해 기본 파티션을 지정할 수 있습니다.
파티션 종류
- Default 파티션
- 모든 작업이 기본적으로 할당되는 파티션입니다. 주로 default 속성을 지정하여 기본 파티션을 설정합니다.
- 전용 파티션
- 특정 사용자 또는 프로젝트에 할당된 파티션으로, 독립적으로 사용할 수 있습니다.
- 실험 파티션
- 실험적인 코드나 테스트 작업을 위한 파티션으로, 자원 제한이 설정될 수 있습니다.
작업 우선순위와 QoS(Quality of Service) 설정
SLURM에서는 QoS(Quality of Service)와 우선순위 설정을 통해 작업의 중요도와 서비스 품질을 정의하고 관리할 수 있습니다. QoS는 사용자의 작업이 대기열에서 가지는 우선순위를 높이거나 자원 사용에 제한을 두는 등의 기능을 제공합니다.
우선순위 계산 방식
- Age
- 작업 제출 후 경과 시간에 따라 점수가 올라가며, 오래 대기할수록 우선순위가 높아집니다.
- Fairshare
- 사용자 또는 그룹별 자원 할당 공정성을 위해 사용되는 점수로, 최근 자원 사용량이 적은 사용자의 작업이 우선될 수 있도록 합니다.
- Job Size
- 큰 자원을 요청한 작업에 점수를 부여하여 대규모 작업이 먼저 스케줄링될 수 있도록 합니다.
- Partition Priority
- 파티션별로 우선순위를 지정할 수 있으며, 특정 파티션에 높은 우선순위를 부여할 수 있습니다.
QoS 설정
QoS는 sacctmgr 명령어를 통해 설정할 수 있으며, 각 QoS에 대해 자원 사용량 제한, 우선순위, 최대 실행 시간 등의 제한을 부여할 수 있습니다.
예시로는 QoS: High, Normal, Low와 같은 QoS를 설정하고 각 QoS에 대해 우선순위를 부여하거나, 자원 제한을 설정하여 특정 사용자 그룹에 맞춘 자원 할당 정책을 구성할 수 있습니다.
참고 사항
QoS를 적절히 사용하면 특정 사용자나 작업에 대해 자원을 우선적으로 할당하거나, 자원 제한을 둘 수 있어 클러스터 자원의 효율적인 관리를 도울 수 있습니다.
sacctmgr 명령어는 SLURM 데이터베이스가 활성화되어 있어야 제대로 작동합니다. SLURM 클러스터가 slurmdbd 서비스를 사용 중인지 확인하세요.
QoS 설정 단계
SLURM 데이터베이스 활성화 (선택 사항) SLURM에서 QoS를 설정하려면 SLURM의 데이터베이스 기능이 활성화되어 있어야 합니다. slurmdbd 데몬이 활성화되어 있어야 하며, 이를 통해 작업의 우선순위 및 리소스 할당을 관리합니다.
systemctl start slurmdbd
systemctl enable slurmdbd
QoS 생성 sacctmgr 명령어를 사용하여 QoS를 생성할 수 있습니다. QoS는 특정 우선순위나 자원 제한을 정의하는 역할을 합니다.
sacctmgr add qos <QOS_NAME> Priority=<PRIORITY_VALUE> MaxWall=<MAX_TIME_LIMIT> MaxNodes=<MAX_NODES> MaxSubmitJobs=<MAX_JOBS>
- <QOS_NAME>
- 생성할 QoS의 이름입니다.
- Priority
- 작업에 할당할 우선순위 값입니다. 숫자가 높을수록 우선순위가 높습니다.
- MaxWall
- 각 작업에 대해 최대 실행 시간 제한을 설정합니다. (형식: hh:mm:ss)
- MaxNodes
- 한 작업이 사용할 수 있는 최대 노드 수를 설정합니다.
- MaxSubmitJobs
- 사용자가 제출할 수 있는 최대 작업 수를 설정합니다.
예를 들어, high_priority라는 QoS를 생성하고 우선순위를 100으로 설정하며, 최대 실행 시간을 2시간으로 제한하고, 최대 5개의 노드를 할당할 수 있는 QoS를 만들 수 있습니다.
sacctmgr add qos high_priority Priority=100 MaxWall=02:00:00 MaxNodes=5 MaxSubmitJobs=10
QoS 수정 및 조회 이미 생성된 QoS를 수정하려면 sacctmgr modify qos 명령어를 사용하고, QoS의 설정을 조회하려면 sacctmgr show qos 명령어를 사용합니다.
# QoS 수정
sacctmgr modify qos <QOS_NAME> set Priority=<NEW_PRIORITY> MaxWall=<NEW_MAX_TIME>
# QoS 조
sacctmgr show qos
사용자/그룹에 QoS 할당 QoS는 특정 사용자나 그룹에 할당하여 우선순위를 관리할 수 있습니다. sacctmgr 명령어를 사용하여 사용자가 사용할 수 있는 QoS를 설정할 수 있습니다.
sacctmgr modify user <USER_NAME> set qos=<QOS_NAME>
# 또는 특정 그룹에 QoS를 할당하려면 아래와 같습니다.
sacctmgr modify account <ACCOUNT_NAME> set qos=<QOS_NAME>
# 예를 들어, user1에게 high_priority QoS를 할당하려면와 같습니다.
sacctmgr modify user user1 set qos=high_priority
# QoS 적용 확인 사용자가 제출한 작업에 QoS가 정상적으로 적용되었는지 확인하려면 squeue 명령어를 사용하여 대기 중인 작업의 QoS를 확인할 수 있습니다.
squeue -u <USER_NAME>
QoS 설정 예시
# QoS 생성 high_priority라는 QoS를 생성하고, 우선순위는 100, 최대 실행 시간은 3시간, 최대 노드는 4개로 설정합니다.
sacctmgr add qos high_priority Priority=100 MaxWall=03:00:00 MaxNodes=4
# 사용자에게 QoS 할당 user1에게 high_priority QoS를 할당합니다.
sacctmgr modify user user1 set qos=high_priority
# QoS 수정 high_priority QoS의 최대 노드 수를 6개로 변경합니다.
sacctmgr modify qos high_priority set MaxNodes=6
# QoS 조회 생성된 QoS 정보를 조회하여 적용된 내용을 확인합니다.
sacctmgr show qos
5. SLURM 작업 관리
작업 제출 및 취소 (sbatch, srun, scancel 등)
sbatch (배치 작업 제출)
sbatch는 SLURM 클러스터에 배치 작업을 제출하는 데 사용됩니다. 사용자는 작업을 실행할 스크립트를 작성하고 이를 sbatch 명령어로 제출합니다.
# job_script.sh라는 스크립트를 제출하는 명령어
sbatch job_script.sh
sbatch 스크립트 예시
- –job-name
- 작업 이름을 지정합니다.
- –ntasks
- 요청할 태스크 수를 지정합니다 (CPU 코어 수).
- –time
- 최대 실행 시간을 지정합니다.
- –mem
- 요청할 메모리 용량을 지정합니다.
#!/bin/bash
#SBATCH --job-name=my_job
#SBATCH --ntasks=4
#SBATCH --time=02:00:00
#SBATCH --mem=8GB
srun my_program
자주 사용되는 옵션
옵션 | 설명 |
–job-name | 작업 이름을 지정합니다. 예를 들어, –job-name=my_job처럼 사용하여 작업을 구별할 수 있습니다. |
–ntasks | 요청할 태스크(프로세스)의 수를 지정합니다. 예를 들어, –ntasks=4는 4개의 프로세스를 요청합니다. |
–ntasks-per-node | 각 노드에서 실행할 태스크의 수를 지정합니다. 예: –ntasks-per-node=2는 각 노드에서 2개의 태스크 실행. |
–TIME | 작업의 최대 실행 시간을 설정합니다. 예를 들어, –time=02:00:00은 최대 2시간 동안 작업을 실행하도록 설정합니다. |
–mem | 작업에 할당할 메모리 용량을 지정합니다. 예: –mem=8GB는 8GB의 메모리를 요청합니다. |
–cpus-per-task | 각 태스크당 할당할 CPU 코어 수를 지정합니다. 예: –cpus-per-task=2는 각 태스크에 2개의 코어를 할당합니다. |
–output | 표준 출력 결과를 저장할 파일을 지정합니다. 예: –output=job_output.txt는 출력 파일을 설정합니다. |
–error | 표준 에러 결과를 저장할 파일을 지정합니다. 예: –error=job_error.txt는 에러 파일을 설정합니다. |
–partition | 작업을 실행할 파티션(슬롯)을 지정합니다. 예: –partition=general는 general 파티션에서 실행하도록 설정합니다. |
–gres | GPU 리소스를 요청할 때 사용합니다. 예: –gres=gpu:2는 2개의 GPU를 요청합니다. |
–nodes | 작업에 사용할 노드 수를 지정합니다. 예: –nodes=2는 2개의 노드를 요청합니다. |
–exclude | 특정 노드를 제외하고 작업을 실행할 때 사용합니다. 예: –exclude=node01,node02는 해당 노드를 제외합니다. |
–array | 작업 배열을 생성하여 여러 작업을 한 번에 제출합니다. 예: –array=1-10은 1부터 10까지 작업을 각각 실행합니다. |
–mail-type | 작업 상태에 따른 이메일 알림을 설정합니다. 예: –mail-type=END는 작업이 끝났을 때 이메일을 보냅니다. |
–mail-user | 이메일 알림을 받을 이메일 주소를 지정합니다. 예: –mail-user=user@example.com은 해당 이메일로 알림을 보냅니다. |
–dependency | 작업 간의 의존성을 설정합니다. 예: –dependency=afterok:1234는 작업 ID 1234가 성공적으로 완료된 후에 실행됩니다. |
–account | SLURM에서 작업에 할당할 계정 이름을 지정합니다. 예: –account=project123는 project123 계정을 사용합니다. |
–priority | 작업 우선 순위를 설정합니다. 예: –priority=100은 우선 순위를 100으로 설정합니다. |
srun 작업 실행 (단일 작업 또는 Job Step)
srun은 SLURM에서 태스크를 실행하는 명령어로, sbatch와 결합하여 배치 작업 내에서 실행할 명령을 지정할 수 있습니다.
srun은 실시간으로 작업을 실행하거나 작업의 일부로 사용될 수 있습니다. 예를 들어, 배치 스크립트 내에서 여러 개의 병렬 작업을 실행할 때 사용됩니다.
srun 사용 예시
# 4개의 태스크를 병렬로 실행하여 my_program을 실행합니다.
srun -n 4 my_program
scancel(작업 취소)
scancel 명령어는 SLURM에서 실행 중인 작업을 취소하는 데 사용됩니다. 이 명령은 특정 작업을 중지하거나, 실행 중인 작업을 강제로 종료시킬 수 있습니다.
scancel 사용 예시
# <job_id>는 취소할 작업의 ID입니다. 작업 ID는 squeue 명령으로 확인할 수 있습니다.
scancel <job_id>
특정 사용자의 모든 작업을 취소 할 경우는 아래와 같이 -u 옵션을 하용하고 계정의 명을 입력해주면 됩니다.
scancel -u <username>
작업 모니터링 (squeue, sacct, scontrol)
squeue(작업 대기열 및 상태 확인)
squeue는 SLURM 클러스터에서 실행 중이거나 대기 중인 작업들을 조회하는 명령어입니다. 이를 통해 현재 클러스터의 작업 상태를 실시간으로 모니터링할 수 있습니다.
squeue
squeue의 출력 결과
- JOBID
- 작업 ID
- PARTITION
- 작업이 제출된 파티션
- NAME
- 작업 이름
- USER
- 작업을 제출한 사용자
- STATE
- 작업의 현재 상태 (대기 중, 실행 중 등)
- TIME
- 작업이 실행된 시간 또는 대기 시간
sacct(완료된 작업 정보 조회)
sacct는 완료된 작업의 상세 정보를 조회하는 명령어입니다. sacct는 작업이 완료되었거나 실패한 후의 상태를 확인하는 데 유용합니다.
sacct 사용 예시
# 예시
sacct -j <job_id>
# -j 옵션은 특정 작업 ID의 작업 상태를 조회합니다.
# -o 옵션을 사용하여 출력 형식을 사용자 지정할 수 있습니다.
sacct -j <job_id> -o JobID,State,Elapsed,AllocCPUs
Job Step과 Task 분할 관리
SLURM에서는 작업(Job)을 여러 개의 **태스크(Task)**로 분할하여 실행할 수 있습니다. 각 태스크는 별도의 CPU 코어에서 병렬로 실행될 수 있습니다.
Job Step은 srun을 통해 실행되는 작업의 단위로, 하나의 작업 내에서 여러 단위의 실행을 분할하는 방식입니다.
분할 사용 예시
sbatch --ntasks=4 my_script.sh
# my_script.sh 내에서 srun을 사용하여 4개의 태스크를 실행할 수 있습니다.
#SBATCH --ntasks=4
srun my_program
작업 예약 및 예약 정책
SLURM에서는 특정 시간대나 자원이 부족할 때 작업을 예약하고 실행할 수 있도록 예약 시스템을 지원합니다.
예약은 사용자가 지정한 시간에 작업을 실행하도록 예약하는 기능입니다.
sbatch 명령을 사용할 때, 특정 시간을 예약하여 작업을 실행할 수 있습니다. –begin 옵션을 사용하여 예약을 설정할 수 있습니다.
작업예약 및 예약 정책 사용 예시
예약은 SLURM의 scontrol 명령을 통해 생성하거나 관리할 수 있습니다.
# 2024년 11월 16일 09:00에 my_script.sh를 실행하도록 예약합니다.
sbatch --begin=2024-11-16T09:00:00 my_script.sh
고급 기능 및 확장성
계층형 스케줄링 및 사용자 정의 스케줄링
계층형 스케줄링
계층형 스케줄링을 통해 다양한 자원 요구 사항에 맞춰 효율적으로 작업을 스케줄링할 수 있습니다. 이 기능은 특히 다양한 작업과 사용자가 동시에 자원을 요구하는 환경에서 중요합니다.
- 우선순위 기반 스케줄링: 여러 작업이 제출되면, SLURM은 각 작업에 우선순위를 부여하여 가장 중요한 작업을 먼저 실행하도록 합니다. 우선순위는 사용자가 제출한 작업의 특성(예: QoS, 배정된 자원, 실행 대기 시간 등)에 따라 결정됩니다.
- 파티션 기반 스케줄링: SLURM은 여러 개의 파티션(서버 그룹)을 정의하여 각 파티션에 대해 다른 스케줄링 정책을 설정할 수 있습니다. 예를 들어, GPU가 장착된 파티션은 GPU 자원을 효율적으로 관리할 수 있도록 별도의 정책을 적용할 수 있습니다.
- 공정한 자원 분배: SLURM은 Fair-share 스케줄링을 사용하여, 시스템 자원이 여러 사용자가 공유할 경우, 자원을 공평하게 분배하도록 할 수 있습니다. 특정 사용자가 자원을 더 많이 사용하면, 이후 작업의 우선순위가 낮아지도록 설정할 수 있습니다.
사용자 정의 스케줄링
SLURM은 사용자 정의 스케줄링을 지원하여, 관리자가 특정 스케줄링 알고리즘이나 전략을 사용자가 직접 설정할 수 있도록 합니다. 예를 들어, 사용자는 특정 자원을 우선할 수 있도록 스케줄링 규칙을 작성하거나, 독특한 요구 사항에 맞춰 작업을 제출하도록 구성할 수 있습니다.
사용자 정의 스케줄링 설정은 slurm.conf 파일에서 관리할 수 있으며, 추가적인 모듈이나 플러그인을 통해 더욱 세밀한 자원 관리와 스케줄링 전략을 구현할 수 있습니다.
멀티클러스터 지원 및 하이브리드 클러스터 구축
SLURM은 여러 클러스터를 연결하거나 하이브리드 환경에서 작업을 처리할 수 있는 멀티클러스터 지원 기능을 제공합니다. 이는 대규모 시스템에서 중요한 역할을 하며, 여러 지역에 분산된 자원들을 통합적으로 관리할 수 있게 합니다.
멀티클러스터 지원
SLURM의 멀티클러스터 기능을 통해 여러 물리적 또는 가상 클러스터를 하나의 SLURM 관리 시스템으로 통합할 수 있습니다. 이를 통해 여러 클러스터에서 실행되는 작업을 관리하고 자원을 할당할 수 있습니다.
- 연결된 클러스터 간 작업 제출: 사용자나 관리자는 여러 클러스터에 분산되어 있는 자원들을 단일 시스템처럼 사용할 수 있습니다. 이는 예를 들어, 다른 지역에 위치한 두 클러스터의 자원을 통합해 사용할 수 있음을 의미합니다.
- 하이브리드 클러스터: SLURM은 하이브리드 클러스터를 지원하는데, 이는 온프레미스 클러스터와 클라우드 환경을 혼합하여 관리할 수 있는 기능입니다. 예를 들어, 온프레미스 HPC 클러스터와 AWS, Azure와 같은 클라우드 리소스를 결합하여 자원을 최적화할 수 있습니다.
- 파티션을 통해 클러스터 연결: 멀티클러스터 환경에서는 각 클러스터를 파티션으로 정의하고, SLURM이 해당 파티션을 통해 자원을 관리합니다. 이를 통해 작업이 제출되면 SLURM은 최적의 클러스터에서 작업을 실행하게 됩니다.
고급 기능
- srun을 이용한 멀티클러스터 작업 실행: srun 명령어를 사용하여 여러 클러스터에 걸쳐 작업을 실행할 수 있습니다. 작업이 여러 클러스터에 분산되어 실행되며, SLURM은 이를 자동으로 관리하고 조정합니다.
- 자원 통합 관리: 여러 클러스터가 연결되면 각 클러스터에서 제공하는 자원(CPU, 메모리, GPU 등)을 하나의 통합된 시스템처럼 관리할 수 있습니다. SLURM은 이를 효율적으로 분배하고 최적화합니다.
GPU, 메모리 및 기타 자원 관리
SLURM은 GPU, 메모리, 그리고 기타 특수 자원의 할당 및 관리를 지원합니다. 다양한 하드웨어 자원을 효율적으로 관리하기 위해 SLURM은 고급 자원 관리 기능을 제공합니다.
GPU 자원 관리
SLURM은 GPU 자원을 지원하고, GPU 자원의 할당을 세밀하게 조정할 수 있는 기능을 제공합니다. 여러 종류의 GPU를 가진 시스템에서 각 작업에 적합한 GPU를 자동으로 할당하거나, 사용자가 명시적으로 GPU를 요청할 수 있습니다.
# 2개의 GPU를 요청하려면 아래와 같이 사용할 수 있습니다.
# --gres=gpu:2는 작업에 2개의 GPU를 할당하는 명령어입니다.
sbatch --gres=gpu:2 my_script.sh
GPU 종류 명시
여러 종류의 GPU가 있는 시스템에서는 특정 종류의 GPU를 선택하여 요청할 수도 있습니다.
sbatch --gres=gpu:v100:2 my_script.sh
메모리 자원 관리
SLURM은 메모리 자원도 관리할 수 있으며, 작업에 필요한 메모리 용량을 요청할 수 있습니다.
메모리 사용 요청 예시
메모리 제한 설정: –mem 옵션은 작업이 사용할 수 있는 최대 메모리 양을 제한하는 데 사용됩니다.
# 16GB의 메모리를 요청하는 예시입니다.
# --mem 옵션을 사용하여 작업에 필요한 메모리를 지정할 수 있습니다.
sbatch --mem=16GB my_script.sh
기타 자원
SLURM은 CPU, 네트워크 대역폭, 특수 장비 등 다양한 자원을 관리할 수 있습니다.
예를 들어, 네트워크 대역폭을 요구하는 작업이나, 특정 하드웨어 장치를 사용하는 작업에 대한 자원 관리도 가능합니다.
SLURM과 통합된 모니터링 및 로깅 시스템
모니터링 도구 및 로그 관리
sinfo
클러스터 상태를 요약하여 노드의 가용 상태, 파티션 구성, 현재 작업 상태 등을 볼 수 있습니다.
sinfo
# 출력 예
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
batch up infinite 10 idle node[01-10]
squeue
대기 중인 작업, 실행 중인 작업, 작업 상태를 출력합니다.
squeue
# 출력 예
JOBID PARTITION NAME USER ST TIME NODES NODELIST
101 batch my_job user1 R 1:30 1 node01
102 batch another user2 PD 1 (null)
scontrol
scontrol: SLURM의 설정 및 상태를 제어하거나 세부 정보를 조회합니다.
scontrol show nodes
# 출력 예시
NodeName=node01 Arch=x86_64 CoresPerSocket=8
CPUAlloc=0 CPUErr=0 CPUTot=16 CPULoad=0.01
AvailableFeatures=gpu,highmem
ActiveFeatures=gpu
Gres=gpu:2
NodeAddr=node01 NodeHostName=node01
RealMemory=64000 AllocMem=0 FreeMem=63500 Sockets=2 Boards=1
State=IDLE ThreadsPerCore=1 TmpDisk=50000 Weight=1
BootTime=2024-11-16T12:00:00 SlurmdStartTime=2024-11-16T12:05:00
Reason=None
NodeName=node02 Arch=x86_64 CoresPerSocket=8
CPUAlloc=4 CPUErr=0 CPUTot=16 CPULoad=0.25
AvailableFeatures=gpu,standard
ActiveFeatures=gpu
Gres=gpu:1
NodeAddr=node02 NodeHostName=node02
RealMemory=32000 AllocMem=12000 FreeMem=20000 Sockets=2 Boards=1
State=ALLOCATED ThreadsPerCore=1 TmpDisk=25000 Weight=1
BootTime=2024-11-16T11:45:00 SlurmdStartTime=2024-11-16T11:50:00
Reason=None
- NodeName: 노드 이름.
- Arch: 아키텍처 (예: x86_64).
- CoresPerSocket, Sockets: 각 소켓의 코어 수와 소켓 개수.
- CPUAlloc, CPUTot, CPULoad:
- CPUAlloc: 현재 할당된 CPU 개수.
- CPUTot: 총 CPU 개수.
- CPULoad: CPU 로드 평균.
- AvailableFeatures, ActiveFeatures: 노드의 특징 및 활성화된 특징.
- Gres: 일반 자원(예: GPU 개수).
- NodeAddr, NodeHostName: 노드의 IP 주소 및 호스트 이름.
- RealMemory, AllocMem, FreeMem:
- RealMemory: 총 메모리(MB).
- AllocMem: 할당된 메모리(MB).
- FreeMem: 사용 가능한 메모리(MB).
- State: 노드 상태 (예: IDLE, ALLOCATED, DOWN 등).
- TmpDisk: 사용 가능한 임시 디스크 공간(MB).
- BootTime, SlurmdStartTime: 부팅 시간 및 SLURM 데몬 시작 시간.
- Reason: 노드가 DOWN 또는 DRAIN 상태인 경우 이유.
성능 분석 도구
sacct
완료된 작업에 대한 상세 정보를 제공합니다.
자원 사용량(CPU 시간, 메모리, GPU)과 작업 상태를 확인할 수 있습니다.
# 실행 예시
sacct --format=JobID,JobName,Elapsed,CPUTime,MaxRSS,State
sstat
실행 중인 작업의 실시간 자원 사용량을 확인합니다.
# 실행 예시
sstat --job=<JOBID>
장애 관리 및 복구 절차
컴퓨트 노드 장애
컴퓨트 노드가 다운되거나 응답하지 않는 경우 scontrol을 사용해 노드를 비활성화하고 복구 후 재활성화합니다.
scontrol update NodeName=<NODE_NAME> State=DOWN
scontrol update NodeName=<NODE_NAME> State=RESUME
8. SLURM 보안 및 접근 제어
접근 제어 리스트(ACL) 및 사용자 권한 관리
slurm.conf ACL 설정
파티션별로 접근 제어 리스트(ACL)를 정의하여 특정 사용자 또는 그룹에 대한 접근 권한을 제한할 수 있습니다.
- AllowGroups: 파티션을 사용할 수 있는 그룹.
- AllowAccounts: 특정 계정(Account)만 작업 제출 가능.
PartitionName=batch Nodes=node[01-10] Default=YES MaxTime=1-00:00:00 State=UP AllowGroups=users,admins AllowAccounts=project1
# 특정 그룹(admins)과 사용자 계정(project1)만 batch 파티션에 접근할 수 있도록 설정
PartitionName=batch Nodes=node[01-10] AllowGroups=admins AllowAccounts=project1
작업 및 사용자 제한
SLURM에서는 사용자당 또는 작업당 자원 제한을 설정하여 클러스터의 자원 남용을 방지할 수 있습니다.
# MaxJobsPerUser: 한 사용자가 동시에 제출할 수 있는 최대 작업 수를 제한.
MaxJobsPerUser=50
# MaxSubmitJobsPerAccount: 특정 계정에서 동시에 제출할 수 있는 최대 작업 수를 제한.
MaxSubmitJobsPerAccount=100
# MaxMemPerNode: 한 작업이 노드에서 사용할 수 있는 최대 메모리(MB).
MaxMemPerNode=64000
보안 정책 및 암호화 설정
MUNGE 인증
SLURM은 노드 간 통신에서 MUNGE(Message Passing Interface) 인증을 사용합니다. MUNGE는 인증된 사용자가 SLURM 작업을 제출하고 자원을 사용할 수 있도록 보장합니다.
# MUNGE 키 생성: 마스터 노드에서 인증 키를 생성합니다.
/usr/sbin/create-munge-key
# MUNGE 키 배포: 생성된 /etc/munge/munge.key 파일을 클러스터 내 모든 노드에 복사합니다.
scp /etc/munge/munge.key node01:/etc/munge/
# MUNGE 서비스 시작: 모든 노드에서 MUNGE 데몬을 실행합니다.
systemctl start munge
systemctl enable munge
통신 암호화
SLURM은 데이터 전송 시 암호화를 지원합니다. 이를 통해 노드 간 통신을 안전하게 유지할 수 있습니다.
# 암호화 설정: SLURM 통신에 사용하는 암호화 수준은 slurm.conf의 AuthType 파라미터로 제어됩니다.
AuthType=auth/munge
네트워크 보안
SLURM은 네트워크를 통해 작업 데이터를 전송하므로 네트워크 보안은 필수입니다.
# 포트 구성을 slurm.conf에서 통신 포트를 설정합니다.
SlurmdPort=6818
SlurmctldPort=6817
# firewall 방화벽 규칙 설정
firewall-cmd --permanent --add-port=6817-6819/tcp
firewall-cmd --reload
# iptables 방화벽 규칙 설정
iptables -A INPUT -p tcp --dport 6817 -s <controller_ip> -j ACCEPT
iptables -A INPUT -p tcp --dport 6818 -s <compute_nodes_range> -j ACCEPT
systemctl restart iptables
Slrum High Availability(HA)
High Availability(HA)는 시스템, 서비스, 또는 애플리케이션이 최소한의 다운타임으로 지속적으로 작동하도록 보장하는 기술과 설계 방법을 의미합니다. 고가용성은 특히 서버, 데이터 센터, 클러스터 환경에서 중요하며, 사용자나 서비스 요구에 따라 항상 안정적이고 중단 없이 작동해야 하는 경우에 활용됩니다.
Slrum HA 구성 요소
Primary Controller: 기본적으로 SLURM 클러스터를 관리하는 마스터 노드.
Backup Controller: Primary Controller 장애 시 대체 역할을 수행하는 노드.
SLURM HA 구성의 장점
- 높은 가용성
- 마스터 노드 장애 시에도 클러스터가 지속적으로 작동.
- 장애 복구 속도
- 자동으로 역할을 전환하여 다운타임 최소화.
- 확장성
- 추가적으로 다중 노드를 구성하여 더 높은 안정성을 구현 가능.
SLURM HA 설정 단계
slurm.conf 파일 수정
slurm.conf 파일에서 Primary와 Backup 마스터 노드를 정의합니다.
SlurmctldHost=primary-master
SlurmctldHost=backup-master
SlurmctldPort=6817
SlurmdPort=6818
AuthType=auth/munge
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd
- SlurmctldHost: Primary와 Backup 노드의 호스트 이름을 지정합니다.
- StateSaveLocation: 마스터 노드가 상태 데이터를 저장하는 디렉터리.
- AuthType: MUNGE를 사용하여 인증을 설정.
상태 데이터 동기화
Primary와 Backup 마스터 노드 간에 SLURM 상태 데이터를 동기화해야 합니다.
StateSaveLocation 디렉터리를 NFS(Network File System) 또는 다른 공유 파일 시스템을 통해 공유합니다.
# 예시
mkdir -p /var/spool/slurmctld
chown slurm:slurm /var/spool/slurmctld
# 파일 동기화 (대안): rsync 명령어를 사용해 정기적으로 데이터를 동기화.
rsync -avz /var/spool/slurmctld/ backup-master:/var/spool/slurmctld/
MUNGE 키 동기화
Primary와 Backup 마스터 노드에서 동일한 MUNGE 키를 사용해야 합니다.
# MUNGE 키 파일 생성(Primary에서)
/usr/sbin/create-munge-key
# MUNGE 키 파일 복사
scp /etc/munge/munge.key backup-master:/etc/munge/
# MUNGE 서비스 활성화
systemctl start munge
systemctl enable munge
SLURM 서비스 설정
Primary와 Backup 노드에서 SLURM 서비스를 활성화합니다.
# SLURM 데몬 시작(Primary와 Backup 모두)
systemctl start slurmctld
systemctl enable slurmctld
동작 원리
- Primary Controller가 정상적으로 작동할 경우, Backup Controller는 대기 상태입니다.
- Primary Controller가 장애를 일으키면 Backup Controller가 자동으로 SLURM 컨트롤러 역할을 시작합니다.
- 장애 복구 후 Primary Controller가 복원되면 수동으로 역할을 전환하거나 유지할 수 있습니다.
SLURM HA 구성 시 고려 사항
- 상태 데이터의 신뢰성
- Primary와 Backup 간의 상태 데이터는 항상 동기화 상태여야 합니다.
- NFS를 사용하는 것이 가장 일반적이며, 데이터 손실을 방지하기 위해 신뢰할 수 있는 파일 시스템을 선택합니다.
- 네트워크 안정성
- Primary와 Backup 간 통신이 원활해야 합니다.
방화벽에서 SLURM 포트를 허용해야 합니다(예: 6817, 6818).
- Primary와 Backup 간 통신이 원활해야 합니다.
- 모니터링
- Primary와 Backup 노드의 상태를 지속적으로 모니터링합니다.
장애 발생 시 빠르게 확인하고 대처할 수 있도록 로그 시스템을 설정합니다.
- Primary와 Backup 노드의 상태를 지속적으로 모니터링합니다.
SLURM 최신 버전 기능과 미래 전망
SLURM 업데이트 내용
- TRES 예약 기능
- 특정 자원(예: GPU, CPU)의 예약을 TRES(Trackable RESource) 기준으로 수행할 수 있습니다.
- scontrol create reservation=test start=now duration=5 tres=gres/gpu=1를 통해 GPU와 CPU를 특정 작업에 예약 가능.
- QOS 관련 업데이트
- 새로운 QOS 제한으로 MaxTRESRunMinsPerAccount 및 MaxTRESRunMinsPerUser 설정이 추가되었습니다.
- 상대적인 QOS 리소스 할당 제한을 클러스터의 총 자원이나 특정 파티션 기준으로 지정 가능.
- 향상된 HA 기능
- 백업 컨트롤러에서 더 엄격한 상태 저장소 확인을 통해 장애 발생 시 과도한 failover를 방지.
- heartbeat 파일을 활용하여 백업 컨트롤러의 활성화를 제어함으로써 잘못된 상태로의 failover를 방지.
- 새로운 인증 플러그인
- auth/slurm 및 cred/slurm 플러그인을 통해 MUNGE를 대체할 수 있는 인증 및 자격 증명 시스템 제공.
- SHA-256 HMAC 기반 인증 방식을 사용하여 보안 강화.
- LDAP-less 클러스터 제어
- LDAP 없이 SLURM을 운영 가능하며, 로그인 노드에서 UID, GID 등의 정보를 안전하게 전달하도록 지원.
- scontrol 개선
- scontrol reconfigure 명령어가 이제 더 많은 구성 변경 사항을 반영하도록 업데이트되었습니다.
- 플러그인이나 노드 이름 변경 시에도 프로세스를 재시작하지 않고 적용 가능.
- GPU 및 MPI 지원 개선
- GPU 작업 예약의 유연성이 강화되었으며, 새로운 MPI 스택과의 통합이 개선되었습니다.
- MPI 관련 플래그와 환경 변수 설정이 자동화되어 MPI 기반 작업 수행이 간소화.
- 슬럼 REST API 개선
- OpenAPI 플러그인의 대규모 리팩토링으로 JSON/YAML 출력 옵션이 강화되었습니다.
- 명령줄 도구가 특정 OpenAPI 스키마 버전을 명시적으로 사용할 수 있게 됨.
- Debian/Ubuntu 패키징 지원
- SLURM이 이제 Debian 및 Ubuntu용 패키징 도구를 제공합니다.
- 새로운 패키지는 RPM 레이아웃과 유사하게 구성되어 설치와 관리가 간편.
SLURM의 향후 발전 가능성과 트렌드
SLURM은 HPC 환경뿐만 아니라 AI, ML과 같은 데이터 집약적 작업 환경에서도 중요한 역할을 하고 있습니다.
향후 발전 방향은 다음과 같습니다
- 멀티클러스터 관리의 확장
- 여러 클러스터를 단일 환경에서 통합 관리할 수 있는 기능 강화.
- 컨테이너 및 클라우드 통합
- SLURM이 컨테이너화된 워크로드(Docker, Singularity) 및 하이브리드 클라우드 환경을 보다 효과적으로 지원하도록 발전.
- QoS 및 자원 추적 강화
- 세분화된 QoS와 자원 할당 제한 기능이 발전하여 사용자 중심의 클러스터 운영이 가능.
- AI 및 머신러닝 워크로드 지원 강화
- GPU 예약 및 스케줄링이 더욱 유연해지고, AI 관련 작업에 최적화된 알고리즘 추가 가능성이 높음.
- 보안 강화
- MUNGE를 대체할 수 있는 인증 방식을 더 발전시키고, 데이터 암호화와 네트워크 보안 강화.