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