---
title: SLURM调度器（一）-官方技术文章-鲲鹏社区
description: SLURM调度器介绍
keywords: SLURM,官方技术文章,鲲鹏社区,调度器介绍,概述,结构,二,安装
url: https://www.hikunpeng.com/developer/techArticles/20251103-1?envFlag=1
section: (其他)
---

# SLURM调度器（一）-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20251103-1?envFlag=1
描述: SLURM调度器介绍
关键词: SLURM,官方技术文章,鲲鹏社区,调度器介绍,概述,结构,二,安装

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

SLURM调度器（一）

SLURM调度器（一）

高性能计算

发表于 2025/11/03

0

# 一、调度器介绍

## 1、概述

Slurm（Simple Linux Utility for Resource Management） 是一个开源、容错且高度可扩展的集群管理和作业调度系统，适用于大型和小型 Linux 集群。Slurm 的运行无需修改内核，并且相对独立。作为集群工作负载管理器，Slurm具有三个关键功能。首先，它会在一段时间内为用户分配对资源（计算节点）的独占和/或非独占访问权限，以便用户执行工作。其次，它提供了一个框架，用于在分配的节点集合上启动、执行工作（通常是并行作业）。最后，它通过管理待处理工作队列来仲裁资源争用。

## 2、结构

Slurm 由运行在每个计算节点上的slurmd守护进程和运行在管理节点（可选故障转移孪生）上的中央slurmctld守护进程组成。slurmd守护进程提供容错的分层通信。用户命令包括：sacct、sacctmgr、salloc、 sattach、sbatch、sbcast、scancel、scontrol、 scrontab、sdiag、sh5util 、 sinfo、sprio、 squeue 、sreport 、srun、sshare、sstat、strigger和 sview 。所有命令均可在集群中的任何位置运行。

这些 Slurm 守护进程管理的实体包括节点（ Slurm 中的计算资源）、分区（将节点分组为逻辑集（可能重叠））、作业（在指定时间内分配给用户的资源分配）和 作业步骤（作业内的一组（可能是并行的）任务）。分区可以被视为作业队列，每个队列都有各种约束，例如作业大小限制、作业时间限制、允许使用的用户等。优先级排序的作业被分配到分区内的节点，直到该分区内的资源（节点、处理器、内存等）耗尽。一旦为作业分配了一组节点，用户就可以在分配中的任何配置中以作业步骤的形式启动并行工作。例如，可以启动一个利用分配给该作业的所有节点的作业步骤，或者几个作业步骤可以独立使用一部分分配。

# 二、SLURM安装

## 1、软件安装

| 项目 | 版本 | 下载地址 |
| --- | --- | ---|
| Slurm | 22.05.03 | https://www.schedmd.com/downloads.php |
| munge | 0.5.13 | https://github.com/dun/munge/releases/tag/munge-0.5.13 |

### （1）基础配置

步骤1修改所有节点/etc/hosts文件，添加所有节点IP与主机映射。

步骤2所有节点的防火墙。

```
1:查看防火状态

systemctl status firewalld

service  iptables status

2:暂时防火墙

systemctl stop firewalld

*service  iptables stop*

3:永久防火墙

systemctl disable firewalld

*chkconfig iptables off*

4:重启防火墙

systemctl enable firewalld

service iptables restart
```

步骤3时间同步

munge要求各个节点时间误差在5min内，可以使用ntf实现时间同步，也可手动设置各个机器时间，保证时间相差在5min以内。

### （2）munge编译安装

#### 依赖库安装

分别在master、testnode1、testnode2节点以root用户登录服务器，执行以下命令安装依赖库。

注：具体以自己实际集群的节点为准，此处仅以三个节点举例。

yum install -y rpm-build rpmdevtools bzip2-devel openssl-devel zlib-devel readline-devel pam-devel perl-DBI perl-ExtUtils-MakeMaker mariadb*

#### 编译munge

将获取到的munge源码包上传至服务器某目录（建议为共享目录），例如/home/sf。

步骤1：分别在master、testnode1、testnode2节点执行以下命令，以构建munge的rpm包。

```
cd /home/sf
rpmbuild -tb --clean munge-0.5.13.tar.xz
```

步骤2：分别在master、testnode1、testnode2节点执行以下命令检查是否成功生成rpm包。

```
ls /root/rpmbuild/RPMS/aarch64/ | grep munge
```

#### 安装munge

步骤1：分别在master、testnode1、testnode2节点执行以下命令安装munge。

```
cd /root/rpmbuild/RPMS/aarch64/
yum install -y munge*
```

步骤2：执行以下命令修改master、testnode1和testnode2节点相应munge目录的权限。

```
chmod -Rf 700 /etc/munge
chmod -Rf 711 /var/lib/munge
chmod -Rf 700 /var/log/munge
chmod -Rf 755 /var/run/munge
```

步骤3：在master节点上，将master节点的“/etc/munge/munge.key”拷贝到testnode1和testnode2节点。

```
scp /etc/munge/munge.key testnode1:/etc/munge/
scp /etc/munge/munge.key testnode2:/etc/munge/
```

