Slurm作业系统

news/发布时间2024/9/20 6:11:54

1、什么是计算机集群

计算机集群是由多台独立的计算机(节点)通过网络连接在一起,以共同完成任务的一种计算机系统结构。集群系统旨在提高性能、可用性和可扩展性。以下是计算机集群的一般结构和组成要素:

  1. 节点(Nodes): 集群中的每台独立计算机被称为节点。这些节点可以是普通的计算机服务器,具备处理能力、内存和存储等资源。

  2. 互联网络: 节点之间通过高速网络连接,通常使用以太网或者其他专用高性能网络。这使得节点能够相互通信和协同工作。

  3. 集群管理软件: 集群中的节点由集群管理软件进行管理和协调。这些软件负责分配任务、监控节点的状态、处理故障等。一些流行的集群管理软件包括Slurm、OpenStack、Kubernetes、Apache Hadoop等。

  4. 负载均衡器: 负载均衡器用于平衡集群中各个节点的负载,确保任务被均匀地分配到不同的节点上,从而提高整个集群的性能和效率。

  5. 存储系统: 集群通常需要共享存储,以便节点之间能够访问相同的数据。这可以通过网络附加存储(Network Attached Storage,NAS)或存储区域网络(Storage Area Network,SAN)实现。

  6. 冗余和容错机制: 为了提高可用性,集群通常包含冗余的组件和容错机制。这可以包括节点冗余、电源冗余、网络冗余等,以防止单点故障对整个集群的影响。

  7. 并行计算和分布式系统支持: 集群设计用于支持并行计算和分布式系统。任务可以分解为小的子任务,由不同节点并行处理,从而加速整个计算过程。

  8. 扩展性: 集群结构应该具有良好的可扩展性,允许根据需求添加新的节点,以满足不断增长的计算需求。

简单来说,计算机集群就是一个多台高性能计算机(2*24Core 3.0GHz Intel Xeon Gold 6248R,512GB)通过高速网络连接组成的机房。如下是一个名为白云一号的集群,它是由48个拥有2个英特尔至强Gold 6230R CPU、256G内存的计算机,2个拥有4个英特尔至强Gold 6248、1024G内存的计算机组成的集群。

2、什么是Slurm

在公共集群中使用SLURM作业调度系统进行任务的调度和管理。SLURM (Simple Linux Utility for Resource Management)是一种可用于大型计算节点集群的高度可伸缩和容错的集群管理器和作业调度系统,被世界范围内的超级计算机和计算集群广泛采用。在一个典型的集群环境中,Slurm的组件分为两部分:控制节点(Head Node)计算节点(Compute Node)

控制节点:

这是Slurm集群的主节点,负责整个集群的管理和协调。在控制节点上,需要安装Slurm的控制节点组件,包括slurmctld(Slurm Controller Daemon)和slurmd(Slurm Daemon)。slurmctld负责协调作业调度和资源管理,而slurmd则运行在每个计算节点上,负责接受和执行由控制节点分配的作业。

计算节点:

这是集群中实际执行计算任务的节点。在每个计算节点上,需要安装slurmd守护程序。这个守护程序通过与控制节点通信,接收作业分配和相应的任务信息,然后启动、监控和报告任务的执行。

一般来说,普通用户主要通过控制节点(Head Node)与Slurm集群进行交互。控制节点上通常安装有Slurm的客户端工具,用户可以使用这些工具提交作业、查询作业状态、获取有关集群资源的信息等。

在Slurm集群中,计算节点上的直接访问通常会受到限制,因为这些节点主要负责执行计算任务而不是用户交互。用户通过控制节点向Slurm系统提交任务,并通过控制节点的命令行界面或其他管理工具与集群进行交互。

3、Slurm常用命令

3.1、sinfo 查看节点与分区状态

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu*         up   infinite      1  down* n144
cpu*         up   infinite    168  alloc n[3-143,145-171]

关键词

含义

PARTITION

分区名,对节点的逻辑分组。不同的分区会设置不同权限、资源限制等。

AVAIL

可用状态:up 可用;down 不可用

TIMELIMIT

该分区的作业最大运行时长限制, 30:00 表示30分钟,如果是2-00:00:00表示2天,如果是infinite表示不限时间

