Slurm 程序员指南

目录

概述

Slurm 是一个开源的、容错的、高度可扩展的集群管理和作业调度系统,适用于大规模和小规模的 Linux 集群。其组件包括机器状态、分区管理、作业管理、调度和流复制模块。Slurm 的操作不需要内核修改,并且相对自包含。

Slurm 使用 C 语言编写,并使用 GNU autoconf 配置引擎。虽然最初是为 Linux 编写的,但其他类 UNIX 操作系统应该也容易移植。代码应遵循 Linux 内核编码风格(Slurm 的某些组件来自不同的来源,其中一些组件不符合 Linux 内核编码风格。然而,为 Slurm 编写的新代码应遵循这些标准。)

插件

为了使不同基础设施的使用成为可能,Slurm 使用通用插件机制。Slurm 插件是一个动态链接的代码对象,由 Slurm 库在运行时显式加载。它提供了与身份验证、互连结构、任务调度等相关的任务的自定义实现。为特定类型的所有不同基础设施定义了一组函数。当启动 Slurm 守护进程时,它会读取配置文件以确定应使用哪些可用插件。有关插件的一般信息,请参阅插件开发者指南

目录结构

Slurm 目录结构的内容将在下面逐步描述。顶级目录包含构建整个 Slurm 系统所需的脚本和工具。它还包含各种类型文件的子目录。

常规构建工具/文件包括: acinclude.m4, configure.ac, Makefile.am, Make-rpm.mk, META, README, slurm.spec.in,以及 auxdir 目录的内容。 autoconfmake 命令用于以自动化方式构建和安装 Slurm。 注意: autoconf 版本 2.52 或更高版本是构建 Slurm 的必要条件。执行 autoconf -V 来检查您的版本号。 构建过程在 README 文件中描述。

版权和免责声明信息在文件 COPYING 和 DISCLAIMER 中。 所有顶级子目录在下面进行了描述。

auxdir — 用于构建 Slurm。
contribs — 各种贡献的工具。
doc — 包含手册页的文档。
etc — 示例配置文件。
slurm — 用于 API 使用的头文件。这些文件必须安装。将 这些头文件放在此位置可以提高代码的可移植性。
src — 包含所有源代码和不在上述 "slurm" 子目录中的头文件。
testsuite — 这里有 Check、Expect 和 Pytest 测试。

文档

所有文档都在子目录 doc 中。 两个目录特别值得关注:

doc/man — 包含 API、配置文件、命令和守护进程的手册页。
doc/html — 包含网页。

源代码

函数分为几个类别,每个类别在自己的子目录中。 每个目录内容的详细信息如下。目录如下:

api — 进入 Slurm 代码的应用程序接口。用于从中央管理器发送和获取 Slurm 信息。 这些是用户应用程序可能会使用的函数。
common — 用于 Slurm 广泛使用的一般目的函数。
database — 支持会计存储插件的各种数据库文件。
plugins — 用于各种基础设施或可选行为的插件函数。每个插件类使用一个单独的子目录:

  • accounting_storage 用于指定会计的存储类型,
  • auth 用于用户身份验证,
  • cred 用于作业凭证函数,
  • jobacct_gather 用于作业会计,
  • jobcomp 用于作业完成日志,
  • mpi 用于 MPI 支持,
  • priority 根据多个因素(包括公平共享)计算作业优先级,
  • proctrack 用于进程跟踪,
  • sched 用于作业调度,
  • select 用于作业的节点选择,
  • switch 用于交换(互连)特定功能,
  • task 用于任务与处理器的亲和性,
  • topology 用于根据节点拓扑分配节点给作业的方法。

sacct — 用户命令,用于查看作业的会计信息。
sacctmgr — 用户和管理员工具,用于管理会计。
salloc — 用户命令,用于为作业分配资源。
sattach — 用户命令,用于将标准输入、输出和错误文件附加到正在运行的作业或作业步骤。
sbatch — 用户命令,用于提交批处理作业(稍后执行的脚本)。
sbcast — 用户命令,用于将文件广播到与现有 Slurm 作业关联的所有节点。
scancel — 用户命令,用于取消(或信号)作业或作业步骤。
scontrol — 管理员工具,用于管理 Slurm。
sinfo — 用户命令,用于获取 Slurm 节点和分区的信息。
slurmctld — Slurm 中央管理器守护进程代码。
slurmd — Slurm 守护进程代码,用于管理计算服务器节点,包括用户应用程序的执行。
slurmdbd — Slurm 数据库守护进程,管理对会计存储数据库的访问。
sprio — 用户命令,用于查看作业优先级计算的细分,当安装了多因素作业优先级插件时。
squeue — 用户命令,用于获取 Slurm 作业和作业步骤的信息。
sreport — 用户命令,用于查看有关过去使用情况的各种报告。
srun — 用户命令,用于提交作业、获取分配和/或启动并行作业步骤。
sshare — 用户命令,用于查看共享和使用情况,当安装了多因素作业优先级插件时。
sstat — 用户命令,用于查看有关正在运行的作业的详细统计信息,当安装了作业会计收集插件时。
strigger — 用户和管理员工具,用于管理事件触发器。
sview — 用户命令,用于查看和更新节点、分区和作业状态信息。

源代码管理

最新代码在 github: https://github.com/SchedMD/slurm。 创建自己的分支将使其更容易与我们的工作保持同步。

添加新模块

