Slurm 与 LSF 对比实测报告¶
执行日期:2026-09-11 | 对比环境:同一套硬件上的共存双调度器(非理论对比,均为真实取证) Slurm 26.05.2(控制节点 k8s-master-01) | IBM Spectrum LSF 10.1.0.0 build 600545 LSF 访问方式:root 直连被拒(
bqueues/bhosts返回User permission denied), 必须使用lsfadmin(admin_group 成员):su - lsfadmin -c 'export PATH=/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/bin:$PATH; bqueues'
一、并存格局实测¶
两侧共用同一组计算节点(k8s-node-01/02/03),账号体系完全对应,这是本集群最值得注意的特征:
| 维度 | Slurm | LSF |
|---|---|---|
| 控制节点 | k8s-master-01 (192.168.0.2) | k8s-master-01(master)、k8s-master-02(backup) |
| 计算节点 | k8s-node-01/02/03 | k8s-node-01/02/03(compute_group) |
| 队列/分区 | 4 分区:interactive(4h)、compile(24h,默认)、regression(8h)、long(72h) | 3 队列:eda_short(60min)、eda_license(1440min)、eda_long(2880min) |
| 账号/用户组 | accounts:teama、teama1、teamb、teamb1、teamc、teamc1、dev、it、ops、root | user groups:teama、teama1、teamb、teamb1、teamc、teamc1、eda_group、admin_group |
| 用户 | rain01/02/03、cloud01、cy01、david01、lws01、cq01 | 同名用户(lsb.users 中逐个登记 MAX_PEND_JOBS) |
| 调度器版本 | 26.05.2 | 10.1(2021-06-10 build) |
账号一一对应意味着可以把同一批用户的业务在两侧平滑迁移,策略可逐条对照翻译。
LSF 进程角色实测(ps 取证)¶
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/lim # Load Information Manager,负载采集
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/res
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/sbatchd # 每个执行主机上的作业执行守护
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/pim # Process Information Manager,进程追踪
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/melim
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/elim.hpc # External Load Information Manager(脚本)
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/mbatchd # Master Batch Daemon(总控)
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/mbschd # Master Batch Scheduler Daemon(调度决策,以 lsfadmin 身份运行)
/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/etc/eauth -s # 认证服务
架构组件映射¶
| 职责 | Slurm | LSF |
|---|---|---|
| 总控/状态机 | slurmctld |
mbatchd |
| 调度决策 | slurmctld 内调度线程(sched/backfill 插件) | 独立进程 mbschd(与 mbatchd 分离,以 lsfadmin 运行) |
| 节点执行守护 | slurmd |
sbatchd |
| 资源/负载采集 | slurmd 采集(CPU 分配账本) | lim + pim + elim(负载阈值模型) |
| 记账 | slurmdbd + MySQL |
mbatchd 内部事件(lsb.events)+ bacct |
| 认证 | munge(共享密钥 + 时间戳) |
eauth(常驻认证服务) |
| 资源隔离 | cgroup(v1,cgroup.conf) |
无 cgroup 硬限;队列级 MEMLIMIT/PROCESSLIMIT |
| 高可用 | SlurmctldHost 多行 + slurmdbd HA | master + backup 双活切换(本集群 k8s-master-02 为 backup) |
关键结构差异:LSF 把"调度器"独立成
mbschd进程,可单独重启/限流;Slurm 的调度逻辑在 slurmctld 线程内, 由SchedulerParameters(含max_rpc_cnt等)控制其让锁行为。这解释了 LSF 为何能配JOB_SCHEDULING_INTERVAL=1(秒级调度会话)。
二、命令映射总表(全部在本集群验证可执行)¶
2.1 作业提交¶
| 用途 | Slurm | LSF |
|---|---|---|
| 批量脚本提交 | sbatch script.sh |
bsub < script.sh / bsub -q eda_short "cmd" |
| 资源申报 | -n 2 --mem=1024M |
-n 2 -R "rusage[mem=1024]" |
| 指定队列/分区 | -p compile |
-q eda_short |
| 作业名 | -J name |
-J name |
| 输出重定向 | -o file -e file |
-o file |
| 依赖 | --dependency=afterok:<id> |
-w "done(<id>)" |
| 数组作业 | --array=1-10 |
-J "name[1-10]" |
| 交互式 | salloc / srun --pty bash |
bsub -Is |
| 实时并行任务 | srun -n 8 app |
bsub -n 8(MPI 经 blaunch/blmpirun) |
| 资源需求表达式 | 固定选项(--gres、--constraint、--mem) |
-R "select[...] order[...] rusage[...] span[...]" 表达式语言 |
| 时限 | -t 00:30:00 |
-W 30(分钟)或依赖队列 RUNLIMIT |
资源需求表达式对照(LSF 的 -R 是其最有辨识度的设计)
LSF : bsub -q eda_short -n 2 -R "rusage[mem=1024]"
Slurm: sbatch -p compile -n 2 --mem=1024M
本集群实测 bhist 中 LSF 回显的"有效资源需求":
Effective RES_REQ <select[type == local] order[r15s:pg] rusage[mem=1024.00]>
即 LSF 把资源需求解析为 select(候选主机筛选)+ order(排序依据:先 r15s 再 pg)+ rusage(资源预留),
调度决策直接建立在负载指标之上;Slurm 没有等价表达,靠"资源账本 + 约束表达式(--constraint)+ 优先级"。
2.2 查询¶
| 用途 | Slurm | LSF |
|---|---|---|
| 队列/分区概览 | sinfo -o "%20P %6a %10l" |
bqueues -w |
| 队列详细参数 | scontrol show partition |
bqueues -l <queue> |
| 节点状态 | sinfo -N -o "%12N %8T %10C" |
bhosts / bhosts -l <host> |
| 实时负载 | scontrol show node(CPU/内存分配账本) |
lsload / lsload -l(11 项负载指标 r15s/r1m/r15m/ut/pg/io/ls/it/tmp/swp/mem) |
| 作业队列 | squeue |
bjobs -w |
| 含历史作业 | squeue --start(预测) / sacct |
bjobs -a / bhist |
| 单作业详述 | scontrol show job <id> |
bjobs -l <id> |
| 作业输出 | sattach <id>.0 / 读文件 |
bpeek <id> |
| 集群总览 | sdiag |
badmin showstatus |
| 参数总览 | scontrol show config |
bparams -l |
实测数据对照(同一时刻):
# Slurm
k8s-node-01 mixed 2/14/0/16 32010 # Allocated/Idle/Other/Total CPU + RealMemory(MB)
# LSF
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV
k8s-node-01 ok - 20 2 2 0 0 0 # MAX=20 slot
# LSF lsload(负载指标)
HOST_NAME status r15s r1m r15m ut pg io ls it tmp swp mem
k8s-node-01 ok 0.0 0.0 0.2 2% 0.0 583 0 7281 76G 0M 28.9G
对比要点:Slurm 展示"资源分配账本"(2/14/0/16),LSF 展示"负载与槽位占用"(MAX 20 / RUN 2 + 负载 11 项)。 Slurm 关心"还能分出去多少",LSF 关心"机器现在有多忙"。
2.3 管控与记账¶
| 用途 | Slurm | LSF |
|---|---|---|
| 取消作业 | scancel <id> / scancel -u user |
bkill <id> / bkill -J name / bkill -u all |
| 挂起/恢复 | scontrol suspend/resume <id> |
bstop / bresume |
| 作业重排队 | scontrol requeue <id> |
brequeue <id> |
| 改作业属性 | scontrol update job <id> ... |
bmod -n/-q/-R <id> |
| 节点排空 | scontrol update NodeName=X State=DRAIN |
badmin hclose <host> |
| 恢复节点 | scontrol update NodeName=X State=RESUME |
badmin hopen <host> |
| 记账查询 | sacct / sacctmgr |
bacct -l <id> |
| 事件时间线 | journalctl -u slurmctld(原始文本) |
bhist -l <id>(结构化状态机事件流) |
| 利用率报表 | sreport cluster utilization |
bacct 汇总 / RTM(需额外组件) |
| 公平份额 | sshare / sprio |
bqueues -l + fairshare 配置(lsb.params) |
LSF bhist 是本集群记账粒度最细的工具(实测输出):
Fri Sep 11 12:17:49: Submitted from host <k8s-master-01>, to Queue <eda_short>, 2 Task(s), Requested Resources <rusage[mem=1024]>;
Fri Sep 11 12:17:49: Dispatched 2 Task(s) on Host(s) <k8s-node-01> <k8s-node-01>, Allocated 2 Slot(s) on Host(s) <k8s-node-01> ...
Fri Sep 11 12:17:49: Starting (Pid 8613);
Fri Sep 11 12:17:50: Running with execution home </home/lsfadmin>, Execution CWD </home/lsfadmin>, Execution Pid <8613>;
Fri Sep 11 12:18:15: Done successfully. The CPU time used is 0.1 seconds;
Fri Sep 11 12:18:15: Post job process done successfully;
Slurm 等价信息需拼接 sacct(终态)+ journalctl -u slurmctld(中间态),无单一命令。
三、同作业双提交实测(核心实验)¶
3.1 作业定义¶
同一业务指令、同等资源(2 核 / 1GB / 25 秒)、同一节点组:
# Slurm(以 EDA 用户 rain01 提交;注意其登录 shell 为 /bin/csh)
su - rain01 -s /bin/bash -c "export PATH=/usr/local/slurm/bin:\$PATH; cd /tmp; \
sbatch -p compile -n2 --mem=1024M -t 00:05:00 --job-name=SLURM_SIDE --wrap 'hostname; nproc; sleep 25'"
# LSF(以 lsfadmin 提交)
su - lsfadmin -c "export PATH=/opt/lsf/10.1/linux2.6-glibc2.3-x86_64/bin:\$PATH; \
bsub -q eda_short -n 2 -R \"rusage[mem=1024]\" -J LSF_SIDE -o /tmp/lsf_out.%J \"hostname; nproc; sleep 25\""
3.2 实测结果¶
=== 提交时刻(同一秒)===
Slurm 12:17:48 -> Submitted batch job 427
LSF 12:17:48 -> Job <714> is submitted to queue <eda_short>.
=== 运行中(提交后 12 秒)===
Slurm: 427 SLURM_SIDE rain01 normal R TIME=0:13 CPUS=2 NODELIST=k8s-node-01
LSF : 714 lsfadmin RUN eda_short FROM=k8s-master-01 EXEC_HOST=k8s-node-01:k8s-node-01
=== 完成后 ===
Slurm: 427 COMPLETED Elapsed=00:00:27 AllocCPUS=2 ReqMem=1G
LSF : 714 done TURNAROUND=26s CPU_T=0.08 MEM=2M HOG_FACTOR=0.0029
3.3 对比结论¶
| 观察项 | Slurm | LSF |
|---|---|---|
| 派发延迟(资源空闲) | ≈0(提交后 ≤12s 内已 RUNNING,受 30s 调度周期影响) | 0 秒(Submitted 与 Dispatched 同一秒) |
| 资源计量单位 | CPU(AllocCPUS=2) | Slot(Allocated 2 Slot(s)) |
| 调度目标主机 | k8s-node-01(CPUS 2/14 占用) | k8s-node-01(2 slot / 20 slot 占用) |
| 记账字段 | Elapsed/AllocCPUS/ReqMem/MaxRSS/ExitCode | CPU_T/WAIT/TURNAROUND/STATUS/HOG_FACTOR/MEM/SWAP |
| 事件时间线 | 需 journalctl 拼接 | bhist -l 单命令给全 |
| 取消 | scancel(作业即刻消失,sacct 记 CANCELLED) |
bkill(回显 Job <715> is being terminated,终态 EXIT) |
派发延迟的差异根源:Slurm 侧
SchedulerParameters含defer(提交时不单独调度,等周期循环,实测sdiag为 2 cycles/min); LSF 侧JOB_SCHEDULING_INTERVAL=1+MBD_SLEEP_TIME=10,提交即触发派发。 业务含义:LSF 在"短作业高并发"下起跑更快;Slurm 的defer是为"大批量提交时的系统响应性"做的取舍, 若追求低延迟可去掉defer(代价是大批量提交时 slurmctld 压力上升)。
四、资源模型差异(本集群独有数据)¶
| 项 | Slurm | LSF |
|---|---|---|
| 单节点可调度单位 | 16 CPU | 20 slot(lsb.hosts 中 MXJ=20) |
| 单位含义 | 独占 1 个物理核 | 作业槽位(可超配,与实际核数脱钩) |
| 主机折算因子 | 无 | CPUF=12.50(bhosts -l 显示) |
| 内存约束 | DefMemPerCPU=2048 → 默认按核推内存;cgroup 硬限 |
队列 MEMLIMIT:eda_short 4G / eda_license 6G / eda_long 6G |
| 进程约束 | 无队列级进程数限制(靠 cgroup) | 队列 PROCESSLIMIT:eda_short 2 / 其他 4 |
| 时长约束 | 分区 MaxTime:4h/24h/8h/72h(按分区切换) | 队列 RUNLIMIT:60min/1440min/2880min(绝对,ABS_RUNLIMIT=Y) |
| 调度可行性判据 | 资源账本是否够(CPU/内存/GRES) | 资源 + 负载阈值(loadSched/loadStop,本集群全为 - 即不判负载) |
| 超卖 | OverSubscribe 分区级(interactive=YES:4,其余 NO) |
slot 天然可超配(20 slot vs 16 核) |
本集群实测的重要差异:LSF 每节点 20 slot > Slurm 每节点 16 CPU。 LSF 的 slot 数配置为 20(超过物理核数),说明 LSF 侧允许更激进的超配; 而 Slurm 侧
compile/regression/long分区OverSubscribe=NO(严格独占), 只有interactive分区允许YES:4超卖(阶段 5 F7 已实测超卖导致 3.68x 性能膨胀)。 迁移注意:把 LSF 上"按 slot 提交"的作业直接翻译为"按 CPU 提交",实际算力密度会显著下降(20→16,且不再超配),需重新做容量评估。
限额配置对照¶
| 限额维度 | Slurm 实现 | LSF 实现 |
|---|---|---|
| 用户并发作业数 | QOS MaxJobsPU(实测未生效,见 D4) / assoc MaxJobs |
lsb.users 中每个用户的 MAX_PEND_JOBS(实测 rain01/02/03/cloud01/eda_dev 均为 100) |
| 用户提交数 | QOS MaxSubmitJobsPU(实测未生效) |
MAX_PEND_JOBS 同时约束待处理队列 |
| 资源配额 | MaxTRESPU=cpu=8(实测生效,路径见 D4) |
队列 MEMLIMIT/PROCESSLIMIT + fairshare |
| 账号级 | account assoc MaxTRES/GrpTRES |
lsb.resources 中的 resource quota / SLA |
| 全局 | MaxJobCount=100000 |
MAX_JOB_NUM=10000(事件保留数) |
五、优先级与抢占对比¶
5.1 优先级¶
| 维度 | Slurm | LSF |
|---|---|---|
| 优先级来源 | 9 因子加权总分(priority/multifactor) |
队列 PRIORITY + NICE + fairshare |
| 队列/分区优先级 | 分区 PriorityTier(本集群均为 1)+ QOS Priority(100/50/20/10) |
队列 PRIORITY:eda_short 50 > eda_license 40 > eda_long 30 |
| 用户级公平 | FairShare 因子(权重 10000,实测 rain01 1111 vs rain03 3333) | 由 fairshare 策略独立计算 |
| 可观测性 | sprio -l 逐因子分解 + sprio -w 权重表,可完整验算 |
无等价单命令,需查 bqueues -l + mbschd 日志 |
| 重算周期 | PriorityCalcPeriod=5min |
随调度会话 |
Slurm 的可解释性明显更强:sprio -l 能直接看到每个因子的分值贡献,本次已把公式完全还原(见 QOS抢占与优先级实操.md)。
5.2 抢占(本集群最显著的配置差距)¶
| 维度 | Slurm | LSF |
|---|---|---|
| 是否启用 | 已启用:PreemptType=preempt/qos |
未启用:lsb.queues 中无任何 PREEMPTION= 关系 |
| 抢占规则来源 | 数据库 QOS 的 Preempt= 列表(interactive 可抢占 long,normal) |
需在队列间配置 PREEMPTION=PREEMPTIVE 或 PREEMPTION=FAIRSHARE(当前为空) |
| 被抢占动作 | QOS PreemptMode:interactive/normal=requeue、regression=cluster、long=suspend |
未配置则不发生抢占 |
| 豁免期 | PreemptExemptTime=30min(实测:抢占者 StartTime 被排期到豁免期满) |
无对应概念;有 PREEMPTION_WAIT_TIME=300s 参数(当前为默认值,未配关系) |
| 实测行为 | 受害者 QOS=normal → 立即 requeue(日志 preempted JobId=... has been requeued);受害者 QOS=long → 静默不抢占(缺陷 D2) |
全部队列 NJOBS=0,无法实测抢占;仅体现"高 PRIORITY 队列先取资源" |
结论:本集群 LSF 侧是"优先级排队匹配"(priority-based matching),Slurm 侧是"优先级排队 + QOS 抢占"(含 requeue/suspend 语义)。 但 Slurm 侧的抢占链因 D1 + D2 两个缺陷,当前在生产中实际也无法触发(作业不带 QOS + long 用 suspend 模式), 属于"纸面能力强于实际能力",必须按 D1/D2 修复后才能真正兑现。
六、记账与 License 对比¶
| 维度 | Slurm | LSF |
|---|---|---|
| 存储 | MySQL(经 slurmdbd),保留期长,支持跨期报表 | mbatchd 内部事件文件(lsb.events),MAX_JOB_NUM=10000 上限 |
| 查询工具 | sacct(作业明细)、sacctmgr(实体管理)、sreport(聚合报表)、sshare(份额) |
bacct(汇总)、bhist(时间线)、bacctmgr |
| TRES 维度 | cpu/mem/energy/node/billing/fs/disk/vmem/pages + license/*(14 项 License) | 内置 CPU/内存/槽位;License 需 LSF License Scheduler 组件 |
| License 实测 | scontrol show licenses 已联通远程 FlexLM:ads@27000@k8s-master-02 Total=8 Free=8 Remote=yes(14 个 EDA 工具 License 全部登记) |
队列 eda_license(PRIO=40)为 License 作业预留通道(实际用 License Scheduler 需额外配置) |
| 报表能力 | sreport cluster utilization / AccountUtilizationByUser / user TopUsage |
bacct 汇总,复杂报表需 RTM/自建解析 |
本集群 Slurm 的 License 记账是完整的:AccountingStorageTRES 已含 license/ads, license/ams_sim, license/assura_drc, license/assura_lvs, license/calibredrc, license/calibrelvs, license/calibreperc, license/calibrexact, license/calibrexrc, license/ncsim 等 14 项,
且 scontrol show licenses 显示 Remote=yes、LastUpdate 为分钟级新鲜时间戳,说明 license 服务器轮询链路正常工作。
EDA 场景可据此做"License 感知的排队"(阶段 3 已规划,QOS MaxTRESPU=license/xxx 可用于限额)。
七、选型与迁移结论¶
7.1 能力对比小结¶
| 能力 | 胜出方 | 依据 |
|---|---|---|
| 可解释的优先级 | Slurm | sprio -l 逐因子分解,可完整验算 |
| 派发延迟 | LSF | 实测 0 秒 vs Slurm 受 30s 周期/defer 影响 |
| 作业事件可追溯 | LSF | bhist -l 单命令给完整状态机 |
| 资源隔离强度 | Slurm | cgroup 硬限 + TRES 记账(LSF 无 cgroup 层) |
| 抢占能力 | Slurm(设计上) | QOS 抢占链 + requeue/suspend;但本集群因 D1/D2 实际未生效 |
| 负载感知调度 | LSF | 11 项负载指标 + loadSched/loadStop 阈值;Slurm 无等价机制 |
| 超配灵活性 | LSF | 20 slot/节点;Slurm 严格独占(除 interactive 分区) |
| 记账/报表 | Slurm | slurmdbd + sreport 多维聚合;LSF 需额外组件 |
| License 调度记账 | Slurm | 14 项 license TRES 已联通 FlexLM 且记账完整 |
7.2 迁移注意(LSF → Slurm)¶
- 资源申报翻译:
-n 2 -R "rusage[mem=1024]"→-n 2 --mem=1024M;LSF 的-R select/order表达式在 Slurm 中要拆解为--constraint(对应 select)+ 由调度器自行排序(无 order 等价物)。 - 时限翻译:LSF
-W 30(分钟)→ Slurm-t 00:30:00;队列 RUNLIMIT 需翻译为分区MaxTime或 QOSMaxWall。 - slot → CPU 换算:LSF slot(20/节点)不能 1:1 换算为 Slurm CPU(16/节点),
且 Slurm 的 compile/regression/long 为
OverSubscribe=NO,原有超配作业迁移后可能大面积 PD,必须先做容量重估。 - 作业数限制:LSF
MAX_PEND_JOBS=100在 Slurm 侧需用 QOSMaxSubmitJobsPU表达, 但该限额实测未生效(D4),迁移前必须验证或改用 TRES 表达。 - 抢占语义差异:LSF 的"高优先队列优先取资源"是排队择优(不做抢占动作), Slurm 若期望等价效果,需保证 ① 作业带正确 QOS(D1)② 受害者 QOS 的 PreemptMode 可用(D2)。
- 提交账号与环境:EDA 用户登录 shell 为
/bin/csh,Slurm/LSF 的环境加载脚本需分别适配; LSF 管理命令必须用lsfadmin,不能用 root。 - 记账对齐:两侧账号体系已一致(teama…),可平行运行做用量对账;Slurm 侧以
sacct/sreport为准, LSF 侧以bhist/bacct为准,建议按周做一次双侧用量核对。
来源:
/home/rain/Documents/slurm/slurm_study/slurm_study_plan/阶段6_进阶与对比/Slurm与LSF对比实测.md| 最后更新:2026-09-11 12:27(由build/sync.py同步,请勿在站点侧修改)