步骤4：在testnode1和testnode2节点上，更改“/etc/munge/munge.key”文件的权限。

```
chown munge.munge /etc/munge/munge.key
```

步骤5：在master、testnode1和testnode2节点上启动munge。

```
systemctl start munge
systemctl enable munge
```

### （3）slurm编译安装

#### 编译slurm

将获取到的slurm源码包上传至服务器某目录（建议为共享目录），例如/home/sf。

步骤1：分别在master、testnode1、testnode2节点执行以下命令执行以下命令构建Slurm的rpm包。

```
cd /home/sf
rpmbuild -ta --clean slurm-22.05.03.tar.bz2
```

步骤2：分别在master、testnode1、testnode2节点执行以下命令检查是否成功生成rpm包。

```
ls /root/rpmbuild/RPMS/aarch64/ | grep slurm
```

#### 安装Slurm

步骤1：分别在master、testnode1、testnode2节点执行以下命令安装slurm。

```
cd /root/rpmbuild/RPMS/aarch64/
yum install -y slurm*
```

步骤2：检查所有节点系统中是否已经创建slurm用户。

如果已经创建，则执行以下命令：

```
grep "slurm" /etc/group

slurm:x:202:
```

如果没有创建，则执行以下命令在master、testnode1和testnode2节点上创建slurm用户，需确保所有节点的gid和uid相同。

```
groupadd -g 202 slurm
useradd -u 202 -g 202 slurm
```

步骤3：执行以下命令在master、testnode1和testnode2节点下创建“/var/spool/slurm/ssl”目录、“/var/spool/slurm/d”目录和“/var/log/slurm”目录。

```
mkdir -p /var/spool/slurm/ssl
mkdir -p /var/spool/slurm/d
mkdir -p /var/log/slurm
```

步骤4：执行以下命令在master、testnode1和testnode2节点上设置相应目录权限。

```
chown -R slurm.slurm /var/spool/slurm
```

步骤5：执行以下命令修改matser节点上的“/etc/slurm/slurm.conf”文件。

```
vi  /etc/slurm/slurm.conf
```

步骤6：执行以下命令在master节点上，将master节点的“/etc/slurm/slurm.conf”拷贝到testnode1和testnode2节点，确保所有节点的slurm.conf内容是相同的。

```
scp  /etc/slurm/slurm.conf testnode1:/etc/slurm
scp  /etc/slurm/slurm.conf testnode2:/etc/slurm
```

步骤7：执行以下命令在master节点启动“slurmctld”服务。

```
systemctl start slurmctld
systemctld enable slurmctld
```

步骤8：执行以下命令在testnode1和testnode2节点启动“slurmd”服务。

```
systemctl start slurmd
systemctl enable slurmd
```

## 2、集群管理

NFS共享目录：/opt

### （1）管理节点

配置文件：/etc/slurm/slurm.conf、/etc/slurm/slurmdbd.conf

守护进程服务：munge/slurmdbd/slurmctld

常用命令：

```
systemctl enable slurmctld  #设置开机自启动服务

systemctl start slurmctld  #启动服务

systemctl restart slurmctld  #重新启动服务

systemctl stop slurmctld  #停止服务

systemctl status slurmctld  #查看服务状态及出错信息

journalctl -xe  #查看服务日志
```

### （2）数据库节点

与管理节点共用

### （3）用户登录节点

/

### （4）计算节点

配置文件：/etc/slurm/slurm.conf

守护进程服务：munge/slurmd

常用命令：

```
systemctl enable slurmd  #设置开机自启动服务

systemctl start slurmd  #启动服务

systemctl restart slurmd  #重新启动服务

systemctl stop slurmd  #停止服务

systemctl status slurmd  #查看服务状态及出错信息

journalctl -xe  #查看服务日志
```

# 三、SLURM配置文件

Slurm配置文件存放目录：/etc/slurm/slurm.conf，配置文件中各个字段含义均有注释。

# 四、SLURM任务脚本

SLURM 脚本包含一个带有 SLURM SBATCH 注释 #SBATCH 的标题。这些注释告诉 SLURM 以下信息。

| SBATCH command | Description |
| --- | ---|
| #SBATCH -N 1 | 预留单个节点 |
| #SBATCH -n 4 | 作业步骤将启动最多 4 个作业 |
| #SBATCH -p short | 预留在短分区 |
| #SBATCH -t 01:00:00 | 预留 01 时:00 分:00 秒 |
| #SBATCH -J test | 工作的名称是“测试” |
| #SBATCH -o test.o%j | 将任何 std 输出写入名为 testp.o%j 的文件，其中 %j 自动替换为 jobid |
| #SBATCH -e test.e%j | 将任何 std 输出写入名为 test.e%j 的文件，其中 %j 自动替换为 jobid |
| #SBATCH –mail-user=user@domain.edu | 通过此电子邮件地址通知我 |
| #SBATCH –mail-type=begin | 工作开始时通过电子邮件通知 |
| #SBATCH –mail-type=end | 工作结束时通过电子邮件通知 |

脚本示例

