SLURM Array Job

在 SLURM 中也有类似 UniScheduler 和 PBS 中 Array Job 的概念,不过它的实现有点意思,下面就说道说道。

首先创建一个 shell 脚本来作为 Array Job 的一个作业,内如如下

$ cat test.sh
#!/bin/sh
srun sleep 120

然后就可以通过 sbatch 命令来提交 Array Job了,如下

sbatch --array=1-10 test.sh

刚提交完还有没有任何作业运行时,使用 squeue 查看作业,可以看到新提交的 Array Job 的 JOBID是 “465_[1-10]”

squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
        465_[1-10]    fluent  test.sh  jhadmin PD       0:00      1 (Resources)

等到有作业已经开始运行后,再使用 squeue 查看作业时,可以看到原来的 “465_[1-10]” 变成了“465_[3-10]”,并且又多出两个运行的作业 “465_1” 和 “465_2”

squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
        465_[3-10]    fluent  test.sh  jhadmin PD       0:00      1 (Resources)
             465_1    fluent  test.sh  jhadmin  R       1:52      1 mycentos6x
             465_2    fluent  test.sh  jhadmin  R       1:52      1 mycentos6x

使用 “scontrol show job” 查看作业时,作业信息如下

scontrol show job
JobId=466 ArrayJobId=465 ArrayTaskId=1 JobName=test.sh
   UserId=jhadmin(502) GroupId=jhadmin(502)
   Priority=4294901719 Nice=0 Account=(null) QOS=(null)
   JobState=RUNNING Reason=None Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:01:09 TimeLimit=UNLIMITED TimeMin=N/A
   SubmitTime=2015-08-14T09:22:57 EligibleTime=2015-08-14T09:22:58
   StartTime=2015-08-14T09:23:51 EndTime=Unknown
   PreemptTime=None SuspendTime=None SecsPreSuspend=0
   Partition=fluent AllocNode:Sid=mycentos6x:17253
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=mycentos6x
   BatchHost=mycentos6x
   NumNodes=1 NumCPUs=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
   Features=(null) Gres=(null) Reservation=(null)
   Shared=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/jhadmin/test.sh
   WorkDir=/home/jhadmin
   StdErr=/home/jhadmin/slurm-465_1.out
   StdIn=/dev/null
   StdOut=/home/jhadmin/slurm-465_1.out
JobId=467 ArrayJobId=465 ArrayTaskId=2 JobName=test.sh
   UserId=jhadmin(502) GroupId=jhadmin(502)
   Priority=4294901719 Nice=0 Account=(null) QOS=(null)
   JobState=RUNNING Reason=None Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:01:09 TimeLimit=UNLIMITED TimeMin=N/A
   SubmitTime=2015-08-14T09:22:57 EligibleTime=2015-08-14T09:22:58
   StartTime=2015-08-14T09:23:51 EndTime=Unknown
   PreemptTime=None SuspendTime=None SecsPreSuspend=0
   Partition=fluent AllocNode:Sid=mycentos6x:17253
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=mycentos6x
   BatchHost=mycentos6x
   NumNodes=1 NumCPUs=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
   Features=(null) Gres=(null) Reservation=(null)
   Shared=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/jhadmin/test.sh
   WorkDir=/home/jhadmin
   StdErr=/home/jhadmin/slurm-465_2.out
   StdIn=/dev/null
   StdOut=/home/jhadmin/slurm-465_2.out
...
JobId=465 ArrayJobId=465 ArrayTaskId=3-10 JobName=test.sh
   UserId=jhadmin(502) GroupId=jhadmin(502)
   Priority=4294901719 Nice=0 Account=(null) QOS=(null)
   JobState=PENDING Reason=Resources Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A
   SubmitTime=2015-08-14T09:22:57 EligibleTime=2015-08-14T09:22:58
   StartTime=2016-08-12T09:57:06 EndTime=Unknown
   PreemptTime=None SuspendTime=None SecsPreSuspend=0
   Partition=fluent AllocNode:Sid=mycentos6x:17253
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=(null)
   NumNodes=1 NumCPUs=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
   Features=(null) Gres=(null) Reservation=(null)
   Shared=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/jhadmin/test.sh
   WorkDir=/home/jhadmin
   StdErr=/home/jhadmin/slurm-465_4294967294.out
   StdIn=/dev/null
   StdOut=/home/jhadmin/slurm-465_4294967294.out