NODES

节点数量

STATE

状态:drain: 排空状态,表示该类节点不再分配到其他;idle: 空闲状态;alloc: 被分配状态; mix:部分被占用,但是仍有可用资源; down停机

NODELIST

节点列表

3.2、squeue 查看队列状态

$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
8628       cpu vasp_cpu  yangx17 PD       0:00      2 (QOSMaxNodePerUserLimit)
8629       cpu vasp_cpu  yangx17 PD       0:00      2 (QOSMaxNodePerUserLimit)
8630       cpu vasp_cpu  yangx17 PD       0:00      2 (QOSMaxNodePerUserLimit)
8636       cpu vasp_cpu  mab2019 PD       0:00      4 (Resources)
8637       cpu     vasp lizhenhu PD       0:00      1 (Priority)
5042       cpu HICE_WAC    xum17  R 16-22:28:14      4 n[114-117]
5044       cpu LICE_WAC    xum17  R 16-22:21:58      4 n[29,41-43]
5519       cpu        c zhaosy16  R 14-22:00:21      5 n[93-95,165-166]
5783       cpu        c liangt20  R 13-20:54:50      5 n[30-32,156-157]

squeue -u ${USER}       # 查看指定用户的作业

关键词

含义

JOBID

作业的id号,每个成功提交的任务都会有唯一的id

PARTITION

分区名

NAME

作业名称,默认为提交脚本的名称

USER

用户名,提交该作业的用户名

ST

作业状态:PD排队;R运行;S挂起;CG正在退出

TIME

作业运行时间

NODES

作业占节点数

NODELIST(REASON)

作业所占节点列表,如果是排队状态的任务,则会给出排队原因

3.3、scancel 取消作业

scancel <JOBID>

3.4、 sacct 查看历史作业信息

此命令提供有关已提交作业的有用信息。

Column    Description
JobID    作业编号
JobName    任务名称
Partition    它正在运行或排队等待 SLURM 队列的哪个分区
Account    它在哪个帐户/组上运行
AllocCPUS    分配/请求的 CPU 数量
State ExitCode    工作状态或退出代码

3.5、salloc 分配资源

集群的计算节点默认不允许用户直接登录,对需要交互式处理的程序,在登录到集群后,使用salloc命令分配节点,然后再ssh到分配的节点上进行处理:

用法: salloc [选项...] [命令 [参数...]]

并行运行选项:
  -A, --account=name          将任务计费到指定账户
  -b, --begin=time            推迟任务直到 HH:MM MM/DD/YY
      --bell                  当任务分配时响铃终端
      --bb=<spec>             爆发缓冲区规格
      --bbf=<file_name>       爆发缓冲区规格文件
  -c, --cpus-per-task=ncpus   每个任务需要的 CPU 核心数量
      --comment=name          任意注释
      --cpu-freq=min[-max[:gov]] 请求的 CPU 频率(和调度器)
      --delay-boot=mins       推迟引导以获得所需的节点特性
  -d, --dependency=type:jobid 推迟任务,直到 jobid 上的条件满足
      --deadline=time         如果在此截止时间之前没有结束,则移除任务(start > (deadline - time[-min]))
  -D, --chdir=path            更改工作目录
      --get-user-env          由 Moab 使用,请参见 srun 手册。
      --gid=group_id          以指定的组 ID 运行任务(仅限 root 用户)
      --gres=list             所需的通用资源
      --gres-flags=opts       与 GRES 管理相关的标志
  -H, --hold                  以保持状态提交任务
  -I, --immediate[=secs]      如果资源在“secs”内不可用,则退出
  -J, --job-name=jobname      任务的名称
  -k, --no-kill               在节点故障时不要终止任务
  -K, --kill-command[=signal] 发送终止任务的信号
  -L, --licenses=names        所需的许可证,逗号分隔
  -M, --clusters=names        逗号分隔的要发出命令的群集列表。默认为当前群集。'all' 的名称将在所有群集上运行。注意:SlurmDBD 必须启动。
  -m, --distribution=type     进程到节点的分布方法(类型 = block|cyclic|arbitrary)
      --mail-type=type        在状态更改时通知:BEGIN、END、FAIL 或 ALL
      --mail-user=user        为作业状态更改发送电子邮件通知的用户
      --mcs-label=mcs         如果使用 mcs 插件 mcs/group,则为 mcs 标签
  -n, --ntasks=N              所需的处理器数量
      --nice[=value]          按照 value 减小调度优先级
      --no-bell               不要响铃终端
      --ntasks-per-node=n     在每个节点上调用的任务数量
  -N, --nodes=N               要运行的节点数(N = min[-max])
  -O, --overcommit            超额分配资源
      --power=flags           电源管理选项
      --priority=value        将作业的优先级设置为 value
      --profile=value         启用 acct_gather_profile 以获取详细数据,value 是 all 或 none 或 energy、lustre、network 或 task 的任意组合
  -p, --partition=partition   请求的分区
  -q, --qos=qos               服务质量
  -Q, --quiet                 安静模式(抑制信息消息)
      --reboot                在启动作业之前重新启动计算节点
  -s, --oversubscribe         与其他作业一起超额分配资源
      --signal=[B:]num[@time] 在 time 秒内发送信号限时
      --spread-job            将作业分布在尽可能多的节点上
      --switches=max-switches{@max-time-to-wait} 最佳交换机和最大等待时间的最佳选择
  -S, --core-spec=cores       保留核心的数量
      --thread-spec=threads   保留线程的数量
  -t, --time=minutes          时间限制
      --time-min=minutes      最小时间限制(如果不同)
      --uid=user_id           以指定的用户 ID 运行任务(仅限 root 用户)
      --use-min-nodes         如果给出节点计数的范
 

