You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:52:23