OpenLava 完全入门(二):作业提交与管理全解

OpenLava 完全入门(二):作业提交与管理全解

摘要:掌握作业管理是使用 OpenLava 的核心。本文系统讲解 bsub、bjobs、bkill、bstop/bresume、bpeek、bmod、bhist 等常用命令,覆盖作业提交、查询、控制、查看历史完整生命周期,并结合大量生产场景示例。读完你能自如地提交、监控和调试各种作业。

上一篇我们搭好了 OpenLava 集群并跑通了第一个 sleep 作业。这一篇系统讲解作业管理。


零、读前必看

0.1 适合谁

  • ✅ 已经有一套可用的 OpenLava 集群
  • ✅ 想系统掌握作业管理命令
  • ✅ 从 LSF 迁移过来,想找命令对照

0.2 你需要知道的

命令 作用 级别
bsub 提交作业 🔥🔥🔥 必会
bjobs 查看作业 🔥🔥🔥 必会
bkill 杀掉作业 🔥🔥🔥 必会
bstop / bresume 挂起 / 恢复 🔥🔥 常用
bpeek 实时看输出 🔥🔥 常用
bmod 修改作业参数 🔥🔥 常用
bhist 历史记录 🔥🔥 常用
bbot / btop 调整优先级 🔥 偶尔用

一、bsub:提交作业

1.1 最简形式

# 提交一个命令
bsub sleep 100
# Job <1001> is submitted to default queue <normal>.

# 提交一个脚本
bsub < my_job.sh
# 注意用重定向,脚本里可以写 #BSUB 指令
**两种提交方式区别**:`bsub command` 直接传命令,`bsub < script.sh` 读脚本(脚本里可以用 `#BSUB` 写参数)。生产环境推荐第二种,可追溯。

1.2 常用参数

bsub \
  -q normal              # 队列名
  -n 4                   # 需要的 CPU 核数(slot 数)
  -R "rusage[mem=4096]"  # 资源需求(每核 4G 内存)
  -J my_job_name         # 作业名
  -o output.log          # 标准输出文件
  -e error.log           # 标准错误文件
  -W 2:00                # 运行时间上限(小时:分钟)
  -u user@example.com    # 邮件通知
  -N                     # 作业完成发邮件
  -w "done(1001)"        # 依赖条件(等 1001 完成)
  -P projectA            # 项目组
  -m "compute01 compute02"  # 指定运行节点
  sleep 100

每个参数用一张表说清楚

参数 含义 示例
-q 队列 -q normal
-n 申请的 CPU 槽位数 -n 8
-R 资源需求(后面细讲) -R "rusage[mem=8192]"
-J 作业名 -J build_kernel
-o stdout 输出文件 -o build.out
-e stderr 输出文件 -e build.err
-oo 输出文件(追加) -oo build.log
-W 运行时长上限 -W 1:30(1小时30分)
-cwd 工作目录 -cwd /data/build
-w 依赖条件 -w "done(1001)"
-m 指定主机 -m "compute01 compute02"
-u 通知邮箱 -u ops@example.com
-N 完成发邮件 -N
-P 项目归属 -P chipA

1.3 脚本里写 #BSUB 指令

推荐写法:把参数写进脚本,方便版本管理。

#!/bin/bash
#BSUB -q normal
#BSUB -n 4
#BSUB -R "rusage[mem=4096]"
#BSUB -J compile_job
#BSUB -o compile.out
#BSUB -e compile.err
#BSUB -W 2:00

echo "开始编译..."
cd /data/src
make -j4
echo "编译完成"

提交:

bsub < job.sh

1.4 交互式作业

有时需要登录到计算节点上调试(比如程序跑起来报奇怪的错):

# 申请一个交互式 shell
bsub -Is /bin/bash
# 系统会分配一个节点,你直接进入该节点的 shell

# 带参数的交互式
bsub -Is -n 2 -R "rusage[mem=2048]" /bin/bash
**调试神器**:程序在节点上跑才报错、本地复现不了时,用 `bsub -Is` 直接进节点排查。

二、bjobs:查看作业

2.1 基本用法

# 查看自己所有作业
bjobs
# JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
# 1001    lsf     RUN   normal     master      compute01   sleep 100  Jan 15 10:00
# 1002    lsf     PEND  normal     master      -           sleep 200  Jan 15 10:01