示例:

示例1、

salloc -p free -n 16     

# 在名为free的分区申请16核CPU资源

示例2、

salloc -p fat -N1 -n6 -q low -t 2:00:00

# 在名为fat的分区指定分配一个节点,申请6核CPU资源

-q 选项指定队列

low,表示将任务提交到名为 low 的队列中

-t 选项指定任务的时间限制,这里是 2:00:00,表示任务将在 2 小时内运行

示例3、

salloc -p GPU -N1 -n6 --gres=gpu:1 -q low -t 24:00:00

# 在名为GPU的分区指定分配一个节点,申请6核CPU资源

--gres 选项指定通用资源,这里是 gpu:1,表示任务需要使用 1 个 GPU

示例4、

salloc -p fat -N2 --ntasks-per-node=12 -q low -t 2:00:00

# 在名为fat的分区指定分配两个节点

# 这里申请两个节点,每个节点12个进程,每个进程一个核心

计算完成后,使用exit命令推出节点,注意需要exit两次,第一次exit是从计算节点退出到登录节点,第二次exit是释放所申请的资源。

3.6、sbatch 提交批处理作业

可以通过将程序执行命令放入作业提交脚本,并通过sbatch命令作业提交的方式在集群中进行计算。

常见提交作业参数参考:

参数

说明

--job­name=<name>

设定作业名称

--nodes=<n>

设定作业需要的节点数。如果没有指定,默认分配足够的节点来满足--ntasks=<n>--cpus-per-task=<ncpus>参数的要求。

--ntasks-per-node=<ntasks>

设定每个节点上的任务数。要和``–nodes=<n>``同时配合使用。

--ntasks=<n>

设定最多启动的任务数。

--cpus-per-task=<ncpus>

设定每个任务所需要的CPU核数。如果没有指定,默认为每个任务分配一个CPU核。一般运行OpenMP等多线程程序时需要,普通MPI程序不需要。

--comment=TestProject

指定从哪个项目扣费,注意要将 TestProject 替换成项目名称。如果不写这条参数,默认从个人账户扣费。

### 表示这是一个bash脚本
#!/bin/bash### 设置该作业的作业名
#SBATCH --job-name=JOBNAME### 指定该作业需要2个节点数
#SBATCH --nodes=2### 每个节点所运行的进程数为40
#SBATCH --ntasks-per-node=40### 作业最大的运行时间,超过时间后作业资源会被SLURM回收
#SBATCH --time=2:00:00### 指定从哪个项目扣费。如果没有这条参数,则从个人账户扣费
#SBATCH --comment=TestProject
### 程序的执行命令
mpirun hostname

#SBATCH开头的命令表示这些是需要slurm系统处理的参数。

