Slurm集群单节点仅运行1个单线程作业的解决求助
问题:Slurm集群单线程作业节点资源分配优化
我正在搭建新的Slurm集群,对资源分配机制不太熟悉。集群包含4个节点,每个节点配备32核。提交单线程作业时,每个节点仅能运行1个作业,其余作业均处于pending(等待)状态。所有作业均为单线程,仅占用1个核心,我希望每个节点能同时运行32个作业,请问该如何配置实现?
当前squeue输出
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 249 computes freesurf nidb PD 0:00 1 (Resources) 250 computes freesurf nidb PD 0:00 1 (Priority) 251 computes freesurf nidb PD 0:00 1 (Priority) 252 computes freesurf nidb PD 0:00 1 (Priority) 253 computes freesurf nidb PD 0:00 1 (Priority) 254 computes freesurf nidb PD 0:00 1 (Priority) 255 computes freesurf nidb PD 0:00 1 (Priority) 256 computes freesurf nidb PD 0:00 1 (Priority) 257 computes freesurf nidb PD 0:00 1 (Priority) 258 computes freesurf nidb PD 0:00 1 (Priority) 259 computes freesurf nidb PD 0:00 1 (Priority) 260 computes freesurf nidb PD 0:00 1 (Priority) 261 computes freesurf nidb PD 0:00 1 (Priority) 262 computes freesurf nidb PD 0:00 1 (Priority) 263 computes freesurf nidb PD 0:00 1 (Priority) 245 computes freesurf nidb R 8:00 1 compute60 246 computes freesurf nidb R 7:40 1 compute61 247 computes freesurf nidb R 7:19 1 compute62 248 computes freesurf nidb R 6:55 1 compute63
当前slurm.conf节点与分区配置
NodeName=compute60 NodeAddr=10.35.10.110 CPUs=64 Boards=1 SocketsPerBoard=2 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=515827 State=UNKNOWN NodeName=compute61 NodeAddr=10.35.10.111 CPUs=64 Boards=1 SocketsPerBoard=2 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=515827 State=UNKNOWN NodeName=compute62 NodeAddr=10.35.10.112 CPUs=64 Boards=1 SocketsPerBoard=2 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=515827 State=UNKNOWN NodeName=compute63 NodeAddr=10.35.10.113 CPUs=64 Boards=1 SocketsPerBoard=2 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=515827 State=UNKNOWN PartitionName=computes Nodes=compute60,compute61,compute62,compute63 Default=NO MaxTime=INFINITE State=UP
解决方案
1. 检查作业资源请求
先确认已运行作业的资源请求情况,执行:
sacct -j 245 --format=JobID,Nodes,CPUs,ReqCPUs
如果输出中ReqCPUs为64,说明作业默认请求了节点全部CPU资源,导致每个节点只能运行一个作业。
2. 明确指定作业CPU请求
- 提交作业时指定:在提交命令中添加
--cpus-per-task=1,例如:sbatch --cpus-per-task=1 your_job_script.sh - 在作业脚本中指定:在脚本开头添加SBATCH指令:
#SBATCH --cpus-per-task=1
3. 设置全局默认CPU请求(可选)
如果希望所有未指定CPU资源的作业默认只请求1个核心,在slurm.conf中添加:
DefCpusPerTask=1
4. 调整节点CPU配置(按需选择)
你的节点配置中CPUs=64是开启超线程后的逻辑CPU数,物理核心为32:
- 若不需要超线程,修改节点配置为:
这样每个节点可用CPU数为32,刚好匹配物理核心数,可同时运行32个单线程作业。NodeName=compute60 NodeAddr=10.35.10.110 CPUs=32 Boards=1 SocketsPerBoard=2 CoresPerSocket=16 ThreadsPerCore=1 RealMemory=515827 State=UNKNOWN - 若保留超线程,每个节点可运行64个单线程作业,按需调整。
5. 分区默认配置(可选)
给computes分区添加默认CPU请求,修改分区配置行:
PartitionName=computes Nodes=compute60,compute61,compute62,compute63 Default=NO MaxTime=INFINITE State=UP DefaultCPUsPerTask=1
6. 重载Slurm配置
修改slurm.conf后,在控制节点执行以下命令重载配置,无需重启整个集群:
scontrol reconfigure
7. 验证效果
提交多个测试作业,用squeue查看节点运行的作业数量,用sinfo查看节点CPU资源使用情况,确认每个节点可同时运行32个单线程作业。
内容的提问来源于stack exchange,提问作者Greg B
相关产品推荐
相关产品推荐

