Slurm 从 22.05 开始支持在运行中的集群里动态添加和删除节点。动态节点适合扩缩容,但仍然依赖已有集群的认证、网络、资源描述与分区策略。本文依据 SchedMD 的 Dynamic Nodes 全文译写,覆盖节点通信、容量配置、分区分配、两种创建方式、GPU 自动探测、删除条件和拓扑限制。
版本说明:源链接是持续更新的官方文档,核对日期为 2026 年 10 月 05 日。“从 22.05 开始支持”不表示下文每项新增行为都存在于 22.05;尤其 GPU 探测机制应与集群所安装版本的手册核对。

控制器怎样找到动态节点
对于普通的、非动态创建的节点,Slurm 通过读取 slurm.conf 获得通信信息,所以非动态部署要求该文件在集群范围保持同步。
对于动态注册的 slurmd,控制器会自动取得节点的 NodeAddr 与 NodeHostname,再把节点地址交给客户端。客户端由此可以与其他节点通信,也可以进行扇出通信。这里改变的是节点地址的发现与分发方式,并不是取消集群的认证或连通性要求。
先为动态容量留出配置
MaxNodeCount 应设为系统在同一时间可能处于活动状态的节点数量上限。源文以 MaxNodeCount=# 表示需要填写的数值,# 不是可原样复制的有效容量。
动态节点只支持 cons_tres 选择插件,因此配置中必须使用:
SelectType=select/cons_tres
完整参数定义见 slurm.conf 手册。容量值、现有节点配置和配置生效方式都应按部署版本审阅。
用特征把节点分配到分区
创建动态节点时,可以使用分区 Nodes 参数的 ALL 关键字,或者把节点的特征与 NodeSet 对应起来,使节点自动进入分区。官方示例为:
Nodeset=ns1 Feature=f1
Nodeset=ns2 Feature=f2
PartitionName=all Nodes=ALL Default=yes
PartitionName=dyn1 Nodes=ns1
PartitionName=dyn2 Nodes=ns2
PartitionName=dyn3 Nodes=ns1,ns2
ns1 收集带有 f1 特征的节点,ns2 收集带有 f2 特征的节点。dyn1 和 dyn2 分别引用对应集合,dyn3 引用两者,而 all 使用所有节点并被设为默认分区。
编辑检查:Nodes=ALL 会把所有符合其定义的节点纳入该分区。这是原文演示的分区策略,不应直接当作生产环境的访问隔离策略;新增节点是否应向默认分区开放,需要另行审阅。
创建方式一:由 slurmd 动态注册
使用 slurmd -Z 和 --conf,节点守护进程会向控制器注册,并自动加入系统。官方示例:
slurmd -Z --conf "RealMemory=80000 Gres=gpu:2 Feature=f1"
该示例声明 RealMemory=80000、两个 GPU 以及特征 f1。数值只是示例,并不说明执行命令的主机拥有这些资源。内存、GPU、节点名称和 CPU 拓扑必须根据真实主机及集群配置确定。运行命令会启动或注册节点,本文没有执行它。
创建方式二:由控制器显式创建
也可以使用 scontrol create NodeName=... 创建节点。节点描述使用与 slurm.conf 中 NodeName 行相同的参数。此方式仅支持 State=CLOUD 和 State=FUTURE。节点配置应与随后 slurmd 注册时报告的硬件一致,例如先参考 slurmd -C 的输出,再补充所需属性。
scontrol create NodeName=d[1-100] CPUs=16 Boards=1 SocketsPerBoard=1 CoresPerSocket=8 ThreadsPerCore=2 RealMemory=31848 Gres=gpu:2 Feature=f1 State=cloud
这是源文的完整示例,会涉及 d1 到 d100 的节点范围。1 × 8 × 2 = 16 与例中的 CPU 数相符,但并不能证明目标硬件、内存或 GPU 描述正确。
命令整理建议(与原文的差异):若在会展开方括号模式的 Shell 中运行,应将节点表达式作为一个参数引用,例如写成 'NodeName=d[1-100]'。这里仅建议增加参数引用,未改变节点范围,也未提供可直接用于生产集群的参数值。不要把未经验证的外部输入拼接进命令,更不要用 eval 执行它。
GPU 自动探测何时生效
当前源文说明:通过 slurmd -Z 创建动态节点时,同时满足下列条件才会自动探测并注册 GPU:
--conf没有指定任何 GPU GRES;gres.conf没有针对该节点的显式 GPU GRES 记录;gres.conf没有设置AutoDetect=off。
若 gres.conf 的 AutoDetect 指定了探测机制,例如 NVML、NVIDIA、RSMI、oneAPI 或 NRT,slurmd 会尝试使用该机制;否则默认使用源文链接所述的 full GPU 探测方式。
上面的注册示例已经写明 Gres=gpu:2,因此不满足“--conf 未指定 GPU GRES”这一前提。手动声明与自动探测应分别理解,不能据该示例声称 GPU 会自动识别。
删除节点前必须满足的条件
官方给出的删除语法是 scontrol delete nodename=<nodelist>。只有动态节点、没有正在运行的作业,并且不属于任何预留(reservation),才允许删除。
删除操作会改变调度器状态,不能用来强行绕过仍在运行的作业或有效预留。先核实节点身份、作业与预留状态,再按集群管理流程操作;本文仅展示语法,没有运行删除命令,也没有把移除调度记录等同于关闭云主机或清除磁盘数据。
拓扑与内部排序的限制
节点可按照 Topology Guide 的规则动态加入或移出拓扑。源文另有一项重要限制:动态节点在内部不会自动排序,加入后内部顺序可能不符合名称的字母顺序。如果节点名本身表示物理拓扑,这种顺序可能使作业分配不够理想。因此,节点已成功注册不等于其拓扑放置已经最优。
来源、归属与审查范围
原文:Slurm Workload Manager — Dynamic Nodes;维护与发布方:SchedMD。原页没有可确认的个人作者署名。本稿为中文译写,保留原例并加入明确标记的编辑检查。
代码检查仅为静态审阅:已检查参数、资源声明、Shell 参数引用、状态变更与删除条件;没有连接 Slurm 集群,没有执行任何注册、创建或删除命令。未发现硬编码秘密;此结论不代表集群配置或依赖不存在漏洞。












暂无评论内容