EDA 存储标准化 执行手册(SOP)¶
一、背景¶
集群已部署 Lustre eda_fs(1 MDT + 3 OST)与 NFS 服务,但存在:NFS 使用 soft 挂载、挂载参数不统一、fstab 与实际漂移、Lustre 参数不统一、无标准目录树与 scratch 隔离。本次按 EDA 行业标准统一。
二、目标¶
- NFS 客户端挂载参数统一为
hard,timeo=600,retrans=2,noatime,actimeo=30(去soft)。 - Lustre 客户端参数统一为
noatime,flock,lazystatfs,建立/lustre/eda_fs/scratch并条带化-c 3 -S 1M。 - 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 层(诚实结论)¶
- 原生
cachefilesd只缓存文件内容,不缓存元数据 —— 而 EDA 的瓶颈恰恰在元数据,收益有限。 - 真正能缓解 EDA 元数据压力的 FlexCache / AFM / VAST 均为商业授权方案,学习环境无法复现。
- 本项目已通过 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 存储分层的最终判定标准¶
判断某环境是否"标准",不看是否装了缓存,而看:
- Tier1 / Tier0 / 本地 三层是否物理分离,IO 特征互不干扰
- 工具/PDK 是否只读 + 版本化
- License 是否服务化(不挂载)
- 客户端是否有全局统一视图(
/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同步,请勿在站点侧修改)