Slurm单节点配32CPU最多仅同时运行16个作业如何解决
Slurm单节点最大运行作业数仅16的排查修复方案
你当前NodeName配置段的CPUs=32 CoresPerSocket=16 ThreadsPerCore=2和16物理核、双线程的硬件是匹配的,删除参数后slurmd启动报硬件不匹配是正常校验逻辑,这部分配置不需要调整。单节点最多同时跑16个作业的问题,按优先级依次检查以下配置项即可:
- 首先确认资源选择插件配置正确
仅配置SelectTypeParameters=CR_CPU不会生效,必须匹配正确的资源选择插件:- Slurm版本低于20.11时,
SelectType必须设为select/cons_res - Slurm版本高于等于20.11时,
SelectType必须设为select/cons_tres
如果SelectType使用默认的select/linear,资源会按Socket/整节点维度分配,CPU级分配规则完全不生效。
- Slurm版本低于20.11时,
- 检查分区(Partition)级限制参数
打开slurm.conf找到对应队列的PartitionName配置行,排查以下参数:- 若配置了
MaxCPUsPerNode=16,会直接限制单节点最多可分配16个CPU给作业,将值改为32即可 - 若配置了
DefaultCpusPerTask=2,默认每个作业任务会申请2个CPU,32个CPU刚好只能承载16个单任务作业,将值改为1即可 - 若配置了
MaxJobsPerNode=16,会直接限制单节点同时运行的作业总数上限,将值改为32或注释掉使用默认无限制即可 - 检查
DefMemPerNode/DefMemPerCPU参数,如果单作业默认内存申请设置过高,会因为内存容量不足触发调度上限,可根据节点实际内存调低默认内存申请值。
- 若配置了
- 检查全局默认调度参数
在控制节点执行scontrol show config查看以下全局参数值:DefCpuPerTask:全局默认每个任务分配的CPU数,若值为2会导致单CPU作业实际占2个CPU,改为1即可MaxTasksPerNode:全局单节点最大运行任务数,若值为16会直接卡上限,改为0(无限制)或32即可FastSchedule:若值为2,Slurm会严格使用配置文件写死的硬件参数,忽略实际硬件探测结果,容易出现CPU计数偏差,改为1让Slurm启动时自动识别硬件线程数即可。
- 检查cgroup资源约束配置
如果开启了cgroup资源限制(cgroup.conf中ConstrainCores=yes),排查以下配置:- 检查是否配置了
AllowedCores参数,人为限制了节点可用CPU范围为前16个逻辑核,注释掉该参数或改为0-31即可 - 若开启了
TaskAffinity=yes,默认绑定规则可能将每个作业绑定到单个物理核心(占用2个超线程),可临时将ConstrainCores设为no重启服务测试,确认是cgroup限制后调整CPU绑定规则为按逻辑CPU分配即可。
- 检查是否配置了
- 验证资源识别与占用情况
执行scontrol show node node0查看节点TRES配置:确认CfgTRES字段中CPU总数为32,检查是否存在系统预留、管理员预留占用了16个CPU(可通过
scontrol show reservation查看是否存在CPU预留规则)。
提交测试作业时可显式指定--cpus-per-task=1,通过squeue -o "%.18i %.9P %.8j %.8u %.2t %.10M %.6D %C"查看每个作业实际占用的CPU数,确认是否存在隐式的资源多申请问题。
所有配置修改完成后,需要重启slurmctld服务以及所有计算节点的slurmd服务,重新加载配置后生效。
内容的提问来源于stack exchange,提问作者CLTECH
相关产品推荐
相关产品推荐