# 查看指定作业
bjobs 1001

# 查看所有用户的作业(管理员)
bjobs -u all

2.2 常用过滤参数

# 按状态过滤
bjobs -r       # 只看 RUN 状态
bjobs -p       # 只看 PEND 状态
bjobs -s       # 只看 SUSP 状态
bjobs -d       # 只看最近完成的(DONE/EXIT)

# 按用户
bjobs -u user1
bjobs -u all        # 所有用户
bjobs -u all -q high  # 所有用户 + high 队列

# 按队列
bjobs -q normal

# 按作业名
bjobs -J "build*"   # 通配符匹配

# 详细模式
bjobs -l 1001       # 长格式,显示所有细节
bjobs -w            # 宽格式(不换行)

2.3 长格式详解

bjobs -l 1001

输出的关键字段:

字段 含义
Job <1001> 作业 ID
User 提交用户
Project 项目
Queue 队列
Command 执行命令
CWD <...> 工作目录
PIDs 进程 ID
Execution Home 执行节点家目录
Submitted from host 从哪台机器提交的
Started at 开始时间
Run time 已运行时长
Cpu time 累计 CPU 时间
MEM: 当前内存使用

2.4 看 PEND 原因

bjobs -p 1002
# Job <1002>, User <lsf>, Project <default>, Status <PEND>
#  Waiting for scheduling: ...
#  Job is waiting for the following resources:
#     1 host with ncpus>=4 and mem>=8196

常见 PEND 原因

原因 说明
Not enough job slots 节点槽位跑满了
No eligible host 没有满足资源要求的节点
Queue job limit 队列上限到了
User job limit 用户作业上限到了
Pending for dependency 等依赖作业完成

三、bkill:杀掉作业

3.1 基本用法

# 杀掉单个作业
bkill 1001
# Job <1001> is being terminated

# 杀掉多个
bkill 1001 1002 1003

# 按作业名杀
bkill -J "build_*"

# 杀掉用户所有作业
bkill -u user1 0
# 0 表示所有作业

# 强制杀(杀不掉时用 -r,发 SIGKILL)
bkill -r 1001
**杀不掉的作业**:先试 `bkill`(发 SIGTERM,给进程清理时间),还不行再用 `bkill -r`(发 SIGKILL,强制结束)。

3.2 管理员操作

# 杀掉队列里所有作业
bkill -q normal 0

# 杀掉某节点上所有作业
bkill -m compute01 0

四、bstop / bresume:挂起与恢复

4.1 用户操作自己的作业

# 挂起(暂停)一个作业
bstop 1001
# Job <1001> is being stopped

# 恢复
bresume 1001
# Job <1001> is being resumed

4.2 什么时候用挂起

  • 节点负载太高,先暂停一些低优先级作业腾资源
  • 调试其他问题,不想让作业占着资源又不想杀掉(杀了重跑浪费时间)
  • 管理员临时抢占资源

4.3 三种挂起状态区别

状态 含义 触发方式
PSUSP 用户挂起 bstop(用户自己挂的)
USUSP 系统挂起(用户级) 管理员挂起
SSUSP 调度器挂起 调度器自动挂起(资源不足被抢占)

恢复都用 bresume

五、bpeek:实时看输出

作业正在跑,想知道跑到哪了:

# 看作业 stdout
bpeek 1001
# 显示作业到目前为止的 stdout 输出

# 持续跟踪(类似 tail -f)
bpeek -f 1001

# 看 stderr
bpeek -c 1001   # 不一定都支持,看版本
**调试图神器**:跑时间长的任务,用 `bpeek -f` 盯着看进度,不用等跑完。

六、bmod:修改作业参数

作业已经提交了,发现参数写错了,不想杀掉重跑——用 bmod 改。

6.1 常见修改

# 修改作业名
bmod -J new_name 1001

# 修改队列(PEND 状态的作业可以改队列)
bmod -q high 1001

# 修改运行时限
bmod -W 3:00 1001   # 改成 3 小时上限

# 修改资源需求
bmod -R "rusage[mem=8192]" 1001

# 修改输出文件
bmod -o new_output.log 1001

# 修改通知邮箱
bmod -u new@example.com 1001

6.2 什么能改什么不能改

