如何让SLURM调度器分配同一Socket/NUMA节点的CPU资源?
解决SLURM跨Socket分配CPU导致性能下降的问题
要强制SLURM将64核资源分配到同一Socket/NUMA节点,需在sbatch提交脚本中结合调度约束与CPU绑定参数,从调度层面确保资源分配符合要求,具体配置如下:
核心配置方案
在你的sbatch脚本头部添加以下参数:
#SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=64 #SBATCH --cpu-bind=sockets #SBATCH --mem-bind=local #SBATCH --hint=nomultithread
各参数作用:
--nodes=1:限定作业只使用1个节点(你的场景无需多节点)--ntasks=1:单任务(若为MPI多任务,需调整--ntasks并配合--distribution=block:block)--cpus-per-task=64:指定单任务使用64核--cpu-bind=sockets:强制SLURM将所有分配的CPU核绑定到同一个Socket,调度器会优先从单个Socket中分配64核资源,无可用资源时会等待而非跨Socket分配--mem-bind=local:确保作业使用的内存来自CPU所在的NUMA节点(即同一Socket的本地内存),避免跨NUMA内存访问的性能损耗--hint=nomultithread:禁用超线程(若集群开启了超线程,该参数确保分配的是物理核而非逻辑核,进一步避免跨Socket资源混杂)
针对MPI多任务作业的调整
如果你的作业是MPI多任务(比如64个单核任务),需调整参数为:
#SBATCH --nodes=1 #SBATCH --ntasks=64 #SBATCH --cpus-per-task=1 #SBATCH --distribution=block:block #SBATCH --cpu-bind=sockets #SBATCH --mem-bind=local
--distribution=block:block:让SLURM将连续的CPU核分配给同一节点的任务,确保所有64个任务集中在单个Socket内
为什么之前的参数无效?
你尝试的--sockets-per-node=1和--threads-per-socket=64只是节点级别的最低资源要求,SLURM仍会允许跨Socket分配剩余核数;而--cpu-bind=sockets是从调度绑定层面强制资源集中在单个Socket,直接约束了调度器的分配逻辑。
另外你提到的mpirun --bind-to确实无法解决问题,因为它只能在SLURM分配的资源范围内做绑定,无法干预调度器的初始资源分配决策。
内容的提问来源于stack exchange,提问作者Da Teng
相关产品推荐
相关产品推荐

