跳转至

EDA 存储标准化 执行手册(SOP)

一、背景

集群已部署 Lustre eda_fs(1 MDT + 3 OST)与 NFS 服务,但存在:NFS 使用 soft 挂载、挂载参数不统一、fstab 与实际漂移、Lustre 参数不统一、无标准目录树与 scratch 隔离。本次按 EDA 行业标准统一。

二、目标

  1. NFS 客户端挂载参数统一为 hard,timeo=600,retrans=2,noatime,actimeo=30(去 soft)。
  2. Lustre 客户端参数统一为 noatime,flock,lazystatfs,建立 /lustre/eda_fs/scratch 并条带化 -c 3 -S 1M。
  3. NFS Server 建立 /data/eda/{projects,tools,pdk} 并导出;客户端挂载为 /projects /tools /pdk。

三、前置条件

  • 管控机(rian 192.168.0.11)到 config/deploy.yaml 中 9 台主机免密登录可用。
  • 管控机具备 python3(≥3.9)与 pyyaml。
  • 目标主机具备 lfs(Lustre 客户端)与 exportfs(NFS 服务端)。
  • 建议在业务低峰执行;执行前确认无正在进行的流片/回归作业。
  • 已备份关键数据(本脚本仅备份配置,不代管业务数据)。

四、分步操作

步骤 1:KVM 附加本地 scratch 虚拟盘(3 台计算节点)

在 KVM host dell-r620(192.168.0.250)执行(演示):

for n in k8s-node-01 k8s-node-02 k8s-node-03; do
  qemu-img create -f qcow2 /kvm/qcow2/${n}-scratch.qcow2 50G
  virsh attach-disk ${n} /kvm/qcow2/${n}-scratch.qcow2 vdb \
    --targetbus virtio --subdriver qcow2 --persistent
done

关键:--subdriver qcow2 必须显式指定。否则 libvirt 会以 type='raw' 附加, 节点内核按 raw 读取 qcow2 文件,容量会错误显示为文件实际大小(如 193K)而非 50G。

验证(节点内应出现 50G 的 /dev/vdb):

ssh root@192.168.0.5 "lsblk -dn -o NAME,SIZE /dev/vdb"   # 期望输出 vdb 50G

步骤 2:准备配置

cd /home/rian/Documents/slurm_ins/eda_storage_standardization/deploy
cp config/deploy.yaml.example config/deploy.yaml
# 按需修改 IP / 目录 / 参数

步骤 3:dry-run 预演(必做)

python3 main.py --dry-run --log-level INFO

预期:打印全部待变更项(未加盘时 68 项,加盘后约 80 项),不修改任何系统状态。逐项核对差异是否符合预期。

步骤 4:真实执行

python3 main.py --log-level INFO

NFSv4 环境的额外说明:本环境 NFSv4 不支持 remount,参数变更需 umount + mount 才生效。 默认模式仅更新 fstab 并尝试 remount(记录告警);如需立即生效,加 --force: bash python3 main.py --log-level INFO --force /opt/lsf、/mnt/nfs 若被服务/PV 占用会卸载失败,属正常,重启节点即生效(fstab 已持久化)。

执行顺序(基类统一编排,幂等): 1. 获取 PID 锁(防并发) 2. pre_check 前置校验 3. sync_status 幂等巡检 4. backup 备份 /etc/fstab、/etc/exports 5. deploy:写 fstab → mkfs → 建目录/软链 → 导出 → 清理 → 挂载/remount(--force 时 umount+mount)→ 挂载后建 scratch 子目录 6. health_check 校验 7. 释放锁

步骤 5:幂等复验(必做)

python3 main.py --log-level INFO

预期:零变更、全跳过、无报错。若仍有变更项,检查 remount 是否被 busy 阻塞、/dev/vdb 是否已挂载。

五、验证

# 1) NFS 参数(应无 soft,含 noatime/actimeo)
ssh root@192.168.0.5 "grep -E '/home|/opt/lsf|/mnt/nfs' /proc/mounts"

# 2) Lustre 客户端参数与 scratch
ssh root@192.168.0.2 "grep eda_fs /proc/mounts; lfs getstripe /lustre/eda_fs/scratch"

# 3) Tier1 标准目录、收敛软链与导出
ssh root@192.168.0.13 "ls -ld /data/slurm/eda/*; exportfs -v | grep -E 'eda'"

# 4) 客户端挂载点
ssh root@192.168.0.2 "df -hT /projects /tools /pdk"