可以改(PEND 状态) 可以改(RUN 状态) 不能改
作业名 -J 作业名 -J 提交命令
队列 -q 运行时限 -W(只能延长,不能缩短) -n 核数
资源需求 -R 输出文件 -o 执行节点
运行时限 -W 通知邮箱 -u -m 指定节点
输出文件 -o
依赖 -w
**注意**:RUN 状态的作业很多参数改不了,能改的也有限制(比如运行时限只能加不能减)。

七、bhist:查看历史

7.1 基本用法

# 看最近完成的作业
bhist 1001
# Job <1001>, User <lsf>, Project <default>, Command <sleep 100>
# Tue Jan 15 10:00:00: Submitted from host <master>, CWD <...>
# Tue Jan 15 10:00:01: Dispatched to 1 Hosts/Processors <compute01>
# Tue Jan 15 10:01:40: Done successfully.
#
# Summary of time in seconds spent in various states:
# JOBID   USER    JOB_NAME  PEND   PSUSP   RUN   USUSP   SSUSP   TOTAL
# 1001    lsf     sleep 100    1       0   100       0       0    101

7.2 常用参数

# 指定时间范围
bhist -b "2024:01:01:00:00" -e "2024:01:31:23:59" -u all

# 看最近 N 天
bhist -n 7 -u user1    # 最近 7 天

# 长格式(所有细节)
bhist -l 1001

# 看失败的作业
bhist -d -u user1     # -d 显示最近完成的,然后 grep EXIT

7.3 结合 bacct 看统计

# 看用户作业统计
bacct -u user1 -b "2024:01:01" -e "2024:01:31"
# 输出:提交数、完成数、失败数、总 CPU 时间等

八、其他常用命令

8.1 btop / bbot:调整排队顺序

# 把某个 PEND 作业移到最前面
btop 1002
# Job <1002> has been moved to top of queue

# 移到最后面
bbot 1002
管理员可以调整其他用户的,用户只能调自己的。

8.2 bjobs -sum:统计

bjobs -sum -u all
# 按用户统计各状态作业数

8.3 bchkpnt / brestart:检查点

# 给作业做检查点(需要应用支持 checkpoint)
bchkpnt 1001

# 从检查点恢复
brestart 1001
这个需要应用支持 BLCR 或应用自身的 checkpoint 机制,EDA 工具很多支持。

九、生产场景示例

场景 1:批量提交 100 个任务

for i in $(seq 1 100); do
    bsub -J "task_$i" -o "task_$i.out" "echo task $i; sleep 10"
done

# 查看全部
bjobs -J "task_*"

场景 2:跑一个大作业,完成发邮件

bsub -q normal -n 8 -R "rusage[mem=8192]" \
  -J big_simulation \
  -o sim.out -e sim.err \
  -N -u engineer@example.com \
  "./run_simulation.sh input_$i.dat"

场景 3:交互式调试

# 本地跑正常,集群上跑就崩 → 进节点调试
bsub -Is -n 2 -R "rusage[mem=4096]" -m compute01 /bin/bash
# 进去后手动跑命令,看报错

场景 4:批量杀失败的作业

# 杀掉所有 EXIT 状态的自己的作业
bkill $(bjobs -d | grep EXIT | awk '{print $1}')

场景 5:看昨天谁用的 CPU 最多

bacct -u all -b "2024:01:14:00:00" -e "2024:01:14:23:59" | sort -k1

十、速查表

一张表记住所有常用命令:

操作 命令
提交作业 bsub commandbsub < script.sh
看自己的作业 bjobs
看所有作业 bjobs -u all
看 PEND 原因 bjobs -p
看详细信息 bjobs -l
杀作业 bkill
强制杀 bkill -r
挂起 bstop
恢复 bresume
看实时输出 bpeek -f
改参数 bmod -J new_name
看历史 bhist
提到队首 btop
扔到队尾 bbot

十一、写在最后

作业管理是 OpenLava 最常用的功能。日常开发用 bsub / bjobs / bkill 三件套基本够了,做运维再加上 bmod / bhist / btop 这些。

下一篇我们讲队列与资源管理:怎么配置队列、怎么定义和使用自定义资源(GPU、license 等)、资源限制、优先级策略。学完你就能根据业务需求灵活规划集群了。


你最喜欢用哪个命令?最常用的参数是什么? 评论区聊聊。

OpenLava #LSF #作业调度 #bsub #bjobs #HPC #运维

发表回复

后才能评论