EDA 存储标准化方案¶
适用环境:slurm_ins 测试集群(inventory.yaml) 目标:按 EDA(芯片设计自动化)行业标准规范存储的挂载、分层与目录结构 交付方式:方案 + 可复现幂等脚本 + dry-run 预演(本文档为方案,脚本见
deploy/)
一、背景与目标¶
EDA 工作负载以海量小文件 + 元数据密集型 + 高并发只读共享为特征,是通用 IT 存储标准无法覆盖的专用场景。本方案把 EDA 行业通行的存储实践落到你的集群上。
落地范围(已确认): 1. NFS 客户端挂载参数基线统一 2. Tier0 Lustre scratch 规范 3. Tier1 标准目录结构与权限
不在本次范围:配额、快照、备份生命周期(后续单独实施)。
二、EDA 存储行业标准要点¶
2.1 工作负载画像¶
- 千万级小文件:RTL / 网表 / 库 / GDSII,单文件 KB~MB 级。
- 元数据风暴:VCS / Xcelium / DC / Innovus / PrimeTime 启动时
open/stat/close海量文件,瓶颈在元数据 IOPS,不带宽。 - 高并发只读:回归 / 仿真农场几十~几千作业同时读同一份设计数据。
- 顺序写大文件:波形 FSDB/VCD、综合与布局结果、日志。
- 不可重建:设计源与库价值极高,损坏不可逆。
2.2 分层存储模型(核心标准)¶
| 层级 | 承载 | 选型 | 备份 | 生命周期 |
|---|---|---|---|---|
| Tier0 Scratch | 仿真中间文件、波形、临时结果 | 并行文件系统(Lustre) | 不备份 | 定期清理 |
| Tier1 Project/Home | 设计源、脚本、工具、PDK、家目录 | 企业级 NAS(NFS) | 定期备份 | 长期 |
| Tier2 Archive | 流片归档、法务留存 | 对象存储 / 磁带 | 异地 | 数年 |
铁律:三类数据物理分离,scratch 写爆不得影响项目源数据。
2.3 选型标准¶
- NFS = EDA 工具链事实标准:工具依赖强 POSIX 语义(
fcntl文件锁、mmap、原子rename、精确stat)。 - 并行文件系统只用 Scratch:Lustre 高带宽适合临时数据,不用于需强锁语义的源数据。
- 对象存储只做归档:语义不兼容,不能直接被工具读写。
2.4 NFS 挂载参数标准¶
推荐:hard,timeo=600,retrans=2,noatime,actimeo=30,nfsvers=4.1,nconnect=8,_netdev
禁止:soft(超时静默返回错误 → 工具写坏数据)
慎用:noac(元数据性能崩塌)、nolock(破坏文件锁语义)
2.5 目录结构标准¶
/projects/<项目> Tier1 项目工作区(rw,配额,快照)
/home/<用户> Tier1 家目录
/tools/<厂商>/<版本> Tier1 工具安装(ro,多版本并存)
/pdk/<Foundry>/<工艺> Tier1 工艺库(ro)
/scratch/<用户>/<作业> Tier0 临时(Lustre,定期清理)
/archive/<年份>/<项目> Tier2 归档
三、现状探查结果(只读实测)¶
3.1 存储资源¶
| 资源 | 主机 | 实测状态 |
|---|---|---|
Lustre eda_fs |
MGS=harbor(.12) / MDS=nfs(.13) / OSS=k8s-master-03(.4) | 1 MDT(11G) + 3 OST(各 48.8G),总 146.4G,使用 1% |
| Lustre 客户端 | 全部业务节点 | 已挂载 /lustre/eda_fs(默认 stripe_count=1) |
| NFS Server | nfs(.13) | 导出 /home、/opt/lsf、/data/*,同一 217G 文件系统 |
| 现有 Lustre 目录 | — | workspace/ tools/ license/ lsf_log/ slurm_demo/ |
3.2 差距清单(问题)¶
| # | 问题 | 证据 | 风险 |
|---|---|---|---|
| 1 | NFS 使用 soft 挂载 | k8s-node-01/02/03、harbor、k8s-master-03 的 /data、/opt/lsf 实测 soft,timeo=30 |
高:静默写坏数据 |
| 2 | 挂载参数不统一 | /home 在部分节点 timeo=30,IDE 为 timeo=600 |
中:行为不一致 |
| 3 | fstab 与实际挂载漂移 | k8s-master-01 /mnt/nfs fstab 写 hard,实际含 soft;retrans 不一致 |
中:重启后行为突变 |
| 4 | 无 noatime / actimeo |
全部 NFS 挂载为 relatime |
中:元数据写放大 |
| 5 | Lustre 参数不统一 | 多数节点 defaults,noauto,x-systemd.automount,缺 noatime/flock/lazystatfs |
中 |
| 6 | 无标准目录树 | 无 /projects /tools /pdk;scratch 未隔离命名 |
中 |
| 7 | Lustre 无条带化 | scratch 使用默认 stripe_count=1,3 个 OST 未并行 | 中:带宽浪费 |
| 8 | 未启用配额 | repquota 为空 |
低(本次不做) |
四、目标态设计¶
4.1 NFS 客户端基线(Tier1)¶
- 统一为
rw,hard,timeo=600,retrans=2,noatime,actimeo=30,_netdev - 去除全部 soft;
intr/bg/defaults等不稳定项规整 - 生效方式:更新
/etc/fstab+mount -o remount nconnect=8需重新挂载才生效,默认不启用(配置项已预留,待内核确认与维护窗口)
4.2 Tier0 Lustre scratch¶
- 客户端参数统一为
_netdev,noatime,flock,lazystatfs,x-systemd.automount - 新建
/lustre/eda_fs/scratch/{users,projects,tmp}(tmp置 1777 粘滞位) - scratch 根目录条带化
-c 3 -S 1M(跨 3 个 OST 提升并发带宽) - 保留现有
workspace/ tools/ license/ lsf_log/不动
4.3 Tier1 目录结构与权限¶
| 目录 | 权限 | 属主 | 导出 | 客户端挂载点 |
|---|---|---|---|---|
/data/eda/projects |
2775(setgid) | eda_dev:eda_dev | rw | /projects |
/data/eda/tools |
0755 | root:root | ro | /tools |
/data/eda/pdk |
0755 | root:eda_dev | ro | /pdk |
五、变更清单(dry-run 实测:共 61 项)¶
| 分类 | 数量 | 风险 | 说明 |
|---|---|---|---|
nfs_client |
24 | 中 | 8 节点 × 3 挂载点,更新 fstab + remount |
lustre_client |
6 | 低 | 6 个客户端 Lustre fstab 参数 |
lustre_scratch_dir |
1 | 低 | 创建 scratch 目录树 |
tier1_dir |
3 | 低 | 创建 projects/tools/pdk |
tier1_export |
3 | 中 | 追加导出并 exportfs -ra |
tier1_mount |
24 | 中 | 8 节点 × 3 新挂载点 |
注:harbor(.12)、k8s-master-03(.4) 是 Lustre 服务端,无
/lustre/eda_fs客户端 fstab,脚本已正确跳过。
六、风险与回滚¶
风险¶
| 项 | 风险 | 缓解 |
|---|---|---|
remount /home |
参数热改,理论不中断;个别内核参数不支持热改会失败 | 失败仅告警不中断;nconnect 不纳入热改 |
exportfs -ra |
重载导出会短暂影响所有 NFS 客户端 | 低峰执行;导出条目为追加非修改,不破坏现有 |
| 新增挂载点 | 全新挂载点,不动现有数据 | 幂等检查,已存在即跳过 |
| k8s 动态 PV | 由 kubelet 管理的 /var/lib/kubelet/... 挂载不在脚本范围 |
后续在 PV/StorageClass 层统一 |
回滚¶
- 所有
/etc/fstab、/etc/exports变更前自动带时间戳备份(.bak.YYYYmmdd_HHMMSS) - 一键回滚:
python3 main.py --rollback(恢复最新备份) - 新增挂载点卸载需人工确认(SOP 提供步骤)
七、交付物¶
eda_storage_standardization/
├── 方案说明.md # 本文档
└── deploy/
├── main.py # 入口(CLI:--dry-run/--config/--log-level/--rollback/--force)
├── deployer.py # BaseDeployer 基类(锁/日志/dry-run/生命周期)
├── service_deployer.py # EdaStorageDeployer 业务实现
├── utils/ # 日志/配置/幂等/文件/远程执行
├── config/deploy.yaml.example
├── logs/ # 运行日志
└── docs/{SOP.md,troubleshoot.md}
操作手册见 SOP.md,故障排查见 troubleshoot.md。
八、第二轮补充:目录标准化 + 本地 SSD scratch¶
基于对 /data、/lustre/eda_fs、3 个计算节点的实测,补充了行业标准存储分层(Tier1 NFS / Tier0 Lustre / 本地 SSD)与目录对照设计,详见
存储目录行业标准设计.md。
要点:
- 你现有 /data/slurm/{opt,modules,users,eda_pak} 已完成 Tier1 约 70%,主要缺口是 PDK/License 多处分散、无项目区、Tier0 与本地层未建。
- Lustre eda_fs 目前基本空白,正好按标准从零规划为纯 scratch。
- 3 个计算节点(k8s-node-01/02/03)均无独立数据盘,本地 scratch 采用 KVM 附加 50G 独立虚拟盘。
决策已定并落地进脚本:
| # | 决策点 | 结论 |
|---|---|---|
| 1 | 本地 scratch 容量 | 50G/节点 × 3 台 |
| 2 | 本地盘创建方式 | KVM 附加独立虚拟盘(dell-r620) |
| 3 | Tier1 目录策略 | 增量 + 软链收敛(零破坏) |
| 4 | Lustre 整理 | 重整为纯 scratch(含安全清理) |
第二轮 dry-run 实测 68 项(较第一轮 61 项新增):tier1_eda_root/dir 2 项、tier1_link 2 项、tier0_cleanup 3 项。本地 scratch 12 项(3 节点 × 4)待 KVM 加盘后自动出现——脚本已能正确检测并提示"未检测到设备 /dev/vdb"。
执行顺序:先 KVM 加盘 → dry-run 复核 → 真实执行(详见 SOP)。
来源:
/home/rain/Documents/slurm/slurm_ins/方案说明.md| 最后更新:2026-09-11 14:18(由build/sync.py同步,请勿在站点侧修改)