Slurm与drake联用下空闲Job Array Worker资源释放问题咨询
解决
{drake}配合Slurm Array时空闲worker不释放资源的方案 启用内置的空闲worker自动回收逻辑
{drake}默认配置下,已成功连接的worker即使无任务可拉取,也会持续轮询等待直到整个作业流全部结束,不会主动退出进程。可在调用核心执行函数make()时,通过参数调整关闭空闲worker常驻逻辑:- 将
recycle_empty_workers参数设置为FALSE(默认为TRUE即维持所有worker的常驻连接),切断无任务状态下worker的长期驻留逻辑 - 配置
worker_idle_timeout参数(单位为秒),设定连续无任务可领取的最长等待时间,超过阈值后worker会主动退出进程,对应Slurm Array实例随之结束、释放占用的CPU与内存资源
- 将
- 可同步调整
sleep轮询间隔参数,拉长无任务状态下的任务拉取间隔,减少空闲状态下的无效CPU消耗。配置完成后,空闲worker达到超时阈值会直接退出,不再持续输出无意义的WORKER_WAIT状态日志
调度端主动触发剩余空闲worker终止
- 当
{drake}主调度进程确认所有动态分支任务均已完成、无剩余待派发任务时,可主动定位同Slurm Array内仍处于运行状态的实例并批量终止,避免空闲worker长期占位 - 可通过
{drake}提供的drake_progress()接口实时校验任务状态,待所有分支任务状态更新为finished后,执行集群侧的实例终止操作,参考示例逻辑:# 执行所有动态分支任务 drake::make(..., verbose = 0L) # 确认无剩余待运行任务后,终止同Array下的所有剩余worker进程 remaining_jobs <- system2("squeue", args = c("-u", Sys.getenv("USER"), "-r", "-o", "%i", "-n", Sys.getenv("SLURM_JOB_NAME")), stdout = TRUE) system2("scancel", args = remaining_jobs)
提交侧参数优化降低无效资源占用
- 结合任务运行时长的差异分布,调整Slurm Array的提交规模,避免提交的worker数量远大于峰值可并行运行的任务数。可适当降低初始提交的worker数量,让动态分支任务在worker队列中排队轮询,而非提前抢占大量集群资源处于空闲等待状态
- 可在Slurm提交脚本中为每个Array实例设置合理的运行时长上限,避免异常场景下空闲worker永久占用集群资源
内容的提问来源于stack exchange,提问作者pat-s
相关产品推荐
相关产品推荐