将新文件名添加到适当目录中的 Makefile.am 文件中。 然后在 Slurm 源代码目录的顶层执行 autoreconf。 请注意,需要相对较新的 automake 版本。 autoreconf 程序将从 Makefile.am 文件构建 Makefile.in 文件。 如果需要安装任何新文件,请更新 slurm.spec 文件以识别 新文件应放置的 RPM。

如果需要添加新目录,请在 configure.ac 文件中添加 要在新目录中构建的 Makefile 的路径。总结如下:
autoreconf.am 文件转换为 .in 文件
configure.in 文件转换,添加路径和版本号。

编译

将 "make" 的标准输出发送到文件可以更容易地查看任何 警告或错误消息:
"make -j install >make.out"

配置

示例配置文件包含在 etc 子目录中。 slurm.conf 可以使用配置工具构建。 有关更多详细信息,请参见 doc/man/man5/slurm.conf.5 和其他配置文件的手册页。 init.d.slurm 是一个脚本,根据配置文件内容确定 应在任何节点上执行哪些 Slurm 守护进程。 它还将管理这些守护进程:启动、信号、重启和停止它们。

测试套件

testsuite 文件使用 Check、Expect 和 Pytest 以不同方式测试 Slurm。

Check 测试旨在对 C 代码进行单元测试。仅使用 make check,在未安装 Slurm 的情况下,它们将验证关键 C 函数是否正常工作。

我们还有一组 Expect Slurm 测试可在 testsuite/expect 目录下找到。这些测试在安装 Slurm 并启动守护进程后执行。这些测试涵盖所有 Slurm 命令 和选项,包括压力测试。文件 testsuite/expect/globals 包含所有单个测试的 Expect 测试框架。至少,您需要将 slurm_dir 变量设置为正确的 值。为了避免与其他开发人员的冲突,您可以在名为 testsuite/expect/globals.local 的单独文件中覆盖变量设置。

在开始这些测试之前,将工作目录设置为 testsuite/expect。可以通过名称 单独执行测试(例如 test1.1) 或可以使用单个命令执行完整的测试套件 regression.py。 有关更多信息,请参见 testsuite/expect/README

Slurm 还具有一个 Pytest 环境,可以像 Expect 一样工作,但它 还与外部 QA 框架协同工作,以提高 Slurm 的整体 QA。

添加文件和目录

如果您要向 Slurm 添加文件和目录,则需要在执行 configure 命令之前 重新构建配置文件。 根据需要更新 Makefile.am 文件,然后执行 autoreconf,再执行 configure

行业技巧

多个 slurmd 支持

可以在单个节点上运行多个 slurmd 守护进程,每个守护进程使用 不同的端口号和 NodeName 别名。这对于测试 网络和协议更改非常有用,或者在您想要模拟比实际拥有的更大的 集群时。作者在他的桌面上使用此功能来模拟 多个节点。然而,需要注意的是,并非所有 Slurm 功能 在启用多个 slurmd 支持时都能正常工作(例如,许多交换插件将 无法工作,最好不要使用任何插件)。

在配置时,通过 "--enable-multiple-slurmd" 参数启用多个支持。这将启用 slurm.conf 文件中 NodeName 行的新参数 "Port=",并向 slurmd 添加一个新 命令行参数 "-N"。

每个 slurmd 需要有自己的 NodeName 和自己的 TCP 端口号。以下是 在十个节点上运行三个 slurmd 守护进程的 NodeName 行示例:

NodeName=foo[1-10] NodeHostname=host[1-10]  Port=17001
NodeName=foo[11-20] NodeHostname=host[1-10] Port=17002
NodeName=foo[21-30] NodeHostname=host[1-10] Port=17003

您可能还希望在 slurm.conf 文件中的任何与 slurmd 相关的路径中使用 "%n" 符号,例如 SlurmdLogFile、 SlurmdPidFile,尤其是 SlurmdSpoolDir。每个 slurmd 用其自己的 NodeName 替换 "%n"。以下是一个示例:

SlurmdLogFile=/var/log/slurm/slurmd.%n.log
SlurmdPidFile=/var/run/slurmd.%n.pid
SlurmdSpoolDir=/var/spool/slurmd.%n

您可以手动使用正确的 NodeName 启动每个 slurmd 守护进程。 例如,要从上述 slurm.conf 示例中启动 host1 的 slurmd 守护进程:

host1> slurmd -N foo1
host1> slurmd -N foo11
host1> slurmd -N foo21

如果您有 SysV 初始化脚本,slurmd 守护进程将在 /etc/sysconfig/slurm 中设置 MULTIPLE_SLURMD 为 yes 时自动启动。 如果您的发行版使用 systemd,您可能希望使用模板功能 定义一个 slurmd.service 文件并在其中注册每个虚拟节点,例如:

[Unit]
Description=Slurm 节点守护进程
After=network.target munge.service remote-fs.target
ConditionPathExists=/etc/slurm.conf

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmd
ExecStart=/usr/sbin/slurmd -N%i $SLURMD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/var/run/slurmd-%i.pid
KillMode=process
LimitNOFILE=51200
LimitMEMLOCK=infinity
LimitSTACK=infinity
Delegate=yes

[Install]
WantedBy=multi-user.target

然后,像这样启用/管理服务(文件中的 %i 将被命令行中 @ 后的内容替换):

systemctl enable slurmd@nodeXYZ
systemctl start/stop/restart slurmd@nodeXYZ

最后修改于 2025 年 5 月 21 日