SLURM

 

    简单来说,SLURM的工作流程就是:用户明确表达计算需求(需要多少资源,要运行什么程序),SLURM负责在合适的时机将可用的资源分配给它。

  • 用户编写作业脚本,在脚本中通过特定参数声明所需的资源(如几个节点、多少个CPU核心、多少内存、是否需要GPU等)。
  • 使用 sbatch命令提交脚本。SLURM会将作业放入相应分区的等待队列中
  • 调度器会根据优先级策略(如先到先得、用户优先级、作业大小等)检查队列。当有节点资源满足作业需求时,调度器便会为该作业分配节点。
  • 在分配的节点上启动任务执行。执行过程中的输出通常会被重定向到日志文件中
  • 任务完成后,SLURM会释放资源,并将结果返回给用户

 

🖥️ SLURM 基本使用方式

SLURM主要提供了三种作业提交方式,以适应不同的使用场景

提交方式

核心命令

适用场景

特点

​交互式作业​

srun

短时间测试、代码调试、需要实时交互

命令会阻塞终端,直到作业完成。如果终端断开,作业可能中断

​批处理作业​

sbatch

​最常用于长时间运行的计算任务

提交后立即返回终端,作业在后台运行,不受网络连接断开影响

​资源分配​

salloc

先申请一个计算资源“沙箱”,然后在其中交互式运行命令

适用于需要交互式并行作业的场景,是先分配资源再执行命令的模式

 

 

 

 

 

 

 

 

批处理作业脚本示例​

最常用的方式是编写一个批处理脚本,然后通过 sbatch提交。下面是一个典型的脚本示例

#!/bin/bash
# 作业名称
#SBATCH --job-name=my_test_job
# 指定分区(队列)
#SBATCH --partition=cpu
# 申请1个计算节点
#SBATCH --nodes=1
# 总共需要8个任务(通常可理解为进程数)
#SBATCH --ntasks=8
# 每个任务需要的CPU核心数
#SBATCH --cpus-per-task=1
# 作业最大运行时间(小时:分钟:秒)
#SBATCH --time=01:00:00
# 标准输出文件(%j会被替换为作业ID)
#SBATCH --output=%j.out
# 标准错误输出文件
#SBATCH --error=%j.err
# 申请GPU资源(如需要): 例如申请2块GPU卡
#SBATCH --gres=gpu:2

# 加载必要的软件环境模块(根据集群配置)
module load python/3.8
module load cuda/11.0

# 进入作业提交时的目录
cd $SLURM_SUBMIT_DIR

# 执行计算命令(使用 srun 启动并行任务)
echo "开始计算任务..."
srun python my_simulation.py
echo "任务完成!"

将此脚本保存为 myjob.slurm后,使用以下命令提交:

sbatch myjob.slurm

 

📟 SLURM 常用操作命令

掌握以下命令,你就能熟练地使用SLURM集群了

命令

功能描述

常用选项/示例

sinfo

查看集群分区和节点的状态,了解有哪些资源可用

sinfo:查看概要信息。
sinfo -N -l:以列表形式显示节点的详细信息

squeue

查看作业队列的状态,查看自己的或所有作业的排队/运行情况

squeue:查看当前用户的所有作业。
squeue -u <用户名>:查看指定用户的作业

squeue -l:显示更详细的信息

scancel

​取消已提交的作业(无论是排队中还是运行中)

scancel <作业ID>:取消指定作业

scancel -u <用户名>:取消指定用户的所有作业

scontrol

强大的管理工具,用于查看和修改作业、节点等详细信息

scontrol show job <作业ID>:显示指定作业的非常详细的信息

sacct

查看已完成作业的会计信息​(如运行时间、结束状态、资源消耗等),用于事后分析

sacct:查看过去24小时内自己作业的概要信息

sacct -j <作业ID> --format=JobID,JobName,State,Elapsed,MaxRSS:查看特定作业的详细资源使用情况

srun

​交互式运行并行任务

srun -N 1 -n 4 -p cpu hostname:在cpu分区申请1节点4核心,然后运行hostname命令

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如何将新节点加入SLURM集群中?

🔧 添加新节点的核心步骤

将一个全新的节点加入集群,主要涉及以下几个环环相扣的步骤:

  1. ​新节点系统准备
    • 主机名与网络:确保新节点可以与集群中的主节点​(ControlMachine)以及其他计算节点正常通信。需要在所有节点的 /etc/hosts文件中正确配置新节点的主机名和IP地址,或者确保DNS可以正确解析
    • SSH互信:配置主节点到新节点的SSH免密登录,这是后续自动化部署和通信的基础
    • 时间同步:确保所有节点的时间一致,通常使用NTP(网络时间协议)服务进行同步
    • 共享存储:如果集群使用了NFS等共享存储,需要将新节点正确挂载共享目录(如 /home),以确保用户数据和软件环境的一致性
  2. 安装必要软件
    • Slurm组件:在新节点上安装 slurmd软件包。在某些系统上,这个包可能叫 slurm-slurmdslurm-llnl
    • 认证服务:安装并配置 ​Munge​ 认证服务。​关键在于,新节点上的 /etc/munge/munge.key文件必须与主节点及其他所有节点完全一致。通常先在主节点生成密钥,然后将其安全地复制到新节点上
  3. 修改SLURM主配置
    • 在主节点上,编辑 SLURM 的核心配置文件 ​/etc/slurm/slurm.conf
    • NodeName参数中添加新节点的定义。您可以直接添加一行,或者修改现有的节点范围。例如,如果原有配置为 NodeName=node[1-2],新增节点 node3后可以修改为 NodeName=node[1-3]
    • 同时,需要更新 PartitionName配置,将新节点加入到相应的分区(Partition)中
  4. 同步配置并启动服务
    • 将更新后的 slurm.conf文件从主节点同步到所有计算节点(包括新节点)​的相同路径下,确保整个集群的配置完全一致
    • 在新节点上启动 slurmd服务,并设置为开机自启
      • sudo systemctl enable slurmd --now
    • 在主节点上,让 slurmctld守护进程重新读取配置文件​(通常使用 scontrol reconfigure命令或在某些情况下重启服务)以识别新节点
  5. 验证节点状态
    • 使用 sinfoscontrol show nodes命令查看节点状态。如果一切正常,新节点的状态(STATE)应显示为 idle(空闲),表示它已准备就绪,可以接收作业了

 

⚠️ 重要注意事项与故障排查

  • ​配置一致性​:确保 ​slurm.conf在所有节点上完全一致,这是避免各种奇怪问题的关键

  • ​防火墙​:检查新节点的防火墙设置,确保开放 SLURM 守护进程所需的端口(默认为 6817-6818

  • ​节点状态异常​:如果新节点状态为 down,请检查:

    • slurmd服务在新节点上是否正常运行:systemctl status slurmd

    • 网络连通性和 Munge 密钥是否正确
    • 使用 journalctl -u slurmd查看日志以获取详细错误信息

  • ​资源定义​:在 slurm.conf中定义节点时,请准确设置 CPUs(逻辑处理器数量)、RealMemory(实际内存大小,单位MB)等参数,以确保调度器能正确分配资源。如果注册的节点资源少于配置,该节点将被标记为 DOWN状态

 

posted on 2025-10-14 17:10  Karlkiller  阅读(92)  评论(0)    收藏  举报

导航