本集群存储演进差距清单(对标旧集群五轮模板)¶
文档定位:A 类讨论稿 / 只读分析产物,不含任何系统变更,命令均为演示骨架。 对标基线:旧集群
192.168.0.x的eda_storage_standardization(五轮改造,已闭环)。 分析对象:本集群192.168.31.xSlurm 26.05.2 主备集群。 证据来源:旧集群存储目录行业标准设计.md、方案说明.md;本集群docs/SOP.md、docs/RUNBOOK.md、docs/INCIDENT-*.md、docs/HANDOFF.md;2026-09-24 闸门 0 实机只读核查(见附录 A)。⚠️ 本版为核查后修订版:闸门 0 实测发现本集群已部署可用 Lustre(
192.168.31.21@tcp:/edafs→/mnt/lustre),三份档案文档均未记载。原「不建议引入 Lustre」结论已作废,补建顺序相应重排。
一、对标基线:旧集群五轮做了什么¶
| 轮次 | 主题 | 核心动作 | 落点 |
|---|---|---|---|
| 第一轮 | NFS 基线 + 分层框架 | 客户端挂载参数统一为 hard,timeo=600,retrans=2,noatime,actimeo=30,_netdev,去除全部 soft;Tier0/Tier1/Tier2 分层定型 |
方案说明.md 二/四章 |
| 第二轮 | 目录标准化 + 本地 SSD | Tier1 增量收敛(软链,不搬数据);Tier0 Lustre 重整为纯 scratch;3 节点各加 50G 独立虚拟盘 → /local_scratch(xfs,noatime) |
存储目录行业标准设计.md 四/七章 |
| 第三轮 | 工具/PDK 物理迁移 | /data/slurm/opt/* → /data/eda/{tools,pdk};modulefile 改写为标准路径 /tools /pdk |
同文档 八章 |
| 第四轮 | License 服务化 + 权限标准化 + 三级版本化 | FlexLM 独立节点 + systemd;tools/pdk 755 root、modules 由 777 修为 644、projects 2775 setgid;<厂商>/<工具>/<版本> 三级目录 |
同文档 九章 |
| 第五轮 | 家目录统一 + 项目区对齐 LDAP | homeDirectory → /home/<user>;/projects/<团队组> 按 LDAP 组建,2775 |
同文档 十章 |
五条达标判定(该文档 11.8):① 三层物理分离 ② 工具/PDK 只读+版本化 ③ License 服务化 ④ 客户端统一视图 ⑤ 临时数据生命周期与清理。
旧集群 前 4 条达标,第 5 条留有缺口(epilog_eda.sh 不清理 scratch、task_prolog_eda.sh 不注入 TMPDIR),列在 12.4「待补强,未实施」。
二、本集群存储现状快照(2026-09-24 实测)¶
| 项 | 现状 | 来源 |
|---|---|---|
| 存储层数 | 两层(Tier1 NFS + Tier0 Lustre),缺本地层 | 实测 |
| Tier0 并行文件系统 | 已有:192.168.31.21@tcp:/edafs → /mnt/lustre,1 MDT(11.6G)+ 1 OST(308G),总 295G / 已用 52M;三台计算节点(.18/.19/.20)均已挂载,fstab defaults,nofail 持久化;控制节点 .16/.17 未挂 |
实测(三份文档均无记载) |
| Tier0 内容 | 仅性能测试残留:eda_small_files/、eda_large_files/、eda_shared_files/、eda_scratch/(均空)、hello.txt、50MB testfile;无标准 scratch 结构、无清理策略 |
实测 |
| Tier1 导出 1 | /data/nfs/slurm-state → /mnt/slurm-shared(.16),挂载参数 hard,timeo=600,retrans=2,relatime,async 导出 |
SOP 5.6 + 实测 |
| Tier1 导出 2 | /data/nfs/home → /home,soft |
SOP 5.9 + 实测 |
| Tier1 导出 3 | /data/nfs/modulefiles → /opt/modulefiles,soft |
SOP 5.11 + 实测 |
| Tier1 fstab 写法 | 仅 rw,soft,_netdev(其余为内核默认,无 noatime/actimeo/nconnect) |
实测 |
| 项目区 | 无 | 实测 |
| 工具/PDK 视图 | 无;模块树已就位但 install_dir 为占位 |
SOP 5.10 |
| 家目录 | 已统一 /home/<user> |
与旧集群第五轮一致 |
| 本地 scratch | 无;三台计算节点无独立数据盘(仅 vda 100G = vda1 /boot 1G + vda2 / 99G,xfs) |
实测 |
| 宿主机 249 磁盘 | sda 232G(根 sda3 220G,用 98G/可用 111G);sdb 1.8T(sdb1 → /data,用 449G/可用 1.3T)——所有 NFS 导出与全部虚盘共用这两块盘;LVM/RAID 布局因非 root 未读到,待 root 复核 |
实测 |
| 虚盘存储池 | ssd-pool → /kvm/img(属 sda3,剩 ~111–133G);hdd-pool → /data/kvm/img(属 sdb1,剩 ~1.6T) |
实测 |
| 249 角色 | 共享 KVM 宿主:17 台虚机在跑,含本集群 5 台、Lustre 2 台(.21 mgs / .22 oss)、LSF 6 台、k8s 4 台 | 实测 |
| 上游 LDAP | SSSD 不枚举(enumerate=false),按名解析正常:cy01:*:4001:4000:...:/home/cy01:/bin/csh、custom:*:4000: |
实测 + RUNBOOK 4.4 |
| 账户层级(8 小组 + 4 父账户) | frontend{design,dv} analog{custom,layout} it{cad,sre} backend{pnr,signoff} |
RUNBOOK 4.4 |
| Prolog/Epilog 链 | Prolog=/usr/local/slurm/prolog_eda.sh、Epilog=/usr/local/slurm/epilog_eda.sh、TaskProlog=/etc/slurm/task_prolog_lmod.sh(内容见附录 A);task_epilog_eda.sh 存在但未被引用(无 TaskEpilog=) |
实测 |
| TaskProlog 透传 | task_prolog_lmod.sh 内部 [ -x /usr/local/slurm/task_prolog_eda.sh ] && 执行 → 注入落点是 task_prolog_eda.sh,且该目录属部署覆盖范围 |
实测 |
三、差距清单(五轮逐项对标)¶
| 轮次 | 旧集群动作 | 本集群现状 | 差距 | 是否要做 | 优先级 |
|---|---|---|---|---|---|
| 一 | 挂载参数统一、禁 soft |
/mnt/slurm-shared 已是 hard(达标);/home /opt/modulefiles 为 soft 且 fstab 未写 noatime/actimeo |
参数未标准化(soft 与"禁 soft"结论相悖) |
部分要做(见 4.3) | 中 |
| 二 | Tier0 Lustre 重整为纯 scratch | Lustre 已存在,但只有测试残留、无 scratch/{users,projects,tmp} 结构、无清理策略、单 OST 无法条带化 |
目录与生命周期未标准化 | 要做(低风险) | 高 |
| 二 | 3 节点本地 SSD scratch | 完全缺失,且节点无独立数据盘 | 全缺,需加盘 | 要做(高风险) | 高 |
| 三 | 工具/PDK 物理迁移 + 标准路径 | 工具未安装,install_dir 占位 |
工具未就位 + 无 /tools /pdk 视图 |
依赖外部介质 | 低(受阻) |
| 四 | License 服务化 + 权限标准化 + 三级版本化 | 无 license 服务;/opt/modulefiles 已是 755 root root(天然达标) |
权限已基本合规;License 未涉及 | 权限=基本达标;License 暂不做 | 低 |
| 五 | 家目录统一 + /projects 按 LDAP 组 |
家目录已统一;/projects 缺 |
仅缺 /projects |
要做 | 高 |
总评:本集群实际是「两层半」——Tier1(NFS)+ Tier0(Lustre,未标准化)已具备,缺本地层与 Tier1 的标准语义(/projects、/tools、/pdk)。相对旧集群,差距集中在目录标准化与生命周期管理,而非基础设施缺失。这比"从零建三层"的成本低得多。
四、补建顺序规划¶
4.0 闸门 0:前置核查(✅ 2026-09-24 已完成,见附录 A)¶
六项核查全部完成,不再阻塞规划。由核查引出的三项新决策点见第六节。
4.1 阶段一:/projects(对标第五轮)【低风险 · 优先】¶
为什么 /projects 排在最前:
- 依赖方向:Tier1(持久)是 Tier0(临时)的上游。scratch 的 stage-out 目标是
/projects,先有归宿再开临时区。 - 风险最低:只需宿主机新增导出 + 客户端新增挂载点,不格式化任何磁盘、不重启任何 Slurm 服务、不动现有数据。
- 权限模板复用:
/projects是 LDAP 组权限模型(2775 setgid)的首次落地,验证后 scratch 的 per-user 目录权限可套用同一模式。 - 容量最宽裕:
/data尚余 1.3T,/projects不构成容量压力(与需要争抢sda3的 scratch 虚盘形成对比)。
动作骨架(演示,宿主机 + 各节点):
# 宿主机 249:新增导出(高危:改 /etc/exports 前必备份)
sudo cp -a /etc/exports /etc/exports.bak.$(date +%Y%m%d-%H%M%S)
sudo mkdir -p /data/nfs/projects
sudo sh -c 'printf "/data/nfs/projects 192.168.31.0/24(rw,hard,async,no_subtree_check,no_root_squash)\n" >> /etc/exports'
sudo exportfs -ra
# 各计算节点:挂载(新挂载点无历史包袱,直接按标准用 hard)
mount -t nfs -o rw,hard,timeo=600,retrans=2,noatime,actimeo=30,_netdev \
192.168.31.249:/data/nfs/projects /projects
# 按 LDAP 小组建目录(组名取自 RUNBOOK 4.4 的 8 个小组)
mkdir -p /projects/<组名> && chown root:<组名> /projects/<组名> && chmod 2775 /projects/<组名>
4.2 阶段二:Tier0 Lustre 标准化(对标第二轮)【低风险 · 建议与阶段一同批】¶
Lustre 已就位且三节点已挂载,本阶段只是"整理",不是"建设" —— 成本远低于旧集群当年。
# 1) 清理测试残留(demo 数据,确认后可删;注意仍在根目录留 hello.txt/testfile 判断)
# /mnt/lustre/{eda_small_files,eda_large_files,eda_shared_files,eda_scratch} 均为空目录
# 2) 建标准 scratch 结构
mkdir -p /mnt/lustre/scratch/{users,projects,tmp}
chmod 1777 /mnt/lustre/scratch/tmp
# 3) 挂载参数补 noatime(当前 fstab 为 defaults,nofail)
# /etc/fstab: 192.168.31.21@tcp:/edafs /mnt/lustre lustre defaults,noatime,flock,_netdev,nofail 0 0
三条必须写进设计的实测约束:
| 约束 | 实测值 | 影响 |
|---|---|---|
| 单 OST | edafs-OST0000_UUID 仅一个 |
旧集群的 -c 3 -S 1M 条带化在本集群不可能(stripe_count 上限 1);根目录实测 stripe_count: 1 |
| 单 MDT | edafs-MDT0000_UUID 仅一个 |
印证旧集群 11.4 结论:单 MDT 元数据能力不比单台 NFS 强一个量级,靠的是多 MDT + 缓存 + 分层 |
| 容量 295G / 已用 52M | — | 与旧集群 Lustre(146G)同级,属"迷你版" |
结论修正:Lustre 在本集群的真实价值是「提供一个可跨节点共享的临时层」(旧文档 11.1 的判据:多节点作业必须用共享 FS),而不是"提升元数据性能"。元数据减压要靠 4.4 的本地 scratch。
4.3 阶段三:NFS 挂载参数基线(对标第一轮)【中风险】¶
| 挂载点 | 现状(实测) | 建议 | 理由 |
|---|---|---|---|
/projects(新增) |
— | hard,timeo=600,retrans=2,noatime,actimeo=30,_netdev |
数据写层,新挂载点无历史包袱 |
/mnt/slurm-shared |
hard,timeo=600,retrans=2 |
不动 | 已达标;且为主控 state 路径,改动窗口风险高 |
/home |
soft,timeo=600,retrans=2 |
暂保持,单独立项评估 | soft 是刻意选择(防登录卡死);一旦 EDA 工具往家目录写结果即数据损坏隐患,届时改 hard |
/opt/modulefiles |
soft,timeo=600,retrans=2 |
保持 | 只读用途,卡住不如报错 |
/mnt/lustre |
defaults,nofail |
补 noatime,flock,_netdev |
见 4.2 |
旧集群"禁 soft"的结论在本集群需分场景适用:
soft在只读或"宁可报错不可卡死"的场景是合理的,在数据写层才是隐患。
4.4 阶段四:本地 scratch(对标第二轮)【高风险】¶
为什么仍要做:旧文档 11.1 明确「本地 SSD 的核心理由是卸载元数据压力,不只是提速」。当前三台节点把元数据压力全压在 Lustre 单 MDT(或 NFS)上,这是 EDA 第一瓶颈。
容量决策(本次核查的最大变化):
| 方案 | 落盘位置 | 可用空间 | 容量配置 | 评价 |
|---|---|---|---|---|
| A(推荐) | ssd-pool → /kvm/img(sda3) |
~111–133G | 3 × 30G = 90G | 性能优先;余量 ~20G,偏紧,且 sda3 上还跑着其他虚机 |
| B | hdd-pool → /data/kvm/img(sdb1) |
~1.6T | 3 × 50G = 150G | 空间充裕,但与全部 NFS 导出同盘争 IO,隔离性打折 |
| C | 不加盘,仅用 Lustre | — | — | 放弃本地层,元数据压力不卸载 |
旧集群"50G/节点"的基线在本集群需下调:宿主机无独立大容量 SSD,ssd-pool 仅剩 ~111–133G,放不下 3×50G。旧文档同时说过「30G 用于学会机制、跑小电路完全够用,只是真实环境(1~4TB)的 1%」,故 3×30G 是可接受的折中。
动作顺序(每步幂等,先检查后动作):
# 1) 加盘(在 KVM host 执行,演示;须先落实第六节决策 1)
qemu-img create -f qcow2 /kvm/img/slurm-work-01-scratch.qcow2 30G
virsh attach-disk slurm-work-01 /kvm/img/slurm-work-01-scratch.qcow2 vdb --persistent
# 2) 节点内:格式化 + 挂载(先探测,已有文件系统或已挂载即跳过)
mkfs.xfs /dev/vdb
# fstab: /dev/vdb /local_scratch xfs defaults,noatime 0 0
# 3) 目录树 + 权限(模式见第六节决策 3)
mkdir -p /local_scratch/users
# 4) 作业环境变量(对标旧集群 /etc/profile.d/eda_scratch.sh)
export LOCAL_SCRATCH=/local_scratch/users/$USER
export TMPDIR=$LOCAL_SCRATCH/${SLURM_JOBID:-$$}
必须同时认知的陷阱(旧集群 11.7 实测):编译产物默认落在 cwd(VCS 的 ./csrc、./simv),不在 $TMPDIR。要让 scratch 真正生效,需 workdir 直接放本地盘,或用 -Mdir 等显式指到本地。
4.5 阶段五:生命周期清理(补齐旧集群第 5 条缺口)【与两个 scratch 层捆绑】¶
状态:已实施(2026-09-24)。实现体
--scratch-gc(scratch_gc_deployer.py); 变更档案见SOP-scratch生命周期清理.md,日常运维见../docs/RUNBOOK.md第 4.11 节。
必须与 scratch 同步交付——旧集群正是「先建了 /local_scratch、清理机制留在 12.4 未实施」,scratch 会被写满。本集群两个 scratch 层(Lustre + 本地)都要覆盖。
| 层 | 动作 | 实施落点 |
|---|---|---|
| 作业脚本 | trap 'rm -rf "$TMPDIR"' EXIT |
用户侧范例,见 RUNBOOK 4.11 |
| Slurm Epilog | 按退出码分级:成功即删,失败改名保留现场 | epilog_eda.sh 的 cleanup_scratch() |
| 老化兜底 | 本地 7 天、Lustre 30 天 | slurm-scratch-gc.{sh,service,timer}(systemd timer,非 cron) |
| TaskProlog | 注入 TMPDIR / LOCAL_SCRATCH |
task_prolog_eda.sh |
⚠️ 落点约束(本次核查新增):
- 注入落点是 /usr/local/slurm/task_prolog_eda.sh(task_prolog_lmod.sh 透传链末端),不是 /etc/slurm/task_prolog_lmod.sh。
- 但 /usr/local/slurm/ 属部署器覆盖范围(SOP 5.4 阶段 4「分发(高危:覆盖安装目录)」)→ 必须走模板/资产落地,禁止手改,否则下次部署被覆盖。
- Epilog=/usr/local/slurm/epilog_eda.sh 同理。
- 实测纠正(2026-09-24):scontrol show config 显示 TaskEpilog = /usr/local/slurm/task_epilog_eda.sh 已配置生效,原「文件存在但未引用、属死文件」的判断不成立,该决策项关闭。
- 新增红线:Epilog 脚本不得使用 set -u——变量未定义会让 Epilog 返回非 0,直接导致节点 DRAIN(本变更实测踩中,见 SOP 附录 C)。
4.6 阶段六:工具/PDK 与 License(对标第三、四轮)【受阻】¶
- 工具/PDK:依赖 EDA 工具介质就位。就位后按旧集群模式落地:收敛为
/tools/pdk只读视图,install_dir改真实路径后重跑--module-env(HANDOFF 待办 6)。 - License:本集群无 License 服务需求,暂不做。
- 权限:
/opt/modulefiles实测已是755 root:root,天然达标;/projects2775 在阶段一完成。
顺序总览¶
闸门0 只读核查 ........................ ✅ 已完成(附录 A)
│
├─ 阶段一 /projects ................. 低风险,纯导出+挂载
├─ 阶段二 Tier0 Lustre 标准化 ........ 低风险,仅建目录+清理测试残留 ← 建议与阶段一同批
├─ 阶段三 NFS 参数基线 ............... 只对新挂载点与 Lustre 用 noatime/hard
│
├─ 阶段四 本地 scratch .............. 高风险;需先定容量落点(决策 1)
│ └─ 阶段五 生命周期清理 ......... 必须与两个 scratch 层捆绑
│
└─ 阶段六 工具/PDK + License ........ 受阻于外部介质
(Lustre 已存在,阶段二是"整理"而非"建设",成本远低于旧集群当年)
五、风险与回滚要点¶
| 阶段 | 风险 | 缓解 | 回滚 |
|---|---|---|---|
| 一 | exportfs -ra 短暂影响所有 NFS 客户端 |
低峰执行;导出为追加非修改 | 还原 /etc/exports.bak.* + exportfs -ra |
| 二 | 删除 Lustre 测试残留(testfile/hello.txt/4 个空目录) |
确认均为 09-22 测试产物、非业务数据后再删 | 数据不可恢复——删除前须用户确认 |
| 三 | remount 参数热改失败 |
失败仅告警;hard 只用于新挂载点 |
fstab 备份还原 |
| 四 | 格式化磁盘(不可逆) | 只对新附加的空盘执行;lsblk 确认无文件系统与挂载再动 |
无回滚——故必须先确认是空盘(本阶段最高风险点) |
| 四 | 加盘占用 249 空间(共享宿主) | 先落实第六节决策 1;ssd-pool 余量偏紧需留意 |
virsh detach-disk + 删 qcow2 |
| 五 | Epilog 误删用户数据 | 只删本作业的 scratch 目录;失败作业改名保留 | 停用 Epilog 配置项 + scontrol reconfigure |
通用红线(沿用本集群既有约定):改 /etc/exports 前必备份至本次交付物目录的 backup/;凭据不入命令行;--module-env 类操作前 squeue 必须为空;禁止手改 /usr/local/slurm/(部署覆盖)。
六、待确认项¶
| # | 事项 | 状态 |
|---|---|---|
| 1 | 本地 scratch 容量与落点:A(3×30G 放 ssd-pool,性能优先/余量紧)还是 B(3×50G 放 hdd-pool,空间优先/与 NFS 同盘)? |
需决策(原「50G/节点」基线不可直接套用) |
| 2 | Lustre 测试残留是否清理:/mnt/lustre/ 下 4 个空目录 + hello.txt + 50MB testfile,是否可删? |
需确认 |
| 3 | /local_scratch 权限模式:users 用 1777+sticky(自助),还是按 LDAP uid 预建(可控)? |
需决策 |
| 4 | /home 是否改 hard:取决于是否会有 EDA 工具往家目录写数据 |
待定 |
| 5 | ~~task_epilog_eda.sh 死文件处置~~ → 实测已配置 TaskEpilog=,原判断不成立,本项关闭(2026-09-24) |
已关闭 |
| 6 | 249 是否为单盘无冗余:lsblk 仅见 sda/sdb,LVM/RAID 因非 root 未读到 |
需 root 复核 |
| 7 | 档案文档与实机不一致:Lustre(.21@tcp:/edafs,三节点已挂)在 SOP/RUNBOOK/HANDOFF 中零记载,须补记 |
建议尽快同步 |
| 8 | 本清单落位:作为 docs/SOP.md 新轮次(第六轮)追加,还是独立成册 |
待定 |
已解决(原待确认项):249 容量 ✅(
/data余 1.3T)、节点磁盘形态 ✅(无独立盘,需加盘)、LDAP 组 ✅(8 小组,RUNBOOK 4.4)、现有挂载参数 ✅、TaskProlog 链 ✅、modulefiles 权限 ✅。
附录 A:闸门 0 实测记录(2026-09-24)¶
取证留痕:主机 192.168.31.249(本地)/ .16 / .18 / .19 / .20;全部命令为只读(df、lsblk、mount、findmnt、ls、getent、virsh list/domblklist/pool-dumpxml/domiflist、lfs df、ip neigh);无任何写操作。
| # | 核查项 | 关键结果 |
|---|---|---|
| ① | 249 磁盘 | sda3 220G(用 98G/余 111G);sdb1 1.8T → /data(用 449G/余 1.3T);LVM/RAID 需 root 复核 |
| ② | 节点磁盘 | .18/.19/.20 结构完全一致:vda 100G(vda1 /boot 1G + vda2 / 99G,xfs),无独立数据盘 |
| ③ | 249 角色 | libvirtd active,17 台虚机;ssd-pool→/kvm/img、hdd-pool→/data/kvm/img |
| ④ | 挂载参数 | /home、/opt/modulefiles:soft,timeo=600,retrans=2,relatime,vers=4.2,_netdev(fstab 仅写 rw,soft,_netdev);/mnt/slurm-shared:hard,timeo=600,retrans=2 |
| ⑤ | Lustre(意外发现) | 192.168.31.21@tcp:/edafs → /mnt/lustre,295G/用 52M;1 MDT + 1 OST;.18/.19/.20 均已挂、fstab defaults,nofail;.16/.17 未挂;内容为测试残留 |
| ⑥ | LDAP | SSSD 不枚举;getent passwd cy01 → 4001:4000,getent group custom → 4000;ldapsearch 未安装 |
| ⑦ | Prolog/Epilog | TaskProlog=/etc/slurm/task_prolog_lmod.sh(955B,内部透传 /usr/local/slurm/task_prolog_eda.sh);Epilog=/usr/local/slurm/epilog_eda.sh;task_epilog_eda.sh 存在但未引用 |
| ⑧ | modulefiles 权限 | /opt/modulefiles 及 Core:drwxr-xr-x root root(已达标,无需整改) |
| ⑨ | 目标路径存在性 | .18 上 /projects /local_scratch /tools /pdk 均不存在 |
两个已排除的误报:
1. 首轮 .18 上 findmnt 对 /home 无输出 → 实为 findmnt 不接受多个路径参数,NFS 挂载实际正常。
2. getent group | awk '$3>=1000' 无输出 → 实为 SSSD enumerate=false 的正常表现,按名解析正常。
来源:
/home/rain/Documents/slurm/slurm_ins/eda_storage_gap/本集群存储演进差距清单.md| 最后更新:2026-09-24 23:00(由build/sync.py同步,请勿在站点侧修改)