逐个清理由“array”命令生成的作业
我在由24台 Raspberry Pi 4B组成的集群上运行 "slurm-wlm 18.08.5-2"。
我有如下Slurm批处理脚本,叫做 "batch":
#!/bin/tcsh
#
#SBATCH -o /tmp/tmp%j.out
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --array=0-9999%96
./runone $SLURM_ARRAY_TASK_ID
"./runone" 会执行这10,000个独立作业中的其中一个,每个作业都会生成一个独立的输出文件。
这个批处理脚本是通过 "sbatch batch" 启动的,预计大约会运行10天。我想在整体数组作业完成前暂停它,这样就能关机集群、做一些维护、再开机,并从断电前的位置继续整个数组作业。
理想情况下,我希望阻止任何新的子作业生成,直到没有在运行的子作业;然后暂停数组作业,进行维护(包括关闭所有计算机(包括控制Slurm的那台机器)),把所有设备重新启动,并从原位继续数组作业。
这有可能吗?
我尝试对队列进行DRAIN(清空)操作,但这会让子作业继续生成并等待主数组作业完成,对我来说,这等同于简单地等待主数组作业完成,而不执行任何清空。
重要说明:我对Slurm运行所在的集群有完全的控制权,并且没有其他用户。
要对队列执行DRAIN,我使用的命令:
scontrol update Partition=general State=DRAIN
我还尝试使用以下命令:
scontrol update NodeName=ALL State=DRAIN
但在我的 "slurm.conf" 中并没有定义 "ALL",只有一个名为 "general" 的分区。我的 "slurm.conf" 如下所附。
我已经运行过 sinfo -a:
> sinfo -a
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
general* drain infinite 24 alloc tjl-4B-4GB-[001-024]
我也尝试过 sinfo -R,但输出为空。
下面是我的 "slurm.conf":
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
SlurmctldHost=tjl-4B-4GB-001
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/lib/slurm-llnl/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/lib/slurm-llnl/slurmctld
SwitchType=switch/none
TaskPlugin=task/affinity
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=tjl-pi-pharm
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm-llnl/slurmctld.log
#SlurmdDebug=info
SlurmdLogFile=/var/log/slurm-llnl/slurmd.log
#
#
# Maximums
MaxJobCount=100000
MaxArraySize=10000
#
#
# COMPUTE NODES
NodeName=tjl-4B-4GB-001 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-002 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-003 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-004 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-005 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-006 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-007 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-008 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-009 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-010 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-011 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-012 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-013 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-014 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-015 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-016 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-017 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-018 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-019 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-020 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-021 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-022 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-023 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
NodeName=tjl-4B-4GB-024 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
PartitionName=general Nodes=tjl-4B-4GB-[001-024] Default=YES MaxTime=INFINITE State=UP
解决方案
我尝试对队列进行DRAIN(排空)操作,但这会让子作业继续生成并等待主数组作业完成,对我而言,这等同于简单地等待主数组作业完成、而不执行任何清空。
这并不是清空集群时应有的行为。如果整个集群(所有节点)都被清空,就不应再启动任何数组任务。
请确保你是在清空节点,而不是分区。 通常下面的命令应该能实现你所期望的效果:
scontrol update nodename=ALL state=drain reason='Maintenance needed'
执行完命令后,请通过 sinfo -R 确认所有节点都已被列出。