跳转至

Slurm 阶段 3:配置文件详解(EDA 行业规范版)

基于真实集群 2026-09-08 重新取证。用户已按 EDA 行业规范调整配置(slurm.conf 1454B→6089B),本文档以调整后配置为基准重写。 Slurm 26.05.2,CentOS 7(cgroup v1),configless 模式,配置目录 /usr/local/slurm-26.05/etc/,控制节点 k8s-master-01(192.168.0.2),3 计算节点 k8s-node-01/02/03(每节点 16C/32010MB)。 业务定位:Synopsys/Cadence/Mentor EDA 工具流(VCS/Verdi/Innovus/Calibre/DC-Shell)。 所有"生效值"均以 scontrol show config 实际输出为准(标注"配置写了但未生效"的坑)。


〇、调整后配置文件快照

配置目录 /usr/local/slurm-26.05/etc/

文件 权限/属主 说明
slurm.conf 644 root 6089B,EDA 行业规范版(本次重写基准)
cgroup.conf 644 root 仍仅 CgroupPlugin=autodetect(24B,未改)
slurmdbd.conf 600 slurm 记账配置(权限已合规)
topology.conf 644 root 新增,98B(但插件未启用,见坑 4)
gres.conf 不存在 无 GPU
*.bak.20260907_* - 调整前备份(规范保留)

slurm.conf EDA 版结构(功能域划分)

功能域 关键配置 本集群值
基础/认证 ClusterName / SlurmUser / ControlMachine / AuthType cluster / slurm / k8s-master-01 / auth/munge
进程跟踪 ProctrackType / TaskPlugin linuxproc / task/affinity(CentOS7 cgroup v1 权衡)
资源选择 SelectType / SelectTypeParameters cons_tres / CR_Core_Memory
调度器 SchedulerType / SchedulerParameters backfill / 回填深度调优(EDA 并发)
优先级 PriorityType / 权重 multifactor + 完整权重(FairShare=10000)
抢占 PreemptType / PreemptMode / PreemptExemptTime preempt/qos / REQUEUE / 30min
记账 AccountingStorageTRES / StoreFlags 含 EDA license TRES
资源默认 DefMemPerCPU / MaxMemPerCPU 2048 / 8192(EDA 每核2GB)
钩子 Prolog/Epilog/TaskProlog 全套 6 个 EDA 脚本已就位
分区 4 个 EDA 分区 interactive/compile/regression/long
节点 NodeName + Features 3 节点 + 标签 intel,centos7,skx-16c
电源管理 Suspend/ResumeProgram 配了但脚本缺失(被 Slurm 自动禁用,见坑 2)
拓扑 topology.conf 文件存在但 tree 插件未启用(见坑 4)

调整前后核心对比

维度 调整前(基础版) 调整后(EDA 规范版)
分区 单一 EDA(无限时) 4 业务分区,时限 4h/24h/8h/72h
QOS 仅 normal(Priority=0) 4 级 QOS:interactive(100)>regression(50)>normal(20)>long(10)
调度 SchedulerParameters=null bf_window=14400、bf_max_job_test=500、defer 等
优先级 multifactor 但权重全 0(=FIFO) 权重完整:FairShare=10000/QOS=2000/Age=1000
抢占 关闭 preempt/qos + REQUEUE + ExemptTime=30min
记账 TRES cpu/mem/energy/node... 新增 license/vcs,verdi,innovus,calibre,dc_shell
内存默认 DefMemPerCPU=1024 2048(EDA 仿真基线),MaxMemPerCPU=8192
Prolog/Epilog 无 6 个钩子脚本全就位
节点标签 无 Features=intel,centos7,skx-16c
作业上限 MaxJobCount=10000 100000 + MaxArraySize=100000
强制限制 无 EnforcePartLimits=ANY
cgroup 强隔离 未启用 仍未启用(CentOS7 v1 权衡,见体检 1)
AccountingStorageEnforce none 仍 none(QOS/限额未强制,见体检 3)

一、slurm.conf 按 EDA 功能域精讲

1.1 基础集群信息

ClusterName=cluster
SlurmUser=slurm
ControlMachine=k8s-master-01     # 旧式名=SlurmctldHost[0];加 SlurmctldHost[1]=备机 即 HA
AuthType=auth/munge
StateSaveLocation=/var/spool/slurmctld
PluginDir=/usr/local/slurm-26.05/lib/slurm
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmdPidFile=/var/run/slurmd.pid
SlurmctldPort=6817
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmctldParameters=enable_configless   # configless:计算节点免本地 slurm.conf
参数 含义/EDA 场景
ClusterName 集群标识,slurmdbd 按此分库
SlurmUser slurmctld/slurmdbd 运行用户(10086);slurmd 实际以 root 跑(cgroup/用户切换需要,见经验)
StateSaveLocation slurmctld 状态持久化;本集群实测写入慢(500-750ms 告警),见体检 6
enable_configless 计算节点 slurmd 用 --conf-server <ctld>:6817 拉配置,改配置只改控制节点一份

