SOP — Virtuoso 仿真数据落层(应用侧落层段)¶
- 主题目录:
sim_layering_20261012/ - 执行日期:2026-10-12
- 类型:C 类变更(改项目
.cdsinit) - 关联:
docs/BASELINE.md§7.11(机制);lustre_ins/remove_local_mirror_20261012/SOP.md(前置阻塞解除)
1. 背景¶
Virtuoso ADE-XL 的仿真数据(netlist、PSF 波形)默认落 ~/cadence/simulation(由 NCSU CDK cdssetup/cdsenv:31 设定,/pdk 只读不可改)。
本次按 EDA 存储分层把它们分别落到 Tier1 与 Tier0:工程与网表落项目区(NFS 持久),大波形落 Lustre 共享临时层。
机制层面可行路径为 R2:在项目 .cdsinit 末尾追加 envSetVal,因在 NCSU 加载之后执行,能覆盖其默认值(见 docs/BASELINE.md §7.11)。
触发条件:前置阻塞(普通用户写 Lustre 被拒)已于 2026-10-06 修复、2026-10-12 服务端身份源去双轨,落层段具备实施条件。
2. 目标¶
| 项 | 可验证状态 |
|---|---|
| 验收 | .28:/projects/design/rain01/proj1/cdssetup/.cdsinit 末尾含落层段;无头加载后 projectDir 与 saveResDir 返回分层目标 |
| 分层 | projectDir -> /projects/design/rain01/proj1/simulation(Tier1 持久);saveResDir -> /mnt/lustre/scratch/users/rain01/adexl(Tier0 共享临时) |
| 回归 | 无头加载退出码 0,无 *Error* |
3. 前置条件¶
| 条件 | 检查方法 | 本次实测 |
|---|---|---|
.28 root 免密可达 |
remote_exec.py --hosts 192.168.31.28 |
✅ |
/projects(NFS)、/mnt/lustre(Lustre)已挂载 |
findmnt -M |
✅ |
| 目标目录可写 | 项目区属 rain01:design 2775;Lustre 用户目录属 rain01 |
✅ |
Lustre 的 scratch/users(755 root)下需 root 建用户目录 |
ls -ld /mnt/lustre/scratch/users |
✅ 见步骤 1 |
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 主机 | 192.168.31.28(hpc-submit) |
| 文件 | /projects/design/rain01/proj1/cdssetup/.cdsinit(追加落层段);新建两个目标目录 |
| 停服 | 否。不改 Slurm 配置、不重启服务 |
| 在跑业务 | 变更时有一个长期运行的 Virtuoso GUI 会话(锁 ~/CDS.log),未受影响;无头验证用独立 -log 避免争锁 |
| 生效方式 | 新开会话生效;GUI 已开需重启 Virtuoso(.cdsinit 启动时加载) |
5. 分步操作¶
实现体:无(一次性手工变更,单机)。
步骤 1:建目标目录¶
坑:/mnt/lustre/scratch/users 是 755 root:root,普通用户不能在其下建目录(POSIX 语义,非缺陷),须由 root 建用户目录并授权。
# Tier1 项目区子目录(客户端视角可写)
mkdir -p /projects/design/rain01/proj1/simulation
chown rain01:design /projects/design/rain01/proj1/simulation
chmod 2775 /projects/design/rain01/proj1/simulation
# Tier0 Lustre 用户目录(root 建,授给用户)
mkdir -p /mnt/lustre/scratch/users/rain01/adexl
chown -R rain01:design /mnt/lustre/scratch/users/rain01
步骤 2:备份并追加落层段¶
坑:envSetVal 段必须落在 NCSU 加载之后(即文件末尾),否则会被 NCSU 默认值覆盖;注释用英文(Cadence 以非 UTF-8 解析 .cdsinit,中文注释会逐行报 "Skipping")。
用 root 以追加方式写入(>> 不改属主,文件保持 rain01):
先行备份,再追加;追加前用 grep 判重保证幂等。
F=/projects/design/rain01/proj1/cdssetup/.cdsinit
cp -p "$F" "$F.bak.$(date +%Y%m%d-%H%M%S)" # 备份(本次 .bak.20261012-011523,1641 B)
grep -q SIM-DATA-LAYERING "$F" || cat >> "$F" <<'SKILL'
;; --- SIM-DATA-LAYERING ----------------------------------------------------
;; Route ADE-XL simulation data onto the cluster storage tiers.
;; projectDir -> Tier1 NFS /projects (persistent: project, netlist, source)
;; saveResDir -> Tier0 Lustre scratch (shared transient: PSF waveform, large)
;; Placed AFTER the NCSU load so these envSetVal calls override cdsenv defaults.
;; NOTE: Lustre scratch is aged out (30 days); stage out final results to /projects.
envSetVal("asimenv.startup" "projectDir" 'string "/projects/design/rain01/proj1/simulation")
envSetVal("adexl.results" "saveResDir" 'string "/mnt/lustre/scratch/users/rain01/adexl")
;; --- end SIM-DATA-LAYERING ------------------------------------------------
SKILL
6. 验证¶
# ① 落层段存在、属主不变
grep -n SIM-DATA-LAYERING /projects/design/rain01/proj1/cdssetup/.cdsinit
ls -l /projects/design/rain01/proj1/cdssetup/.cdsinit # 期望属主 rain01:design
# ② 无头加载(独立 log,避免与在跑 GUI 争 CDS.log 锁)
printf 'printf("PROJDIR=%%s\\n" envGetVal("asimenv.startup" "projectDir"))\nprintf("SAVEDIR=%%s\\n" envGetVal("adexl.results" "saveResDir"))\nexit()\n' > /tmp/chk_simlayering.il
su -s /bin/bash rain01 -c 'cd /projects/design/rain01/proj1/cdssetup && source /etc/profile.d/zzz_site_lmod.sh && module load cadence && module load virtuoso/IC06.17.700 && virtuoso -nograph -log /tmp/chk_simlayering.log -replay /tmp/chk_simlayering.il'
grep -aE 'PROJDIR|SAVEDIR' /tmp/chk_simlayering.log
| 验证项 | 结果(2026-10-12) |
|---|---|
| 落层段写入 | .cdsinit 1641 B -> 2371 B,属主 rain01:design |
PROJDIR |
/projects/design/rain01/proj1/simulation |
SAVEDIR |
/mnt/lustre/scratch/users/rain01/adexl |
| 无头退出码 | 0(仅有红字警告,无 *Error*) |
7. 回滚¶
备份位置:192.168.31.28:/projects/design/rain01/proj1/cdssetup/.cdsinit.bak.20261012-011523(1641 B)。
台账见本目录 backup/README.md。
F=/projects/design/rain01/proj1/cdssetup/.cdsinit
cp -p "$F.bak.20261012-011523" "$F"
grep -c SIM-DATA-LAYERING "$F" # 期望 0
回滚后 Virtuoso 恢复落 ~/cadence/simulation(NCSU 默认)。新建的两个目标目录可保留(数据无损坏),如需清理由用户确认后删。
8. 风险说明¶
| 风险 | 等级 | 缓解 |
|---|---|---|
| 落层段未被加载(位置错误或 CDS_LOAD_ENV 非 CWD) | 中 | 段落在末尾、NCSU 之后;无头验证确认生效 |
| Lustre 层 30 天老化清掉波形 | 中 | 需长期保留的结果须 stage-out 回 /projects;SOP 与注释均已写明 |
| GUI 已开会话不生效 | 低 | 属预期,重启 Virtuoso 即生效 |
| 站点模板/生成器未含该段 | 低 | 见「未做项」,仅项目副本已落;通用化待定 |
已同步到生成器与站点模板(口径:甲,通用参数化):落层段已写入生成器 pdk_integration_20260927/deployer.py::_render_templates() 与站点模板 /pdk/templates/.cdsinit,用通用写法(不硬编码用户):
envSetVal("asimenv.startup" "projectDir" 'string strcat(getWorkingDir() "/simulation"))
envSetVal("adexl.results" "saveResDir" 'string strcat("/mnt/lustre/scratch/users/" getShellEnvVar("USER") "/adexl"))
站点模板经 .venv/bin/python main.py apply 由 1641 B 更新为 2459 B(dry-run 仅 template:.cdsinit 一项待变更,其余全跳过;6 台客户端可见)。
临时设计目录无头验证:PROJDIR=<cwd>/simulation、SAVEDIR=/mnt/lustre/scratch/users/rain01/adexl。
依赖已处理(口径甲1,2026-10-12):/mnt/lustre/scratch/users 原为 755 root:root,普通用户不能自建 <user> 目录。现已参数化为 1777(sticky)并由 slurm_ins 的 storage_layout 幂等维护(tier0.users_dir_mode),用户可自助建自己的目录;非 rain01 用户(cy01 实测)已可自助建目录。见 slurm_ins/scratch_users_20261012/SOP.md。
附录:交付物与证据¶
- 本目录:
SOP.md、backup/README.md - 机制与已证伪路径:
docs/BASELINE.md§7.11 - 无头验证输出:
.28:/tmp/chk_simlayering.log(含PROJDIR/SAVEDIR两行)
来源:
/home/rain/Documents/eda_tools_ins/design/sim_layering_20261012/SOP.md| 最后更新:2026-10-12 01:27(由build/sync.py同步,请勿在站点侧修改)