等到 1-9 的Array Job都运行完,10的 Array Job 开始运行时,使用 squeue 查看作业如下,原来的 “465_[m-n]” 消失了,只剩下 “465_10” 作业了。

squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            465_10    fluent  test.sh   kongxx  R       0:53      1 mycentos6x

下面说说取消作业的操作

取消整个array job

scancel 465

取消某个array job

scancel 465_x

如果取消某个中间的 array job,比如“scancel 465_8”命令行输出如下

squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    465_[6-7,9-10]    fluent  test.sh  jhadmin PD       0:00      1 ...
             465_5    fluent  test.sh  jhadmin R       1:52      1 mycentos6x
scontrol show job
JobId=552 ArrayJobId=552 ArrayTaskId=6-7,9-10 JobName=test.sh 
   UserId=jhadmin(500) GroupId=jhadmin(500)
   Priority=4294901695 Nice=0 Account=(null) QOS=(null)
   JobState=PENDING Reason=Resources Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A
   SubmitTime=2015-08-27T11:25:57 EligibleTime=2015-08-27T11:25:58
   StartTime=2015-08-27T12:17:16 EndTime=Unknown
   PreemptTime=None SuspendTime=None SecsPreSuspend=0
   Partition=fluent AllocNode:Sid=mycentos6x:3557
   ReqNodeList=(null) ExcNodeList=(null)
   NodeList=(null) SchedNodeList=mycentos6x
   NumNodes=1 NumCPUs=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
   MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
   Features=(null) Gres=(null) Reservation=(null)
   Shared=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/apps/test/slurm/test.sh
   WorkDir=/apps/test/slurm
   StdErr=/apps/test/slurm/slurm-552_4294967294.out
   StdIn=/dev/null
   StdOut=/apps/test/slurm/slurm-552_4294967294.out 

转载请以链接形式标明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/48210919

### 配置和管理Slurm中的异构弹性作业调度 #### Slurm支持的特性概述 Slurm是一个高度可扩展的工作负载管理和资源分配工具,广泛应用于高性能计算环境。为了有效处理异构集群并实现弹性的作业调度,Slurm提供了多种功能来适应不同类型的硬件架构以及动态调整资源需求。 #### 定义节点属性和支持的处理器类型 对于异构环境的支持,可以通过定义特定于每种硬件配置的节点特征来进行优化。这包括但不限于CPU型号、内存大小和其他附加设备(如GPU)。这些信息可以在`slurm.conf`文件中通过设置NodeName参数指定,并利用CPUs, RealMemory等选项描述具体规格[^1]。 ```bash NodeName=node001-016 CPUs=32 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN Feature=intel,e5-2698v4 NodeName=node017-032 CPUs=40 Sockets=2 CoresPerSocket=20 ThreadsPerCore=2 State=UNKNOWN Feature=intel,e5-2699v4 ``` #### 使用约束表达式请求特定资源配置 当提交任务给Slurm时,可以使用`sbatch`命令配合`--constraint`标志来指明所需的硬件条件。例如,如果某个应用只适合运行在带有E5-2698 v4 CPU 的机器上,则可在脚本头部加入如下指令: ```bash #SBATCH --constraint=intel&e5-2698v4 ``` 这样就能确保该批处理作业只会被安排到符合条件的计算节点上去执行。 #### 实现基于策略的任务优先级排序 除了静态地设定节点外,在面对多变的应用场景下还可以借助FairShare机制或JobPriorityPlugin插件来自定义一套合理的排队规则。前者依据用户的长期贡献度给予相应的权重;后者允许管理员编写复杂的逻辑判断哪些待命队列应该获得更高的重视程度。 #### 动态调整正在运行的任务规模 针对那些能够容忍中途暂停再继续运作的应用程序来说,Slurm也具备良好的伸缩性能力。这意味着一旦检测到有更紧急重要的工作到来,当前占用过多资源的小部分进程会被临时挂起直至腾出足够的空间为止——这一过程由PrologEpilogSupported特性和SuspendTimeOut参数共同控制着其行为模式。 #### 弹性作业的具体实践案例 考虑到某些科学工程领域内存在大量短周期迭代型实验的需求特点,研究者们往往希望尽可能充分利用空闲时段内的闲置算力完成更多次尝试。此时便可通过组合运用上述提到的各种手段达成目标:一方面提前规划好各类机型间的兼容关系以便快速切换部署位置;另一方面则灵活调控各阶段所需实例数量从而减少不必要的等待时间浪费现象发生。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值