1.2 进程跟踪与任务插件(未变,有意权衡)

# 注:CentOS 7 cgroup v1 权限限制,改用 linuxproc + affinity
ProctrackType=proctrack/linuxproc
TaskPlugin=task/affinity
  • proctrack/linuxproc:靠 /proc 扫描追踪进程,作业结束可能漏杀残留进程(EDA 工具常派生子进程)。
  • task/affinity:CPU 亲和性绑定,无 cgroup 硬隔离(内存超限不靠 Slurm 杀,依赖内核 OOM killer)。
  • 行业标准推荐 proctrack/cgroup + task/cgroup,task/affinity + cgroup.conf ConstrainCores/RAMSpace=yes。本集群因 CentOS7 cgroup v1 + 现有 k8s 混部(节点有 kubepods.slice),暂保持 linuxproc。这是有意识的权衡,非遗漏。

1.3 资源选择与调度(EDA 并发调优,重点)

SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
SchedulerType=sched/backfill
SchedulerParameters=bf_window=14400,bf_resolution=600,bf_max_job_test=500,bf_max_job_part=200,bf_continue,pack_seq_at_end,sched_min_age=30,defer
SchedulerTimeSlice=30
参数 本集群值 含义与 EDA 场景
SelectType cons_tres 按 TRES(CPU/Mem/license)细粒度分配,节点可多作业共享(EDA regression 大量小作业必须)
SelectTypeParameters CR_Core_Memory 按核+内存为可消费资源
SchedulerType backfill 回填调度:低优先级作业"填空",提升利用率
bf_window 14400(秒=4小时) 回填展望窗口:只尝试预计在 4h 内能启动的回填作业(EDA 长作业多,窗口短会饿死回填)
bf_resolution 600(秒) 回填时间轴分辨率(10分钟粒度,降低计算量)
bf_max_job_test 500 每次回填扫描最多试排 500 个作业
bf_max_job_part 200 单分区最多试排 200
bf_continue - 扫描到窗口末尾后继续(尽量多回填)
pack_seq_at_end - pack job(异构/打包作业)排在末尾
defer - 作业提交后不立即触发完整调度,合并到下一个调度周期(高提交率时降负载)
sched_min_age=30 ⚠️疑似无效 标准参数名是 sched_min_interval;sched_min_age 未在官方文档中,实际可能被忽略(见坑 5)
SchedulerTimeSlice 30 gang 时间片(配合 interactive 分区 OverSubscribe 共享轮转)

1.4 优先级与公平份额(EDA 多因子,本次核心增强)

PriorityType=priority/multifactor
PriorityFlags=FAIR_TREE,MAX_TRES,ACCRUE_ALWAYS,SMALL_RELATIVE_TO_TRES
PriorityDecayHalfLife=14-00:00:00
PriorityMaxAge=7-00:00:00
PriorityWeightAge=1000
PriorityWeightFairshare=10000
PriorityWeightJobSize=1000
PriorityWeightPartition=100
PriorityWeightQOS=2000
PriorityWeightTRES=CPU=100,Mem=200
PriorityFavorSmall=NO

生效值(scontrol show config 实测):

PriorityType            = priority/multifactor
PriorityFlags           = ACCRUE_ALWAYS,MAX_TRES          # 注意:FAIR_TREE/SMALL_RELATIVE_TO_TRES 未生效
PriorityWeightAge       = 1000
PriorityWeightFairShare = 10000                           # 公平份额权重最高
PriorityWeightJobSize   = 1000
PriorityWeightPartition = 100
PriorityWeightQOS       = 2000
PriorityWeightTRES      = CPU=100,Mem=200
PriorityDecayHalfLife   = 14-00:00:00
PriorityMaxAge          = 7-00:00:00
因子 权重 EDA 业务含义
Fairshare(公平份额) 10000 主导因子:历史用量少的团队优先(EDA 多团队共享,防某团队霸占)
QOS 2000 interactive QOS 作业优先于 batch
Age(等待老化) 1000 排队越久优先级越高(防 regression 小作业饥饿)
JobSize 1000 作业大小因子(配合 PriorityFlags)
TRES CPU=100,Mem=200 申请资源越多优先级略高(权重小,避免大作业长期压制小作业)
Partition 100 分区因子
参数 含义
PriorityDecayHalfLife=14天 历史用量 14 天衰减一半(EDA regression 典型周期)
PriorityMaxAge=7天 等待老化上限(排队 7 天 Age 因子封顶)
ACCRUE_ALWAYS 作业在任何状态(含排队)都累积优先级年龄
MAX_TRES 作业大小因子按申请的最大 TRES 计算

