跳转至

SOP — 作业级 TMPDIR 注入本地 scratch(/local_scratch/users)

主题目录:lsf_ins/tmpdir_inject_20261008/|执行日期:2026-10-08|类型:C 类(改共享配置 + 改实现体)

一、背景

/local_scratch(阶段15,2026-10-07 纳管)已挂载、profile.d 已导出 LOCAL_SCRATCH, 但作业内 TMPDIR 仍为空:LSF 未把作业临时目录导出为环境变量,作业的临时文件因此落在 执行节点本地盘 /tmp,与 Slurm 侧「本地临时层承载作业临时数据」的口径不一致 (HANDOFF §3 #5;../local_scratch/SOP.md 第八章坑 1)。 Slurm 侧由 TaskProlog 注入,LSF 侧此前没有对应机制。

二、目标

项 目标态
作业内 TMPDIR /local_scratch/users/<jobID>.tmpdir(LSF 命名规则,见下)
权限 / 属主 0700 / 作业执行用户(LSF 自动创建)
生命周期 作业结束由 LSF 自动删除(实测确认,无需额外老化清理)
幂等 部署器复跑零变更;--drift 全阶段无漂移
可迁移 路径经配置项 lsf.job_tmpdir 给出,不硬编码在实现体

机制来自官方 man lsf.conf(5)(本机 LSF_TOP/10.1/man/man5/lsf.conf.5):

  • LSB_JOB_TMPDIR=<dir>:LSF 在作业启动时于该目录下创建作业专属临时目录 (普通作业 $LSB_JOB_TMPDIR/<jobID>.tmpdir;数组作业 <arrayID>_<arrayIndex>.tmpdir), 属执行用户、权限 0700;
  • LSB_SET_TMPDIR=Y:把上述路径导出为 TMPDIR;
  • 生效方式:bctrld restart sbd all(官方原文;重启 sbatchd,不影响 mbatchd)。

三、前置条件

  • /local_scratch 已在执行节点挂载(阶段15,--drift 含该阶段无漂移);
  • 无 RUN 作业(bjobs -u all 显示 No unfinished job found)——重启 sbatchd 前必须确认;
  • 操作机对节点 root 免密可用;ldapadmin 可执行 bctrld/badmin;
  • 配置文件含 lsf.job_tmpdir(本次新增,见 5.2)。

四、影响范围

  • 主机:共享配置 1 处(/data/nfs/lsf/lsf/conf/lsf.conf,NFS 上,6 台共享)
  • 6 台 sbatchd 重启(hpc-submit / lsf-master-01/02 / lsf-work-01~03)。
  • 是否停服:不停服,只重启 sbatchd;无 RUN 作业时无影响(本次实测 6 台 done, 集群状态保持 3 台 work ok + 3 台 closed_Full)。
  • 回滚:还原 lsf.conf 备份 + 再次 bctrld restart sbd all;无需重启节点。

五、分步操作

实现体:deploy/lsf/stages/lsf_install.py(子步 C:lsf.conf 加固)、 deploy/lsf/utils/config_validate.py(配置校验)、deploy/lsf/config/lsf_deploy.yaml(配置项)。

步骤 1:备份(高危前置,实现体自动执行)

cp -a /data/nfs/lsf/lsf/conf/lsf.conf /data/nfs/lsf/lsf/conf/lsf.conf.bak.<时间戳>

预期:同目录出现 .bak.<时间戳>(属主 ldapadmin,与原文件一致)。实现体在追加前自动完成, 本次落 lsf.conf.bak.20261008-034607。

步骤 2:写入共享 lsf.conf(幂等)

grep -qF 'LSB_JOB_TMPDIR=/local_scratch/users' /data/nfs/lsf/lsf/conf/lsf.conf || \
  echo 'LSB_JOB_TMPDIR=/local_scratch/users' >> /data/nfs/lsf/lsf/conf/lsf.conf
grep -qF 'LSB_SET_TMPDIR=Y' /data/nfs/lsf/lsf/conf/lsf.conf || \
  echo 'LSB_SET_TMPDIR=Y' >> /data/nfs/lsf/lsf/conf/lsf.conf

坑 1:路径长度上限 256 字符(含 LSF 运行期生成的子目录与文件),故取短路径 /local_scratch/users,不要写成带用户名/日期的长路径。

坑 2:LSB_JOB_TMPDIR 不支持用户名占位符(仅支持 %H=首执行主机), 因此无法做成 Slurm 侧的 users/<用户>/<jobid> 两级布局;隔离靠目录 0700 + 属执行用户。 本机实测作业目录为 /local_scratch/users/1051.tmpdir、drwx------ root root。

坑 3:该参数由 sbatchd 读取,lsadmin reconfig / badmin mbdrestart 均不生效, 必须重启 sbatchd(见步骤 3)。

步骤 3:生效(高风险:重启 sbatchd)

# 门禁:有 RUN 作业即停手
su - ldapadmin -s /bin/bash -c "bash -lc 'bjobs -u all'"
# 生效(交互命令,逐台确认;非交互时用 yes 应答)
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | bctrld restart sbd all'"

预期:逐台打印 Restart server batch daemon on <host> ...... done(本次 6 台全 done)。 失败判断:某台报错 → 该台 systemctl status lsfd,必要时 badmin hrestart <host> 后重试。

步骤 4:部署器复跑(幂等验收)

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage install     # 预期「零变更跳过」
.venv/bin/python main.py -c config/lsf_deploy.yaml --drift             # 预期 rc=0、全阶段无漂移

六、验证

# 从提交节点提交作业,输出写共享路径(执行节点本地盘读不到)
ssh root@192.168.31.28 'source /data/nfs/lsf/lsf/conf/profile.lsf; \
  bsub -q normal -o /data/nfs/lsf/tmpdir_after.out \
  "echo TMPDIR=[\$TMPDIR]; [ -d \$TMPDIR ] && echo DIR_OK || echo DIR_MISSING; ls -ld \$TMPDIR; echo DONE"'
# 等作业 DONE 后读回
ssh root@192.168.31.28 'cat /data/nfs/lsf/tmpdir_after.out'
判据 期望(实测)
TMPDIR /local_scratch/users/<jobID>.tmpdir(第 1 遍 1051 / 第 2 遍 1052)
目录存在 DIR_OK
权限属主 drwx------ 2 root root(0700)
作业结束后清理 ls -ld /local_scratch/users/1051.tmpdir → No such file or directory
改动前对照(反例) 改前同一作业输出 TMPDIR=[](判据可判失败)
部署器幂等 --stage install 复跑「零变更跳过」;--drift rc=0

七、回滚

  1. 还原共享配置:
cp -a /data/nfs/lsf/lsf/conf/lsf.conf.bak.<时间戳> /data/nfs/lsf/lsf/conf/lsf.conf
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | bctrld restart sbd all'"
  1. 回退部署器(如需彻底摘除纳管):还原 stages/lsf_install.py、utils/config_validate.py、 config/lsf_deploy.yaml(.example)(见 backup/README.md),或把 lsf.job_tmpdir 置空 ——实现体在值为空时不探测、不追加,等效于不纳管。

回滚后验证:作业内 TMPDIR=[];--drift 仍 rc=0(配置项已置空)。

八、风险说明

风险 说明与缓解
重启 sbatchd 影响运行中作业 动手前 bjobs -u all 必须无 RUN(本次已确认);窗口选无作业时段
目录写满本地盘 作业结束 LSF 自动删除(实测);/local_scratch 为 50G 独立虚盘,不挤占系统盘
路径超 256 字符 取短路径 /local_scratch/users;配置校验强制绝对路径
与 Slurm 侧布局不一致 受 LSF 机制约束(无用户名占位符),已在本 SOP 明确;隔离靠 0700
--drift 漏检 已纳管进部署器阶段3-6(探测项 + 幂等追加),非手工改配置

附录 A:交付物清单

文件 说明
deploy/lsf/stages/lsf_install.py 新增 conf_job_tmpdir / conf_set_tmpdir 探测项与幂等追加、生效提示
deploy/lsf/utils/config_validate.py 白名单加 lsf.job_tmpdir;校验须为绝对路径
deploy/lsf/config/lsf_deploy.yaml(.example) 新增 lsf.job_tmpdir: /local_scratch/users
tmpdir_inject_20261008/SOP.md 本文件
tmpdir_inject_20261008/backup/README.md 备份台账

来源:/home/rain/Documents/LSF/lsf_ins/tmpdir_inject_20261008/SOP.md | 最后更新:2026-10-08 03:48(由 build/sync.py 同步,请勿在站点侧修改)