SOP — LSF 集群切换 cgroup v1(恢复作业级资源限制)¶
- 变更类型:C 类生产变更(改内核启动参数 + 重启节点,需停机)
- 实现体:
/home/rain/Documents/LSF/lsf_ins/deploy/lsf/,阶段名cgroup - 文档地位:第 5 章为实现等价的操作序列,供复核与手工兜底;以实现体为准
一、背景¶
集群运行 IBM Spectrum LSF CE 10.1.0.12(FP12),二进制平台目录为 linux2.6-glibc2.3-x86_64,
该代二进制只支持 cgroup v1;而 5 台节点(Rocky 9.8)默认挂载 cgroup v2(/sys/fs/cgroup = cgroup2fs),
守护进程启动即报:
cg_load_hierarchies: Please use the LSF package with higher glibc version
to enable LSF cgroup v2 support.
后果:作业级资源限制无法落地(lsb.params 里 LSB_NCPU_ENFORCE=1 形同虚设)。
原本的正解是升级到 FP15/FP16(新平台目录 linux3.10-glibc2.17-x86_64,支持 cgroup v2),
但两条官方取介质通道均已实测走不通:
| 通道 | 实测结果 |
|---|---|
| early-access(CE 免费包) | 登录后返回 US Export Validation is Under Review,下载权限卡在美国出口管制审查 |
Fix Central(SPK,如 FP16 lsf-10.1-spk-2026-Jun-build603045) |
已到下载页,被授权拦下:IBMAVS5548 未找到适用的 IBM 支持协议 |
因此改走「把运行时切回 cgroup v1」,让现有 FP12 二进制的资源限制能力恢复可用。
二、目标¶
| # | 可验证状态 |
|---|---|
| 1 | 5 台 /sys/fs/cgroup 文件系统类型为 tmpfs(即 cgroup v1 已生效) |
| 2 | 5 台内核条目均含 systemd.unified_cgroup_hierarchy=0(grubby --info=ALL 可查) |
| 3 | lim/sbatchd 日志不再出现 to enable LSF cgroup v2 support 提示 |
| 4 | bhosts -w 5 台全 ok;lsfd.service 全 active(重启后自动拉起,单元已 enabled) |
| 5 | 作业级 CPU 限制可落地:bsub -n 2 的作业进程 Cpus_allowed_list 仅含 2 个核 |
| 6 | 幂等:再次执行 --stage cgroup 判「零变更、全跳过」 |
本次不启用内存硬限制(
LSB_MEMLIMIT_ENFORCE=Y未写入 lsb.params),按用户决定留待后续。
三、前置条件¶
- 作业:
bjobs -u all无活动作业(实现体在pre_check中强制校验,非 0 即拒停)。 - 权限:5 台 root SSH 免密可达;
grubby已安装(Rocky 默认自带)。 - 固件与引导:5 台均为 BIOS 固件,引导配置为
/boot/grub2/grub.cfg(实现体按此路径备份)。 - 可重启性:5 台为 KVM 虚拟机(运行
qemu-guest-agent),重启可接受。 - 配置:
deploy/lsf/config/lsf_deploy.yaml的cgroup段已就位(enable_v1: true)。 - 集群基线:执行前
bhosts -w5/5ok、lsf-health.timer与lsf-user-sync.timeractive。
四、影响范围¶
- 主机:全部 5 台(
192.168.31.23~27)。 - 是否停服:是,逐台滚动重启;每台重启期间该节点不可用、其上不承载作业。 滚动顺序固定为 worker → candidate master → primary master,任一时刻保留可用 master。
- 窗口:从
--stage cgroup启动到 5 台全部回到ok;单台等待上限由cgroup.reboot_timeout_sec(默认 600 s)控制。 - 在跑作业:停机前必须为空(见第三章)。
- 联动:变更期间暂停
lsf-health.timer(其 missing-daemon 自愈会干扰节点状态判定),结束后自动恢复。 - 不可逆点:无。GRUB 参数可移除、配置全部有备份;旧平台与业务数据不受影响。
- 旁路影响:primary master(master-01)重启期间由 master-02 接管调度(数分钟),属预期行为; 恢复后 master 角色可能保留在 master-02,不影响集群功能(与 failover 演练后的表现一致)。
五、分步操作¶
对应实现体:
deploy/lsf/stages/cgroup_v1.py::CgroupV1Module(生命周期由base_module.BaseModule.run()编排) 下列命令忠实反映实现体步骤,供人工复核与兜底;以实现体为准。
5.1 预演(零改动,先看清将动什么)¶
cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py --config config/lsf_deploy.yaml --stage cgroup --dry-run
# 预期:打印 5 台 × [grub_arg, runtime_v1] 的变更清单,状态 skipped,无任何系统改动
5.2 正式执行(一键)¶
.venv/bin/python main.py --config config/lsf_deploy.yaml --stage cgroup
预期日志顺序:门禁通过(无 BLOCK)→ 检测到漂移 5 台 → 备份 GRUB → 写内核参数 →
暂停 lsf-health.timer → 逐台滚动重启并等待就绪 → 恢复 timer → 验证通过(5 台 cgroup v1 + bhosts 5 ok)。
5.3 实现体内部等价序列(复核 / 手工兜底)¶
# ① 红线:停机前确认无活动作业(实现体 pre_check 自动执行)
ssh root@192.168.31.23 'su - ldapadmin -s /bin/bash -c "bash -lc \"bjobs -u all\""'
# 预期:No unfinished job found
# ② 备份 GRUB(高危:改启动配置;实现体 backup() 自动执行)
for h in 23 24 25 26 27; do
ssh root@192.168.31.$h "cp -a /etc/default/grub /etc/default/grub.bak.$(date +%Y%m%d-%H%M%S); \
cp -a /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak.$(date +%Y%m%d-%H%M%S)"
done
# ③ 写内核参数(grubby 对 ALL 内核条目生效,幂等:重复执行结果一致)
for h in 23 24 25 26 27; do
ssh root@192.168.31.$h 'grubby --update-kernel=ALL \
--args="systemd.unified_cgroup_hierarchy=0" && \
grubby --info=ALL | grep -c unified_cgroup_hierarchy=0'
done
# 预期:每台输出 ≥ 1
# ④ 暂停健康巡检,避免重启判定被自愈干扰
ssh root@192.168.31.23 'systemctl stop lsf-health.timer'
# ⑤ 逐台滚动重启(worker → master-02 → master-01;每台先摘除调度)
# 实现体对每台执行:badmin hclose <name> → systemctl reboot → 轮询就绪 → badmin hopen <name>
for h in 25 26 27 24 23; do
name=$(ssh root@192.168.31.$h hostname -s)
ssh root@192.168.31.23 "su - ldapadmin -s /bin/bash -c \"bash -lc 'badmin hclose $name'\""
ssh root@192.168.31.$h 'systemctl reboot' & # 高危:重启节点
# —— 等该台恢复:启动标识变化 + /sys/fs/cgroup=tmpfs + lsfd active,再继续下一台
sleep 60
ssh root@192.168.31.$h 'stat -fc %T /sys/fs/cgroup; systemctl is-active lsfd' # 预期 tmpfs / active
ssh root@192.168.31.23 "su - ldapadmin -s /bin/bash -c \"bash -lc 'badmin hopen $name'\""
done
# ⑥ 恢复健康巡检
ssh root@192.168.31.23 'systemctl start lsf-health.timer'
六、验证¶
S=/data/nfs/lsf/lsf
# 1) 运行态已是 cgroup v1(5 台,预期全部 tmpfs)
for h in 23 24 25 26 27; do echo -n "192.168.31.$h: "; ssh root@192.168.31.$h 'stat -fc %T /sys/fs/cgroup'; done
# 2) 内核条目已含参数
for h in 23 24 25 26 27; do echo -n "192.168.31.$h: "; ssh root@192.168.31.$h 'grubby --info=ALL | grep -c unified_cgroup_hierarchy=0'; done
# 3) 日志无 cgroup v2 提示(对比时间戳,应无本次重启后的新记录)
grep -i "cgroup v2 support" $S/log/*.log.* | tail -3
# 4) 集群状态
ssh root@192.168.31.23 "source $S/conf/profile.lsf; bhosts -w" # 预期 5 台 ok
ssh root@192.168.31.23 "systemctl is-active lsfd lsf-health.timer" # 预期 active / active
# 5) 作业级 CPU 限制实测(预期 Cpus_allowed_list 仅 2 个核)
ssh root@192.168.31.23 "su - ldapadmin -s /bin/bash -c \"bash -lc 'bsub -n 2 -I sh -c \\\"grep Cpus_allowed_list /proc/self/status\\\"'\""
# 6) 幂等复跑(预期:无漂移、零变更跳过)
cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py --config config/lsf_deploy.yaml --stage cgroup --dry-run
失败判据(任一出现即按第七章回滚):任一台 /sys/fs/cgroup 仍为 cgroup2fs;
重启后 lsfd 未 active 或 bhosts 不足 5 台 ok;lsf-health.timer 未恢复 active。
七、回滚¶
备份位置:cgroup_v1/backup/,登记见 backup/README.md。
节点侧 GRUB 备份位于各节点同目录(/etc/default/grub.bak.<时间戳>、/boot/grub2/grub.cfg.bak.<时间戳>)。
回滚步骤(需人工确认后执行——重启为高危动作,实现体不自动重启):
# 1) 移除内核参数(实现体 rollback() 只做这一步,不自动重启)
for h in 23 24 25 26 27; do
ssh root@192.168.31.$h 'grubby --update-kernel=ALL \
--remove-args="systemd.unified_cgroup_hierarchy=0"'
done
# 2) 【高危】人工确认后逐台重启,回到 cgroup v2
for h in 25 26 27 24 23; do ssh root@192.168.31.$h 'systemctl reboot'; sleep 60; done
# 3) 部署器侧回滚(可选):按 backup/README.md 的反向操作撤销本阶段代码与配置
# 最小做法:把 config 的 cgroup.enable_v1 置 false,本阶段即不再执行
# 4) 验证回到 v2
for h in 23 24 25 26 27; do echo -n "192.168.31.$h: "; ssh root@192.168.31.$h 'stat -fc %T /sys/fs/cgroup'; done # 预期 cgroup2fs
ssh root@192.168.31.23 "source /data/nfs/lsf/lsf/conf/profile.lsf; bhosts -w" # 预期 5 台 ok
GRUB 配置损坏时的兜底:用同目录备份还原后重启——
cp -a /etc/default/grub.bak.<时间戳> /etc/default/grub; grub2-mkconfig -o /boot/grub2/grub.cfg。
八、风险说明¶
| # | 风险 | 影响 | 缓解 |
|---|---|---|---|
| R1 | 改 GRUB 内核参数导致节点无法引导 | 该节点失联,需 KVM 宿主介入 | 用 grubby(Rocky 官方方式,不手改 grub.cfg);改前备份 /etc/default/grub 与 grub.cfg;单台验证通过再滚下一台 |
| R2 | 节点重启后 LSF 未自动拉起 | 该节点长期 unavail | lsfd.service 已 enabled(已核实);实现体等待 systemctl is-active lsfd=active 才判就绪,超时即中止并报警 |
| R3 | 滚动重启期间 primary master 失联 | 调度短暂由备 master 接管(数分钟) | 顺序固定 worker→备→主,任何时刻保留可用 master;master 角色留在备机属正常 |
| R4 | lsf-health.timer 自愈干扰状态判定 |
误判节点「已恢复」或把节点拉回 | 变更期间暂停该 timer,结束后自动恢复并校验 active |
| R5 | cgroup v1 在 RHEL9 已标记 deprecated | 未来 RHEL10 移除后本方案失效 | 属已知技术债:真正解法仍是升级到 FP15+ 二进制;本变更只是恢复现有版本的能力 |
| R6 | 内存硬限制未启用,作业超内存不会被拦 | 资源超用风险仍在 | 本次范围外(用户决定);后续如需,加 LSB_MEMLIMIT_ENFORCE=Y 并 badmin reconfig |
| R7 | 重启中断节点上其他服务 | 该节点全部服务短暂中断 | 节点仅承载 LSF(已核实运行单元列表),无业务作业;且实施前确认无活动作业 |
附录 A:交付物清单¶
| 文件 | 说明 |
|---|---|
cgroup_v1/SOP.md |
本文档 |
cgroup_v1/backup/README.md |
备份台账与反向操作说明 |
cgroup_v1/backup/deploy/lsf/** |
部署器与配置的变更后副本 |
deploy/lsf/stages/cgroup_v1.py |
新增阶段实现(三态探测 + 备份 + 滚动重启 + 验证/回滚) |
deploy/lsf/{deployer.py,main.py,stages/__init__.py} |
阶段注册与 CLI 接线 |
deploy/lsf/utils/config_validate.py |
新增 cgroup 段校验,补 lsf.host_type/binary_tar schema |
deploy/lsf/config/lsf_deploy.yaml(.example) |
新增 cgroup 段;lsf 段回退到真实在用的 FP12 三件套 |
附录 B:与 FP15 升级的关系¶
FP15 升级(主题目录 fp15_upgrade/)未取消,仅挂起:代码改造、配置切换方式、备份与回滚方案均已就位。
待 IBM 出口审查通过或补上支持协议后,可直接按 ../fp15_upgrade/SOP.md 执行升级;
升级完成后再按本 SOP 第七章回滚 cgroup v1 切换(新平台二进制原生支持 cgroup v2)。
九、执行结果与结论(2026-09-24 实机)¶
| 项 | 结果 |
|---|---|
| 内核参数写入 | ✅ 5 台均含 systemd.unified_cgroup_hierarchy=0 |
| 滚动重启 | ✅ 5 台依次重启(23:07–23:10),单台就绪即续下一台 |
| 运行态 cgroup | ✅ /sys/fs/cgroup = tmpfs;v1 控制器(cpu/cpuset/memory)已挂载 |
| 集群状态 | ✅ bhosts 5/5 ok、lsfd 全 active;本轮执行耗时 283 s |
| 幂等复跑 | ✅ 第二次执行判「状态已一致、无漂移、零变更跳过」 |
| LSF 启用 cgroup | ❌ 未达成:重启后 sbatchd 仍打印同一条 v2 提示,且未建立任何 cgroup 层次 |
根因(为何切到 v1 仍无效)¶
- FP12 二进制以「系统是否存在 cgroup2」判定环境,见到 v2 即放弃 cgroup 功能;
- RHEL9 的 systemd 即使在 legacy 模式下仍保留
cgroup2 on /sys/fs/cgroup/unified, 且/proc/self/cgroup保留0::层级——本环境两者实测都在【已确认】; - RHEL9 文档要求的第二个参数
systemd.legacy_systemd_cgroup_controller在 Rocky 9.8 的 systemd 252 中已被移除(strings /usr/lib/systemd/systemd查不到该参数名), 无法用它消掉 v2 挂载。
结论与后续¶
- 结论:FP12 二进制 + Rocky 9 组合下 cgroup 资源限制无法启用,与 v1/v2 切换无关。 唯一解法是升级到 FP15/FP16 二进制(原生支持 cgroup v2)——与 IBM 官方修复内容一致。
- 处置决定(用户确认):保留现状,不为回滚再重启节点;待 FP15 介质到位执行升级时 一并移除本参数(那次升级本就需要重启),见 ../fp15_upgrade/SOP.md。
- 如需回退,仍可按第七章随时执行。
来源:
/home/rain/Documents/LSF/lsf_ins/cgroup_v1/SOP.md| 最后更新:2026-09-24 23:59(由build/sync.py同步,请勿在站点侧修改)