坑 1:PriorityFlags 写了 4 个值,实际生效仅 ACCRUE_ALWAYS,MAX_TRES。FAIR_TREE(26.05 中公平树已是默认行为,flag 已移除)、SMALL_RELATIVE_TO_TRES(正确名需核对版本)未被识别。配置文件不报错(PriorityFlags 解析容忍未知 flag),但不生效。

1.5 QOS 与抢占(EDA 优先级体系,本次核心增强)

PreemptType=preempt/qos
PreemptMode=REQUEUE
PreemptExemptTime=00:30:00
KillWait=60
CompleteWait=15
UnkillableStepTimeout=120
RequeueExitHold=1

生效值:PreemptType=preempt/qos、PreemptMode=REQUEUE、PreemptExemptTime=00:30:00、KillWait=60。

数据库 QOS 实测(sacctmgr show qos):

QOS Priority MaxWall MaxJobsPerUser PreemptMode GrpTRES EDA 用途
interactive 100 4h 4 requeue cpu=16 Verdi 波形/Innovus GUI,最高优先,可抢占
regression 50 8h 200 cluster cpu=24 回归测试批量小作业
normal 20 1天 50 cluster - compile 默认
long 10 3天 10 suspend - Calibre DRC/LVS 长作业,最低优先,可被抢占挂起

抢占链路:interactive 作业资源不足 → 抢占 low priority(long/normal)作业 → 被抢占作业 REQUEUE(重新排队)→ interactive 立即获得资源。

参数 含义
PreemptType=preempt/qos 按 QOS 关系抢占(QOS 的 Preempt 列表在 sacctmgr 配置)
PreemptMode=REQUEUE 被抢占作业重新排队(而非 SUSPEND 挂起或 CANCEL 取消)
PreemptExemptTime=30min 运行不足 30 分钟的作业豁免被抢占(保护已启动的 EDA 长任务不被频繁打断)
KillWait=60 抢占/取消时 SIGTERM→SIGKILL 间隔 60 秒(EDA 工具需要时间保存现场)
CompleteWait=15 节点等作业收尾额外 15 秒
UnkillableStepTimeout=120 不可杀 step 的超时(防 EDA 许可证僵死进程拖垮节点)
RequeueExitHold=1 被抢占重排队的作业进入 HELD 状态需人工/策略释放(⚠️需确认是否符合预期,否则抢占后作业不会自动重跑)

EDA 抢占设计意图:工程师交互调试(interactive)优先于后台批量(compile/long);regression 量大但单作业小,QOS=50 不被 normal 抢占。

1.6 记账与 EDA license TRES(本次核心增强)

AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=k8s-master-01
AccountingStoragePort=6819
JobCompType=jobcomp/none
AccountingStorageTRES=cpu,mem,energy,node,billing,fs/disk,vmem,pages,license/vcs,license/verdi,license/innovus,license/calibre,license/dc_shell
# AccountingStorageEnforce=qos,limits   (暂不强制)
JobAcctGatherType=jobacct_gather/cgroup
AccountingStoreFlags=jobcomment,job_env,job_script,using_all_steps,elapse_all_steps

生效值实测: - AccountingStorageTRES = cpu,mem,energy,node,billing,fs/disk,vmem,pages,license/calibre,license/dc_shell,license/innovus,license/vcs,license/verdi(license 全部生效) - AccountingStoreFlags = job_env,job_script(仅这两个生效) - AccountingStorageEnforce = none(仍未强制)

