跳转至

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 同步,请勿在站点侧修改)