如下所示,通过sbatch+作业脚本名提交作业,系统会返回作业编号,通过squeue命令可以看到作业运行状态,等作业执行完成后,默认会把程序的输出放到slurm-作业编号.out的文件中,可通过该文件查看程序的输出。

sbatch job.sh

3.7、scontrol 系统控制

用于与 Slurm 控制守护进程(slurmctld)进行交互,以及查询和管理集群的状态。

# 查询集群状态
scontrol show nodes

# 查询作业信息
scontrol show jobs

# 暂停/恢复节点
scontrol update nodename=node01 state=drain reason="maintenance"
scontrol update nodename=node01 state=resume

# 取消作业
scontrol cancel job_id

# 修改作业属性
scontrol update jobid=12345 priority=100

# 更改节点分区
scontrol update nodename=node01 partition=high-priority

# 查询 QOS 信息
scontrol show qos

3.8、srun 执行作业

# 1. 启动并行程序,使用2个节点和4个任务
srun -N2 -n4 ./my_parallel_program

# 2. 在指定分区中运行4个任务,每个节点上运行2个任务
srun -p partition_name -n4 --ntasks-per-node=2 ./my_program arg1 arg2

# 3. 指定CPU核心数和内存
srun --cpus-per-task=2 --mem=4G ./my_program

# 4. 指定GPU数量
srun --gres=gpu:2 ./my_gpu_program

# 5. 依赖关系,仅当作业ID为12345的作业成功完成后,才运行当前任务
srun --dependency=afterok:12345 ./my_program

# 6. 使用MPI并行编程时,通过指定配置文件来启动多个并行任务
srun --multi-prog my_mpi_config_file

# 7. 启动一个交互式Bash shell,分配1个节点和1个任务
srun -N1 -n1 -p interactive --pty bash

# 8. 分配1个节点和1个任务后,执行特定的命令
srun -N1 -n1 my_command

详细参考:

快速入门:Slurm资源管理与作业调度系统_slurm sbatch-CSDN博客

Slurm 作业调度系统使用指南 - 知乎 (zhihu.com)

【5】使用软件 · Doc (pku.edu.cn)

作业系统 — 华中科技大学高性能计算公共服务平台帮助文档 1.0 文档 (hust.edu.cn)