参数 含义与 EDA 场景
AccountingStorageTRES 记账的可计费资源。license/* 是 EDA 精髓:把 FlexNet/Synopsys license 作为可调度资源,作业 --gres=license:vcs:4 申请 license,Slurm 调度时防止 license 超用(license 服务器有限授权时关键)
license/vcs VCS 仿真编译 license
license/verdi Verdi 波形调试 license(interactive 用)
license/innovus Innovus 布局布线 license
license/calibre Calibre 物理验证 license(long 分区 DRC/LVS)
license/dc_shell DC 综合 license
JobAcctGatherType=jobacct_gather/cgroup 用 cgroup 采样资源(实测 /sys/fs/cgroup/memory/slurm/ 层级存在)
AccountingStoreFlags 记账额外存:job_env(环境变量)、job_script(作业脚本),便于事后审计复现

坑 3:AccountingStoreFlags 配置写了 5 个值,实际生效仅 job_env,job_script。jobcomment(正确名为 job_comment)、using_all_steps、elapse_all_steps(正确名需核对,可能是 elapsed_rna 等)未被识别,静默忽略。

体检 3(未解决):AccountingStorageEnforce=none 意味着 QOS 限额、association、license 配额配了但不强制——作业可超过 MaxJobsPerUser、不校验 license 数量、未注册用户也能提交。注释说明"用户 account 路径与 EDA 新建层级不一致",待账户体系统一后启用 qos,limits,associations。

1.7 资源默认与作业限制

DefMemPerCPU=2048
DefCpuPerGPU=2
MaxMemPerCPU=8192
TmpFS=/tmp
EnforcePartLimits=YES
MaxJobCount=100000
MaxArraySize=100000
MaxStepCount=40000
MinJobAge=300
MaxDBDMsgs=10000
参数 值 EDA 含义
DefMemPerCPU 2048 MB 每核默认 2GB:VCS/Verdi 仿真典型基线,未指定 --mem 时按此分配
MaxMemPerCPU 8192 MB 每核内存硬上限 8GB(防单作业申请超量内存)
DefCpuPerGPU 2 每 GPU 默认配 2 核(本集群无 GPU,预留)
TmpFS /tmp 作业临时目录(EDA 编译产生大量中间文件;⚠️/tmp 非共享,见阶段2坑)
EnforcePartLimits ANY(配置写 YES) 强制分区限额:分区 MaxTime/MaxCPUsPerNode 等对所有作业生效(含 root/关联更宽的用户)
MaxJobCount 100000 slurmctld 内存保留作业数(EDA regression 数组作业量大,从 1 万调到 10 万)
MaxArraySize 100000 单作业数组最大下标(回归测试 --array=0-99999)
MaxStepCount 40000 单作业最大 step 数

1.8 EDA 四分区体系(本次核心增强)

PartitionName=interactive Nodes=k8s-node-[01-03] Default=NO  MaxTime=04:00:00 State=UP OverSubscribe=YES QOS=interactive
PartitionName=compile     Nodes=k8s-node-[01-03] Default=YES MaxTime=24:00:00 State=UP                     QOS=normal
PartitionName=regression  Nodes=k8s-node-[01-03] Default=NO  MaxTime=08:00:00 State=UP                     QOS=regression MaxCPUsPerNode=16
PartitionName=long        Nodes=k8s-node-[01-03] Default=NO  MaxTime=72:00:00 State=UP                     QOS=long

实测(scontrol show partition / sinfo):

分区 时限 QOS 特殊属性 业务场景
interactive 4h interactive OverSubscribe=YES:4(超售4倍,时间片轮转) Verdi 波形查看、Innovus GUI、交互调试;短时限防长期占用
compile(默认*) 24h normal - VCS/Vivado/DC-Shell 综合编译,长时批处理
regression 8h regression MaxCPUsPerNode=16 大量小作业回归(数组),单作业不超节点全核
long 72h long QOS 抢占模式=suspend(可被挂起) Calibre DRC/LVS 物理验证,超长时
分区字段 含义
Default=YES 默认分区(仅一个),未指定 -p 时进 compile
OverSubscribe=YES:4 interactive 允许节点超售 4 倍(4 个交互作业共享 CPU,靠 SchedulerTimeSlice=30 秒时间片轮转),适合交互低 CPU 占用场景
MaxCPUsPerNode=16 regression 单作业每节点最多用 16 核(=全核,防止超大数组任务独占)
MaxTime 作业最大墙钟时间,超时 Slurm 终止
QOS 分区默认 QOS(作业也可指定更高权限的 QOS)

作业提交示例:

sbatch -p interactive --qos=interactive --wrap="verdi -ssf wave.fsdb"          # 交互调试
sbatch -p compile     --wrap="vcs -full64 -f filelist.f"                       # 编译
sbatch -p regression  --array=0-999  --wrap="./reg_test.sh \$SLURM_ARRAY_TASK_ID"  # 回归
sbatch -p long        --gres=license:calibre:4 --wrap="calibre -drc rule.rule" # 物理验证

1.9 Prolog/Epilog 钩子体系(EDA 作业前后处理,本次核心增强)

Prolog=/usr/local/slurm/prolog_eda.sh
Epilog=/usr/local/slurm/epilog_eda.sh
PrologEpilogTimeout=120
PrologSlurmctld=/usr/local/slurm/prolog_slurmctld_eda.sh
EpilogSlurmctld=/usr/local/slurm/epilog_slurmctld_eda.sh
TaskProlog=/usr/local/slurm/task_prolog_eda.sh
TaskEpilog=/usr/local/slurm/task_epilog_eda.sh

6 个脚本实测全部存在且可执行(-rwxr-xr-x),作业 253 端到端验证通过(COMPLETED,钩子未致失败)。

钩子 运行位置/身份 触发时机 EDA 典型用途
Prolog 计算节点/root 作业在该节点启动前 创建工作目录、检查 license 可用性、加载 EDA 工具环境变量、清理上次残留、挂载专用存储
Epilog 计算节点/root 作业结束后 释放 license、清理临时文件、采集 license 使用日志、回传结果
TaskProlog 计算节点/作业用户 每个 task 启动前 设置 per-task 环境(LM_LICENSE_FILE、线程数)
TaskEpilog 计算节点/作业用户 每个 task 结束后 per-task 清理
PrologSlurmctld 控制节点/SlurmUser 作业被调度时(slurmctld 侧) 全局记账、license 预占、跨节点协调
EpilogSlurmctld 控制节点/SlurmUser 作业完成时 全局记账收尾、通知
参数 含义
PrologEpilogTimeout=120 钩子脚本超时 120 秒(防卡死;超时后 Slurm 继续/标记节点异常)
失败语义 Prolog 返回非 0:作业被重新排队(节点上作业不启动);Epilog 返回非 0:节点可能被 DRAIN

1.10 超时、服务恢复与健康检查

ReturnToService=2
SlurmdTimeout=300
SlurmctldTimeout=30
InactiveLimit=120
BatchStartTimeout=120
HealthCheckInterval=300
HealthCheckProgram=/usr/local/bin/slurm_health_check.sh
HealthCheckNodeState=ANY
MailProg=/usr/sbin/sendmail
参数 值 含义
ReturnToService 2 任何 DOWN 节点恢复后自动回集群(最积极)
SlurmdTimeout 300 节点心跳 300 秒不通判 DOWN
SlurmctldTimeout 30(从 120 调低) HA 备份接管前等待(单控制点影响小;HA 时调短可更快切换)
InactiveLimit 120(从 0 启用) srun/salloc 闲置 120 秒自动断开(EDA 工程师忘关交互会话时回收资源)
BatchStartTimeout 120(从 10 调高) 批处理 step 启动等待 120 秒(EDA 工具环境加载慢,防误判启动失败)
HealthCheckProgram slurm_health_check.sh 每 300 秒检查 NFS/内存/磁盘/munge,失败节点 DRAIN
MailProg sendmail 作业状态邮件通知(--mail-type=END,FAIL)

1.11 电源管理(⚠️配置与脚本不一致)

SuspendProgram=/usr/local/slurm/suspend_nodes.sh
ResumeProgram=/usr/local/slurm/resume_nodes.sh
SuspendTime=3600
SuspendRate=20
ResumeRate=20

实测生效值:SuspendProgram/ResumeProgram/SuspendTime=3600/SuspendRate=20 均生效,但两个脚本文件不存在。

slurmctld 日志实测:

error: power_save program /usr/local/slurm/suspend_nodes.sh not found
error: Invalid SuspendProgram PowerAction __suspendprog__
power: automatic power save mode disabled        # ← Slurm 自动禁用电源节能
结论 说明
✅ 当前安全 Slurm 检测脚本缺失后自动禁用 power save,节点不会被误挂起(sinfo 无 CLOUD/POWER 标志)
⚠️ 配置卫生 每次 reconfigure 刷 4 行 error 日志;且若有人误创建同名空脚本,电源管理会突然启用
正确做法 EDA 节点常驻不需要电源管理 → 注释/删除这 4 行;若未来要节能 → 创建真实挂起/恢复脚本(IPMI/云 API)后再启用

1.12 拓扑与节点定义

# slurm.conf(拓扑插件被注释)
# TopologyPlugin=topology/tree
# TopologyParam=SwitchAsNodeRank

# topology.conf(文件存在)
SwitchName=root Nodes=k8s-node-[01-03]

# 节点定义
NodeName=k8s-node-0X CPUs=16 Sockets=16 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=32010 State=UNKNOWN Features="intel,centos7,skx-16c"
  • 坑 4:topology.conf 已写(3 节点挂 1 个 root 交换机),但 slurm.conf 里 TopologyPlugin=topology/tree 被注释,实际生效 TopologyPlugin=topology/flat,topology.conf 是死配置(网络感知调度不生效)。3 节点单交换机环境影响不大,但应明确:要么启用插件、要么删除 topology.conf。
  • Features:节点标签 intel,centos7,skx-16c 已生效(实测 AvailableFeatures/ActiveFeatures 均识别),作业可用 --constraint=skx-16c 选节点。
  • State=UNKNOWN:初始状态,slurmd 注册后自动转 IDLE。
  • 拓扑 Sockets=16/CoresPerSocket=1 仍建议用计算节点 slurmd -C 实测值校正(体检 7)。

二、其他配置文件

2.1 cgroup.conf(未变)

CgroupPlugin=autodetect
  • CentOS 7 实测为 cgroup v1(cpuset/cpu/memory/freezer 等独立层级挂载)。
  • 实测 slurm 已建采样层级:/sys/fs/cgroup/cpu/slurm、/sys/fs/cgroup/memory/slurm、/sys/fs/cgroup/cpuacct/slurm(jobacct_gather/cgroup 资源采样用);节点级目录 slurm_k8s-node-01。
  • 但无 ConstrainCores/ConstrainRAMSpace:不绑核、不硬限内存。作业内存超限靠内核 OOM killer(可能误杀节点进程),而非 Slurm 精确终止作业。
  • 生产强化模板(需同步改 slurm.conf ProctrackType/TaskPlugin): ini CgroupPlugin=autodetect ConstrainCores=yes ConstrainRAMSpace=yes ConstrainDevices=yes AllowedRAMSpace=100 MaxRAMPercent=95 SignalChildrenProcesses=yes

2.2 gres.conf(不存在)

无 GPU 节点,gres.conf 不需要。GPU/异构资源时配置(Trae 模拟场景):

# slurm.conf: GresTypes=gpu  + NodeName 行加 Gres=gpu:2
# gres.conf: Name=gpu Type=A100 File=/dev/nvidia0 CPUs=0-15

注:EDA license 资源通过 AccountingStorageTRES=license/* + --gres=license:vcs:n 调度,不需要 gres.conf(license 是全局计数资源,由 slurmdbd/slurmctld 管理,非节点本地设备)。

2.3 slurmdbd.conf

AuthType=auth/munge
DbdHost=k8s-master-01
SlurmUser=slurm
StorageType=accounting_storage/mysql
StorageHost=192.168.0.2
StoragePort=3306
StorageUser=slurm
StoragePass=slurm4630        # ⚠️弱口令(体检 8)
StorageLoc=slurm_acct_db
  • 文件权限 600 slurm:slurm 已合规(含口令必须 0600)。
  • slurmdbd 实测 active,QOS/账户读写正常(sacctmgr 可见 4 级 QOS)。
  • 修改 slurmdbd.conf 需重启 slurmdbd(非 reconfigure)。
  • 生产建议:强口令、PurgeJobAfter/PurgeEventAfter 定期清理防库膨胀。

2.4 topology.conf

SwitchName=root Nodes=k8s-node-[01-03]

见坑 4:文件存在但 tree 插件未启用,当前不生效。


三、配置生效机制(26.05 实测结论)

3.1 三类生效方式

变更对象 生效方式 说明
slurm.conf 多数参数(权重/QOS引用/钩子/超时/分区字段) scontrol reconfigure 热加载不中断作业;EDA 版调整后 reconfigure 已成功加载 4 分区
slurm.conf 部分参数(节点硬件 CPUs/RealMemory、端口、AuthType、ProctrackType/TaskPlugin) 需重启对应守护 进程跟踪/任务插件改动需重启 slurmd
slurmdbd.conf 重启 slurmdbd systemctl restart slurmdbd
cgroup.conf / gres.conf / topology.conf(启用时) 重启 slurmd / slurmctld 节点级配置
QOS / 账户 / association sacctmgr add/modify 写数据库 无需 reconfigure,对新作业立即生效

3.2 配置校验与容错(26.05)

  • 26.05 无 slurmctld -t;校验靠 scontrol reconfigure 时客户端解析。
  • 顶级参数非法(未知键/非法值)→ fatal: Unable to process configuration file 中止,旧配置继续运行,集群不崩。
  • 子参数容忍度不同:
  • SchedulerParameters/PriorityFlags/AccountingStoreFlags 等逗号分隔的键值/标志列表,不认识的子项静默忽略(不 fatal 但不生效)——这就是坑 1/3/5 没报错却没生效的原因。
  • 因此改这类参数后必须用 scontrol show config 核对生效值,不能只看配置文件。
  • 变更闭环标准流程(备份→改→reconfigure→show config 核对→回滚)见同目录 slurm_config_change_demo.sh。

四、调整后配置体检(实测结论)

4.1 上一版 10 项问题的处置验证

# 上版问题 调整后状态 证据
1 ProctrackType=linuxproc 进程追踪弱 ⚠️保留(有意权衡) 配置注释"CentOS7 cgroup v1 权限限制";仍建议后续 slurmd 以 root 跑 proctrack/cgroup
2 TaskPlugin 缺 task/cgroup 无硬隔离 ⚠️保留(同上) cpuset 无作业级绑定;内存靠内核 OOM
3 AccountingStorageEnforce=none 不强制 ⚠️仍 none show config 实测 none;QOS 限额配了不强制,待账户统一
4 multifactor 权重全 0(=FIFO) ✅已修复 FairShare=10000/QOS=2000/Age=1000 全部生效
5 节点 Sockets=16 拓扑可疑 ⚠️未校正 仍 16:1:1,建议 slurmd -C 核对
6 slurmd 以 root 运行 ✅保持 root(合理) 经验确认 slurmd 管 cgroup/切用户需 root
7 数据库弱口令 slurm4630 ⚠️未改 slurmdbd.conf 0600 已合规,口令仍弱
8 JobCompType 未外部记录 ✅保持 none 合理 26.05 无 jobcomp/slurmdbd 插件,none 正确
9 未启用抢占/QOS ✅已修复 preempt/qos+REQUEUE+4 级 QOS 生效
10 无 HA ⚠️仍单点 学习环境可接受

4.2 本次调整新引入/需处理项

# 问题 实测证据 建议
A 电源管理脚本缺失 slurmctld 日志 power_save program suspend_nodes.sh not found + automatic power save mode disabled EDA 节点常驻无需节能 → 注释 Suspend/ResumeProgram 4 行;或创建真实脚本后再启用
B topology.conf 死配置 文件存在但 TopologyPlugin=flat(tree 被注释) 启用 topology/tree 或删除 topology.conf
C PriorityFlags 部分未生效 show config 仅 ACCRUE_ALWAYS,MAX_TRES;FAIR_TREE/SMALL_RELATIVE_TO_TRES 被忽略 26.05 移除/改名,查 scontrol show config 用有效值
D AccountingStoreFlags 部分未生效 仅 job_env,job_script 生效;jobcomment/using_all_steps/elapse_all_steps 被忽略 用 26.05 正确标志名(job_comment 等)或删除
E SchedulerParameters 含疑似无效键 sched_min_age=30 非标准名(标准 sched_min_interval) 改 sched_min_interval 并 show config 核对
F StateSaveLocation 写入慢 日志持续告警 Saving to StateSaveLocation took 500-750ms 迁移到快速本地 SSD/独立磁盘;当前会延迟所有状态保存操作
G RequeueExitHold=1 语义 被抢占重排队作业进 HELD 确认是否希望抢占后自动重跑(Hold 需人工 release 才会再调度)
H 大量历史 .bak 堆积 etc 目录 6+ 个 .bak 归档清理,保留最近 1-2 份

4.3 规范做得好的项(保持)

  • ✅ 4 分区 + 4 级 QOS + 抢占体系完整,EDA 业务映射清晰(interactive 抢占 long)
  • ✅ Fairshare 多因子权重真正生效(FairShare 主导)
  • ✅ license TRES 纳入记账(EDA license 治理基础)
  • ✅ 6 个 Prolog/Epilog 钩子脚本就位且可执行,作业验证通过
  • ✅ EnforcePartLimits=ANY 分区限额强制
  • ✅ MaxJobCount/MaxArraySize 按 regression 并发放大
  • ✅ 配置备份规范(.bak.时间戳)、slurmdbd.conf 0600
  • ✅ KillWait 调 60s 给 EDA 工具保存现场时间

五、常见故障与排查(EDA 配置类)

现象 根因 排查/解决
reconfigure 后 4 分区没出现 配置 fatal 中止(顶级参数非法) journalctl -u slurmctld 找第一条 error;scontrol reconfigure 输出有 fatal 则旧配置仍在运行;修正后重新 reconfigure
配了 PriorityFlags/StoreFlags 但行为没变 子标志名非法被静默忽略(坑 C/D) 以 scontrol show config 生效值为准;查 26.05 有效标志名
日志刷 power_save program not found SuspendProgram/ResumeProgram 脚本不存在 EDA 常驻节点注释掉 Suspend/Resume 行后 reconfigure;或创建脚本
QOS 限额不生效(用户超额仍能提交) AccountingStorageEnforce=none 账户统一后设 AccountingStorageEnforce=qos,limits,associations(需 slurmdbd 账户体系统一)
作业被抢占后一直不重跑 RequeueExitHold=1 使重排队作业进 HELD squeue 看 JOB_REASON;scontrol release \<jobid>;或按需取消 RequeueExitHold
license 作业超用授权 Enforce 未开 + license 仅记账未强制 启用 limits 强制;license 计数靠 sacctmgr 定义全局 GRES/tres
EDA 作业启动慢被误判失败 BatchStartTimeout 太短 已调 120s;仍慢继续调大并查 Prolog 执行时间
slurmctld 周期性卡顿 StateSaveLocation 磁盘慢(本集群实测) 迁移 /var/spool/slurmctld 到快速磁盘;iostat 验证
Prolog 失败作业反复 PD Prolog 脚本退出码非 0 slurmd 日志看 Prolog;手动执行 /usr/local/slurm/prolog_eda.sh 排查
interactive 分区作业互相卡 OverSubscribe=YES:4 超售 + 时间片 SchedulerTimeSlice 调优;交互负载高时降超售倍数

六、阶段 3 自测题(EDA 版)

  1. EDA 集群 4 个分区各是什么时限、QOS、场景?(答:interactive 4h/qos100/交互;compile 24h/qos20/编译默认;regression 8h/qos50/回归数组;long 72h/qos10/物理验证)
  2. license TRES 怎么配?为什么 EDA 需要它?需要 gres.conf 吗?(答:AccountingStorageTRES 加 license/vcs 等,作业 --gres=license:vcs:n;防 FlexNet license 超用;不需要 gres.conf,license 是全局计数资源)
  3. Fairshare 权重 10000 说明什么?DecayHalfLife=14天含义?(答:公平份额是主导调度因子;历史用量 14 天衰减一半)
  4. interactive 抢占 long 的完整链路?被抢占作业去哪?(答:interactive 资源不足→按 QOS preempt 列表抢占→long 作业 REQUEUE 回队列;ExemptTime 30min 保护刚启动作业)
  5. 为什么 SuspendProgram 配了节点却没被挂起?(答:脚本不存在,slurmctld 检测后 automatic power save mode disabled;但应注释配置消除 error)
  6. topology.conf 存在为何网络感知调度没生效?(答:TopologyPlugin=topology/tree 被注释,实际 topology/flat)
  7. DefMemPerCPU=2048 与 MaxMemPerCPU=8192 区别?(答:未指定 --mem 时每核默认 2GB;每核最多申请 8GB 硬上限)
  8. Prolog 和 TaskProlog 运行身份/位置有何不同?Prolog 返回非 0 会怎样?(答:Prolog 节点 root 作业前;TaskProlog 用户身份每 task 前;Prolog 失败作业重新排队)
  9. 怎么确认一个逗号分隔的配置参数真的生效了?(答:scontrol show config 看生效值,不看配置文件;非法子项静默忽略)
  10. OverSubscribe=YES:4 在 interactive 分区的作用?依赖哪个参数?(答:允许 4 倍超售共享节点,靠 SchedulerTimeSlice=30 秒时间片轮转)

附录:本阶段取证命令(可复现)

# 配置文件
ssh root@192.168.0.2 "cat -n /usr/local/slurm-26.05/etc/slurm.conf; echo ---; cat /usr/local/slurm-26.05/etc/topology.conf"
# 生效值(核对配置是否真生效)
ssh root@192.168.0.2 "/usr/local/slurm-26.05/bin/scontrol show config"
# QOS / 分区 / 节点
ssh root@192.168.0.2 "/usr/local/slurm-26.05/bin/sacctmgr show qos format=Name,Priority,MaxWall,MaxJobsPU,PreemptMode,GrpTRES"
ssh root@192.168.0.2 "/usr/local/slurm-26.05/bin/scontrol show partition"
ssh root@192.168.0.2 "/usr/local/slurm-26.05/bin/scontrol show nodes | grep -E 'NodeName|Features|State='"
# 电源/配置错误日志
ssh root@192.168.0.2 "journalctl -u slurmctld --since today | grep -iE 'power|suspend|error|warning' | tail"
# cgroup 层级(计算节点)
ssh root@192.168.0.5 "ls /sys/fs/cgroup/memory/slurm/ ; mount | grep cgroup | head -3"
# 钩子脚本就位检查
ssh root@192.168.0.2 "ls -la /usr/local/slurm/*.sh"

来源:/home/rain/Documents/slurm/slurm_study/slurm_study_plan/阶段3_配置文件/阶段3_配置文件详解.md | 最后更新:2026-09-08 21:16(由 build/sync.py 同步,请勿在站点侧修改)