```
#!/bin/bash

# 下面以单个 `#SBATCH` 开头的所有行都是 SLURM SBATCH 注释

#SBATCH -N 1
#SBATCH -n 4
#SBATCH -p short
#SBATCH -t 01:00:00
#SBATCH -J test
#SBATCH -o test.o%j
#SBATCH -e test.e%j
#SBATCH --mail-user=user@domain.edu
#SBATCH --mail-type=begin
#SBATCH --mail-type=end

cd $SLURM_SUBMIT_DIR # 此行将您更改为作业开始后提交脚本的目录

## 以下几行是要运行的命令
sleep 10 && echo "test"
## scontrol 是一个 slurm 命令，用于查看 slurm 配置或状态。查看您使用了多少资源。
scontrol show job $SLURM_JOB_ID
```

# 五、SLURM常用命令

所有 Slurm 守护进程、命令和 API 函数均有手册页。命令选项--help也提供了选项的简要概述。请注意，所有命令选项均区分大小写。

| 命令 | 描述 |
| --- | ---|
| sacct | 报告有关活动或已完成作业的作业或作业步骤会计信息。 |
| salloc | 实时为作业分配资源。通常，它用于分配资源并生成一个 shell。然后，该 shell 用于执行 srun 命令来启动并行任务。 |
| sattach | 将标准输入、输出、错误和信号功能附加到当前正在运行的作业或作业步骤。可以多次附加到作业或从作业中分离。 |
| sbatch | 提交作业脚本以供稍后执行。该脚本通常包含一个或多个 srun 命令来启动并行任务。 |
| sbcast | 将文件从本地磁盘传输到分配给作业的节点上的本地磁盘。这可以有效地利用无盘计算节点，或提供相对于共享文件系统的更高性能。 |
| scancel | 正在挂起或正在运行的作业或作业步骤。它还可以向与正在运行的作业或作业步骤关联的所有进程任意信号。 |
| scontrol | 查看和/或修改 Slurm 状态的管理工具。请注意，许多scontrol 命令只能以 root 用户身份执行。 |
| sinfo | 报告 Slurm 管理的分区和节点的状态。它具有多种过滤、排序和格式化选项。 |
| sprio | 显示影响作业优先级的组件的详细视图。 |
| squeue | 报告作业或作业步骤的状态。它提供多种过滤、排序和格式化选项。默认情况下，它会按优先级顺序报告正在运行的作业，然后按优先级顺序报告待处理的作业。 |
| srun | 提交作业以供执行或实时启动作业步骤。srun 提供多种选项来指定资源需求，包括：最小和最大节点数、处理器数量、 要使用或不使用的特定节点以及特定节点特性（例如，内存、磁盘空间、某些必需功能等）。一个作业可以包含多个作业步骤，这些作业步骤可以在作业节点分配内的独立或共享资源上顺序或并行执行。 |
| sshare | 显示集群上关于公平共享使用情况的详细信息。请注意，此功能仅在使用优先级/多因素插件时可用。 |
| sstat | 获取有关正在运行的作业或作业步骤所使用的资源的信息。 |
| strigger | 设置、获取或查看事件触发器。事件触发器包括节点宕机或作业接近其时间限制等事件。 |
| sview | 一个图形用户界面，用于获取和更新 Slurm 管理的作业、分区和节点的状态信息。 |

squeue

```
adev0: squeue
JOBID PARTITION  NAME  USER ST  TIME NODES NODELIST(REASON)
65646     batch  chem  mike  R 24:19     2 adev[7-8]
65647     batch   bio  joan  R  0:09     1 adev14
65648     batch  math  phil PD  0:00     6 (Resources)
```

sinfo

```
adev0: sinfo
PARTITION AVAIL  TIMELIMIT NODES  STATE NODELIST
debug*       up      30:00     2  down* adev[1-2]
debug*       up      30:00     3   idle adev[3-5]
batch        up      30:00     3  down* adev[6,13,15]
batch        up      30:00     3  alloc adev[7-8,14]
batch        up      30:00     4   idle adev[9-12]
```

srun

```
adev0: srun -N3 -l /bin/hostname
0: adev3
1: adev4
2: adev5

adev0: srun -n4 -l /bin/hostname
0: adev3
1: adev3
2: adev3
3: adev3
```

sbatch

```
adev0: cat my.script
#!/bin/sh
#SBATCH --time=1
/bin/hostname
srun -l /bin/hostname
srun -l /bin/pwd

adev0: sbatch -n4 -w "adev[9-10]" -o my.stdout my.script
sbatch: Submitted batch job 469

adev0: cat my.stdout
adev9
0: adev9
1: adev9
2: adev10
3: adev10
0: /home/jette
1: /home/jette
2: /home/jette
3: /home/jette
```

scancel

```
adev0: sbatch test
srun: jobid 473 submitted

adev0: squeue
JOBID PARTITION NAME USER ST TIME  NODES NODELIST(REASON)
  473 batch     test jill R  00:00 1     adev9

adev0: scancel 473

adev0: squeue
JOBID PARTITION NAME USER ST TIME  NODES NODELIST(REASON)
```

本页内容