# 5) 本地 scratch(3 个计算节点)
for h in 192.168.0.5 192.168.0.6 192.168.0.7; do
  ssh root@$h "df -hT /local_scratch; ls -ld /local_scratch/users; cat /etc/profile.d/eda_scratch.sh"
done

附录:KVM 虚拟盘管理(dell-r620)

# 查看某节点磁盘挂载情况
virsh domblklist k8s-node-01

# 移除本次附加的 scratch 盘(需先在节点内 umount /local_scratch)
virsh detach-disk k8s-node-01 vdb --persistent

附录 B:存储分层与"缓存层(C 层)"方案背景

B.1 EDA 存储三层模型

层 承载数据 本项目状态
A 本地节点 scratch 作业运行目录、$TMPDIR、仿真中间文件 ✅ 已实施(3 计算节点 50G /local_scratch)
B 共享 Tier0 波形、结果等跨节点临时数据(Lustre) ✅ 已实施(/lustre/eda_fs/scratch,stripe -c 3)
C 缓存层 对 Tier1(NFS)的读缓存,缓解元数据/回源压力 ❌ 未实施(本附录说明背景)

B.2 C 层是什么

业界 EDA 环境的"缓存"特指在计算节点侧对共享 NAS 做读缓存,代表技术:

  • NetApp FlexCache:缓存 NFS 数据与元数据,多节点共享缓存
  • IBM Spectrum Scale AFM(Active File Management):GPFS 的缓存/预取
  • VAST VastCache / WEKA / DDN:EDA 专用高速缓存层
  • Linux 原生 cachefilesd(FS-Cache):NFS 客户端本地盘缓存

为什么要它:EDA 工具启动时对数万文件做 open/stat,若都回源 NFS,会造成元数据风暴与网络往返延迟。C 层让热数据留在节点本地。

B.3 为什么本项目不做 C 层(诚实结论)

  1. 原生 cachefilesd 只缓存文件内容,不缓存元数据 —— 而 EDA 的瓶颈恰恰在元数据,收益有限。
  2. 真正能缓解 EDA 元数据压力的 FlexCache / AFM / VAST 均为商业授权方案,学习环境无法复现。
  3. 本项目已通过 A 层(本地 scratch)+ B 层(Lustre) 覆盖了"临时数据落本地/并行 FS"这一核心诉求,C 层属可选性能优化,非功能必需。

B.4 若要实施 C 层(演示级,仅供参考)

# 计算节点侧(演示,未在本项目执行)
yum install -y cachefilesd
sed -i 's/^#cache_dir/cache_dir/' /etc/cachefilesd.conf   # 指定本地缓存目录(如 /local_scratch/cache)
systemctl enable --now cachefilesd
# 客户端以 fsc 选项重新挂载 NFS
mount -o remount,fsc /home        # 或 fstab 增加 fsc 选项

适用边界:仅适合"少数大文件被反复读"的场景;对"海量小文件 + 元数据密集"的 EDA 负载提升有限,不建议据此认为已获得 EDA 级缓存能力。

B.5 EDA 存储分层的最终判定标准

判断某环境是否"标准",不看是否装了缓存,而看:

  1. Tier1 / Tier0 / 本地 三层是否物理分离,IO 特征互不干扰
  2. 工具/PDK 是否只读 + 版本化
  3. License 是否服务化(不挂载)
  4. 客户端是否有全局统一视图(/tools、/pdk、/projects、/scratch)

本项目在上述 4 点均已达标,C 层缺失不影响"标准"判定。

六、回滚

# 一键回滚(恢复最新时间戳备份的 fstab/exports)
python3 main.py --rollback

# 手工卸载本次新增挂载点(确认无进程占用后)
ssh root@<host> "umount /projects /tools /pdk"

回滚后核对 /etc/fstab 与 /proc/mounts 一致性。注意:仅恢复配置,已 remount 的参数需重启或再次 remount 才完全返回旧值。

七、风险说明

风险 等级 说明与缓解
remount 失败 中 /home busy 时可能失败,仅告警不中断;已排除需重挂载的 nconnect
exportfs -ra 中 重载导出短暂影响客户端;条目为追加,不修改现有导出
新挂载点 低 全新挂载点,不影响现有数据
k8s PV — kubelet 管理的挂载不在脚本范围,后续在 StorageClass 层统一
高危模式 高 --force 会跳过部分安全确认,默认禁用

来源:/home/rain/Documents/slurm/eda_storage_standardization/deploy/docs/SOP.md | 最后更新:2026-09-12 00:36(由 build/sync.py 同步,请勿在站点侧修改)