Slurm作业异常获取Ryzen CPU全部线程访问权限的问题排查请求
看起来你遇到了Slurm在Ryzen节点上任务CPU亲和性失控的问题——明明想让每个任务只绑定单个线程/核心,结果所有任务都能访问CPU的全部32个线程,而Xeon Phi节点却正常工作。我来帮你梳理几个关键排查方向和解决方案:
先明确你的环境与问题现象
你的硬件与Slurm配置核心信息:
- Ryzen R9 5950x:16核/32线程,对应Slurm节点
amd,归属fast分区 - Xeon Phi 7120p:61核/244线程,对应节点
mic0,归属compute分区 - Slurm版本:21.08.8-2,CentOS7
- 核心配置:
TaskPlugin=task/affinity、SelectType=select/cons_res、SelectTypeParameters=CR_CPU_Memory
问题现象:
提交命令
salloc -p fast -n 8 --threads-per-core=1 --mem=256mb后,用srun -l --cpu_bind=threads cat /proc/self/status | grep Cpus_allowed_list | sort -n查看,所有8个任务的Cpus_allowed_list都是0-31,即全部线程都能访问。
可能的问题点与解决方案
1. 先确认Slurm对Ryzen硬件的识别是否正确
Slurm的亲和性依赖对硬件拓扑的正确识别,先在amd节点上运行:
slurmd -C
查看输出的CPU拓扑信息,确认是否正确识别到1 socket, 16 cores, 2 threads per core(总32 threads)。如果识别错误(比如把线程当成核心),那亲和性肯定会出问题。
如果识别错误,可以尝试在slurm.conf中添加:
TopologyPlugin=topology/tree
强制Slurm正确解析CPU拓扑,修改后重启slurmctld和slurmd服务。
2. 调整TaskPlugin与亲和性约束配置
当前你的TaskPlugin=task/affinity,但缺少强制亲和性约束的参数。可以修改slurm.conf:
# 启用亲和性插件并强制调度器设置CPU绑定 TaskPlugin=task/affinity TaskPluginParam=Sched # 强制Slurm约束任务到分配的核心/线程 ConstrainCores=YES
修改后重启服务:
systemctl restart slurmctld systemctl restart slurmd
3. 修改作业提交命令,明确CPU资源约束
你当前的提交命令没有明确指定--cpus-per-task,Slurm可能默认给每个任务分配全部CPU资源。试试用以下命令提交:
# 明确每个任务用1个CPU线程,绑定到单个线程 salloc -p fast -n 8 --cpus-per-task=1 --threads-per-core=1 --mem=256mb # 或者直接用srun提交并绑定 srun -p fast -n 8 --cpus-per-task=1 --cpu_bind=thread cat /proc/self/status | grep Cpus_allowed_list | sort -n
这里的--cpus-per-task=1是关键,告诉Slurm每个任务只分配1个CPU单元(线程),再配合--cpu_bind=thread强制绑定到单个线程。
4. 启用Cgroup插件增强资源隔离
CentOS7上可以通过Cgroup来强化Slurm的资源约束,避免任务越权访问CPU。在slurm.conf中添加:
CgroupPlugin=cgroup/v1 CgroupMountpoint=/sys/fs/cgroup CgroupAutomount=yes CgroupReleaseAgentDir=/etc/slurm/cgroup ConstrainCpu=yes
创建对应的目录并重启服务:
mkdir -p /etc/slurm/cgroup systemctl restart slurmctld slurmd
Cgroup会通过内核级别的限制,确保任务只能访问分配的CPU资源。
5. 考虑Slurm版本兼容性问题
Slurm 21.08版本对AMD Zen3架构(5950x属于Zen3)的亲和性支持可能存在已知bug。如果以上配置都无效,可以尝试升级Slurm到更高版本(比如22.05或23.02),新版本通常会修复硬件兼容性问题。
总结排查顺序
建议按以下步骤逐步验证:
- 用
slurmd -C确认硬件拓扑识别正确 - 调整
TaskPlugin参数并启用ConstrainCores - 修改作业提交命令,明确
--cpus-per-task=1和--cpu_bind - 启用Cgroup插件增强隔离
- 必要时升级Slurm版本
备注:内容来源于stack exchange,提问作者Igor Popov