Slurm 作业调度系统 - 上海交大超算平台用户手册 Documentation (sjtu.edu.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/ulvW/10223.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

rust学习(tokio协程分析一)

代码&#xff1a; async fn doAsyncPrint(v:u32) {println!("start doAsyncPrint,v is {},tid is {:?}",v,system::myTid());//thread::sleep(Duration::from_secs(1));time::sleep(Duration::from_secs(10)).await;println!("end,v is {},tid is {:?}"…

使用正则表达式的SqlServer Check约束实例

有表如下&#xff1b;会员表&#xff0c;第一个字段是会员编号&#xff0c;varchar(24)类型&#xff1b;第二个字段是单位名称&#xff1b; 现在插入一条记录&#xff0c;会员编号为abcd&#xff1b;插入了&#xff1b; 下面要添加一个约束&#xff0c;会员编号字段只能为数字的…

适配器模式 详解 设计模式

适配器模式 适配器模式是一种结构型设计模式&#xff0c;其主要作用是解决两个不兼容接口之间的兼容性问题。适配器模式通过引入一个适配器来将一个类的接口转换成客户端所期望的另一个接口&#xff0c;从而让原本由于接口不匹配而无法协同工作的类能够协同工作。 结构 适配…

【自然语言处理】NLP入门(一):1、正则表达式与Python中的实现(1):字符串构造、字符串截取

文章目录 一、前言二、正则表达式与Python中的实现1. 字符串构造a. 使用str函数b. 单引号或双引号构造字符串c. 单双引号构造字符串的特殊用法d. 三重引号字符串e. 典例 2. 字符串截取a. 索引b. 切片c. 注意事项 一、前言 语言是一种使用具有共同处理规则的沟通指令的广义概念&…

用html编写的小广告板

用html编写的小广告板 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

类加载的基本流程

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 类加载 1. 加载2. 验证3. 准备4. 解析5. 初…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接&#xff1a;AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网…

JVM运行时数据区——虚拟机栈

文章目录 1、虚拟机栈概述1.1、StackOverflowError1.2、OOM异常 2、栈的存储单位3、局部变量表3.1、局部变量表简介3.2、Slot 4、操作数栈5、栈顶缓存技术6、动态链接7、方法的调用7.1、方法调用的分类7.2、虚方法与非虚方法7.3、关于invokedynamic指令7.4、方法重写的本质7.5、…

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询 跨越 ManyToManyField 或反查 ForeignKey &#xff08;例如从 Blog 到 Entry &#xff09;时&#xff0c;对多个属性进行过滤会产生这样的问题&#xff1a;是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter()&#xff0c;通过一个例子看&#xf…

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…

Qt应用软件【测试篇】vargrid内存检查工具

文章目录 vargrid介绍vargrid官网vargrid安装常用命令Valgrind的主要命令vargrid介绍 Valgrind是一个用于构建动态分析工具的框架,能自动检测许多内存管理和线程错误,并详细分析程序性能。Valgrind发行版包括七个成熟工具:内存错误检测器、两个线程错误检测器、缓存和分支预…

socket套接字

前言 两个应用程序如果需要进行通讯最基本的一个前提就是能够唯一的标示一个进程&#xff0c;我们知道IP层的ip地址可以唯一标示主机&#xff0c;而TCP层协议和端口号可以唯一标示主机的一个进程&#xff0c;这样我们可以利用ip地址&#xff0b;协议&#xff0b;端口号唯一标示…

工厂生产效率如何提升?这8个重点你不得不看!

企业的竞争本质上就是效率与成本的竞争&#xff08;当然是保证产品质量的前提下&#xff09;&#xff0c;如何持续不断地提高生产效率是企业永续发展的关键问题&#xff0c;提高生产效率也是降低制造成本的根本途径。 当然&#xff0c;我们必须严格根据工艺标准来操作&#xf…

docker存储驱动

目录 一、写时复制和用时分配 二、联合文件系统 2.1、aufs ​编辑 2.2、分层的问题 2.3、overlay 2.4 文件系统区别 三、容器跑httpd案例 3.1、案例1&#xff1a;端口映射 3.2、案例2&#xff1a;制作httpd应用镜像 3.3、案例3&#xff1a;docker数据卷挂载 3.4、案…

探索数据结构:解锁计算世界的密码

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty‘s blog 前言 随着应用程序变得越来越复杂和数据越来越丰富&#xff0c;几百万、…

继承-学习2

this关键字&#xff1a;指向调用该方法的对象&#xff0c;一般我们是在当前类中使用this关键字&#xff0c;所以我们常说代表本类对象的引用 super关键字&#xff1a;代表父类存储空间的标识(可看作父类对象的引用) 父类&#xff1a; package ven;public class Fu {//父类成员…

细嗦MySQL三大日志

文章目录 三大日志&#xff1a;binlog&#xff08;归档日志&#xff09;、redo log&#xff08;重做日志&#xff09;、undo log&#xff08;回滚日志&#xff09;redo log刷盘机制日志文件组 binlog记录格式写入机制 两阶段提交undo log提供回滚操作提供MVCC&#xff08;多版本…

SQL-Labs靶场“46-50”关通关教程

君衍. 一、四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入 二、四十七关 ORDER BY单引号报错注入1、源码分析2、报错注入3、时间盲注 三、四十八关 ODRER BY数字型盲注1、源码分析2、rand()盲注3、if语句盲注4、时间盲注…

Java进阶(锁)——锁的升级,synchronized与lock锁区别

目录 引出Java中锁升级synchronized与lock锁区别 缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java进阶&#xff08;锁&#xff09;——锁的升级&#xff0c;synchronized与lock锁区别 Java中锁升级 看一段代码&#xff1a; public class…

Windows 10 合并磁盘分区 (G and H)

Windows 10 合并磁盘分区 [G and H] 1. 设备和驱动器2. 计算机 -> 管理 -> 存储 -> 磁盘管理3. 删除卷4. 新建简单卷5. 设备和驱动器References 1. 设备和驱动器 2. 计算机 -> 管理 -> 存储 -> 磁盘管理 3. 删除卷 H: -> right-click -> 删除卷 H: 变…
推荐文章